元の質問に答える私の最良の答えは次のとおりです。
これを試して:
/* 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
テストするには、次のことを試してください。関数を参照するときは、計算列に「PERSISTED」を使用し、[dbo.] を使用することに注意してください。
/*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)
)
これで、計算列にインデックスを追加できるはずです (ただし、後で注意点を参照してください)。
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate)
ランダムなデータを何度でも挿入できますが、インデックスの使用/実行計画をテストする場合は、より多く (1000 以上) 挿入することをお勧めします
INSERT INTO TableTestFloorDate (TestDate) VALUES( convert(datetime, RAND()*50000))
結果を得る
SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'
ここに問題があります...計算列で作成されたインデックスは使用されません! 代わりに、永続化されたフィールド TestFloorDate でデータを選択する場合でも、SQLServer (または少なくとも私のバージョン) は TestDate のインデックスを優先します。
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate)
計算された永続化された列のインデックスがパフォーマンスの観点からメリットがあることは(記憶から)確信しています-独自の特定の使用法を試してテストする必要があるだけだと思います
(お役に立てば幸いです!)