Вот мой лучший ответ на исходный вопрос:
Попробуй это:
/* 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)
Я почти уверен (из памяти), что индексы в вычисляемых, постоянных столбцах приносят пользу с точки зрения производительности - я думаю, вам просто нужно попробовать/проверить свои собственные конкретные варианты использования.
(Надеюсь, я помог!)
person
dunxz
schedule
24.07.2013