SQL-запрос с производной таблицей - проблема производительности - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть SQL-запрос, который содержит удаленную таблицу.

Производный запрос выглядит примерно так:

SELECT 
   ObjectId, MIN(StatusHistoryId) AS FirstStatusHistoryId
FROM 
   dbo.StatusHistory
WHERE 
   ObjectType = 'SchemeTypeApplication' 
   AND (StatusId = 504 OR StatusId = 501) 
   AND IsDeleted = 0    
GROUP BY 
   ObjectId

Это займет около 2 минут, сам по себе, он тянетназад почти 300 тысяч строк.Весь запрос (с этим внутри) занимает примерно столько же.Без производной таблицы это занимает менее секунды, поэтому я знаю, что причиной является проблема с обработанным запросом.

У меня вопрос: есть ли способ повысить скорость запроса к удаленной таблице?Может быть, добавить некоторые индексы в таблицу StatusHistory (я немного мусор с индексацией ...)?Или какой-то другой подход, кроме использования производной таблицы?

Любые предложения приветствуются.

Спасибо

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Как отметил Джон, расширьте индекс и получите ключевые элементы, основанные на том, что можно было бы считать наименьшей гранулярностью ожидаемых результатов, исходя из критериев WHERE ... Ваш "ObjectType", являющийся строкой, мог бы быть лучше оптимизирован, если бы он был больше перечислимое целочисленное значение, чем текст тоже. Что касается зернистости. Который вернул бы наименьшее количество записей ... идентификатор состояния, состоящий из 501 и 504, объединенных (через ваше условие ИЛИ) по сравнению с типом объекта "SchemeTypeApplication". Если у 501 есть 50 000 записей, у 504 есть 30 000 записей, но у «SchemeTypeApplication» есть 475 000 записей, я бы сначала поместил свой индекс по идентификатору статуса, в противном случае, наоборот ... Пусть индекс пройдет через 80 000 записей, и в этом, как многие из 475 000 типов объектов - 501 и 504, возможно, 50 000, и все готово. Да, ваш исходный комментарий относится к возвращению около 300 тыс. Строк, но это всего лишь пример определения метода оптимизации индекса, основанного на том, как обычно будут использоваться ваши запросы. Итак, я бы индексировал что-то вроде

(statusID, ObjectType, IsDeleted, ObjectID)

1 голос
/ 01 февраля 2012

См. Мой комментарий выше - вы также можете ввести индекс в поле StatusID, если его еще нет.Попробуйте поместить более строгие столбцы в предложение WHERE в порядке того, сколько записей может быть возвращено.

0 голосов
/ 01 февраля 2012

Если вы используете Management Studio 2008 (с базой данных 2008 или 2005 гг.), Вы можете просмотреть план выполнения, чтобы определить, рекомендует ли он какие-либо отсутствующие индексы, которые следует создать.

Я предполагаю, что он будетесть рекомендации для этого запроса.

Здесь есть несколько скриншотов: http://weblogs.sqlteam.com/mladenp/archive/2008/12/29/SQL-Server-Management-Studio-2008-suggests-missing-indexes-with-actual.aspx

...