2012-01-27 3 views
0

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

Это как мой текущий запрос выглядит

SELECT TOP(25) [t].[EId], 
       [t].[DateCreated], 
       [t].[Message] 
FROM [dbo].[tblEvent] AS [t] 
WHERE ([t].[DateCreated] >= Dateadd(DAY, Datediff(DAY, 0, Getdate()) - 7, 0) 
     AND [t].[EId] = 1) 
ORDER BY [t].[DateCreated] DESC 

Теперь у меня нет никаких индексов, работающих по этой таблице и не намерены иметь один. Этот запрос занимает около 10-15 секунд для запуска, а время ожидания моих приложений теперь есть способ улучшить его?

+6

Почему вам не нужен указатель на столе? –

+0

Ну, это клиентский звонок, и они не хотят индексов, я больше не спорю с ними об этом! – Vivek

+5

THEN сказать им жить с ним или получить более быструю дисковую подсистему. Точка. Когда клиенты сталкиваются с реальностью, реальность выигрывает и не заботится о бредовых клиентах. Существует не так много оптимизаций, которые вы можете сделать на уровне Sql, не избавляясь от IO сканируемой таблицы, которую вы принудительно выполняете. – TomTom

ответ

3

Если у вас есть идентификатор в таблице, который является автоинкрементным (а не Eid, а отдельный PK), вы можете заказать по ID desc вместо DateCreated, что может сделать ваш заказ быстрее.

в противном случае вам нужен индекс (но в вашем вопросе говорится, что вы этого не хотите).

+0

Это не без индекса - все еще сканирование полного стола. – TomTom

+0

Ну, вы правы - я неявно интерпретировал вопрос как «никаких дополнительных индексов» для кластеризованного индекса на PK – Pleun

4

Вы должны создать индекс на EId, DateCreated или, по крайней мере, DateCreated

Без этого единственного пути оптимизации этого, что я могу думать о том, чтобы сохранить в отдельной таблице 25 последних через insert триггер (и, возможно, update и delete триггеры).

2

Если таблица не содержит индексов для поддержки запроса, вы будете вынуждены выполнять сканирование таблицы.

Вы собираетесь изо всех сил обойти аспект обзора таблицы - и по мере роста таблицы время отклика будет замедляться.

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

0

Вы должны также попытаться подсказку запроса: http://msdn.microsoft.com/en-us/library/ms181714.aspx

С опцией FAST n - количество строк.

+0

Это не поможет. Без каких-либо индексов SQL Server должен будет сканировать все 4 миллиона строк, чтобы оценить предикат '[EId] = 1' и сделать сортировку« TOP N ». –

Смежные вопросы