Насколько эффективна функция ГОД (дата)? - PullRequest
2 голосов
/ 24 октября 2011

Мне нужно найти таблицу с миллионами записей для всех записей, где

YEAR(ACTIVITYDATE) = some integer

Я могу добавить индекс над ACTIVITYDATE, а затем применить функцию YEAR к моему фильтру.

ОднакоРазве мне не лучше хранить вычисляемый столбец ACTIVITYYEAR, который сохраняется там, где столбец определен как YEAR (ACTIVITY) и имеет индекс с ACTIVITYYEAR?

Я знаю, что если нет достаточных различных значенийпо индексируемому столбцу в таблице SQL все равно выполнит сканирование таблицы.У меня пока недостаточно данных для выполнения тестов, и я пытаюсь определить макет таблицы настолько, насколько смогу.

Ваши мысли?

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Нет необходимости иметь вычисляемый столбец для «поиска в таблице» строк, соответствующих одному году. Напишите вам предложение where, используя вместо этого интервал, и укажите индекс в столбце даты.

select SomeColumn
from YourTable
where ActivityDate >= '20110101' and
      ActivityDate < '20120101'

Если вы хотите использовать int (год) в качестве аргумента запроса вместо двух строк, вы можете использовать dateadd. Просто убедитесь, что вы не применяете никаких функций / манипуляций к столбцу ActivityDate, потому что SQL Server не сможет использовать индекс, если вы это сделаете.

declare @Year int = 2011

select SomeColumn
from YourTable
where ActivityDate >= dateadd(year, @Year-1900, 0) and
      ActivityDate < dateadd(year, @Year-1899, 0)      
1 голос
/ 24 октября 2011

Для производительности лучше использовать вычисляемый столбец, а затем индексировать его.

1 голос
/ 24 октября 2011

Создайте вычисляемый столбец на ACTIVITYDATE и затем индексируйте его:

create table aTest
(
   id int not null,
   activityDate datetime null, 
   computedYear as YEAR(activityDate)
)

create nonclustered index NC_TEST on aTest(computedYear)
GO

insert into aTest (id, activityDate) VALUES (1, '2011/010/18')
insert into aTest (id, activityDate) VALUES (2, '2011/010/06')
insert into aTest (id, activityDate) VALUES (3, '2011/010/23')

Ссылка: Создание индексов для вычисляемых столбцов

Если у вас мало разных дат, то вы также можете создать отфильтрованный индекс , чтобы сделать его более вероятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...