Dưới đây là câu trả lời hết sức để trả lời câu hỏi ban đầu:
Hãy thử điều này:
/* create a deterministic schema bound function */
CREATE FUNCTION FloorDate(@dt datetime)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(datetime, FLOOR(CONVERT(float, @dt)))
END
GO
Để kiểm tra, hãy thử những điều sau đây. Xin lưu ý việc sử dụng các "cứ khăng khăng" cho cột tính toán và sử dụng các [dbo.] Khi đề cập đến chức năng
/*create a test table */
CREATE TABLE [dbo].[TableTestFloorDate](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TestDate] [datetime] NOT NULL,
[TestFloorDate] AS ([dbo].[FloorDate]([TestDate])) PERSISTED,
CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Bây giờ bạn có thể thêm một chỉ mục trên cột tính (nhưng xem Gotcha sau)
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate)
Chèn một số dữ liệu ngẫu nhiên nhiều lần như bạn muốn nhưng nhiều hơn (1000) là tốt hơn nếu bạn muốn kiểm tra việc sử dụng chỉ số/thực hiện kế hoạch
INSERT INTO TableTestFloorDate (TestDate) VALUES(convert(datetime, RAND()*50000))
Lấy kết quả
SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'
Bây giờ đây là GOTCHA ... Chỉ mục đã được tạo trên cột được tính không được sử dụng! Thay vào đó, ngay cả khi chọn dữ liệu trên trường tồn tại TestFloorDate, SQLServer (hoặc ít nhất là phiên bản của tôi) thích một chỉ mục trên TestDate.
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate)
Tôi khá chắc chắn (từ bộ nhớ) mà chỉ số về tính toán, vẫn kiên trì cột là lợi ích từ góc độ hiệu suất - Tôi đoán bạn sẽ chỉ phải thử/kiểm tra cho tập quán cụ thể của riêng bạn
(Hy vọng tôi đã giúp!)
Có. Nhưng lỗi từ đâu đến? – Tomalak
getDate là không xác định Tôi tin rằng đó sẽ là lý do – kristof
Vâng đó là lý do tại sao! –