Как улучшить производительность запросов - PullRequest
2 голосов
/ 29 июля 2011

У меня много записей в таблице. Когда я выполняю следующий запрос, это занимает много времени. Как я могу улучшить производительность?

SET ROWCOUNT 10
SELECT StxnID
      ,Sprovider.description as SProvider
      ,txnID
      ,Request
      ,Raw
      ,Status
      ,txnBal
      ,Stxn.CreatedBy
      ,Stxn.CreatedOn
      ,Stxn.ModifiedBy
      ,Stxn.ModifiedOn
      ,Stxn.isDeleted
  FROM Stxn,Sprovider
  WHERE Stxn.SproviderID = SProvider.Sproviderid
  AND Stxn.SProviderid = ISNULL(@pSProviderID,Stxn.SProviderid)
  AND Stxn.status = ISNULL(@pStatus,Stxn.status)
  AND Stxn.CreatedOn BETWEEN ISNULL(@pStartDate,getdate()-1) and  ISNULL(@pEndDate,getdate())
  AND Stxn.CreatedBy = ISNULL(@pSellerId,Stxn.CreatedBy)  
  ORDER BY StxnID DESC

Таблица stxn содержит более 100 000 записей.

Запрос запускается из средства просмотра отчетов в asp.net c #.

Ответы [ 7 ]

4 голосов
/ 29 июля 2011

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

http://www.sommarskog.se/dyn-search-2008.html

Самая большая проблема с вашимзапрос - это синтаксис column=ISNULL(@column, column).MSSQL не будет использовать индекс для этого.Попробуйте изменить его на (column = @column AND @column IS NOT NULL)

3 голосов
/ 29 июля 2011

Есть много вещей, которые могут повлиять на производительность запроса. Хотя 100 тысяч записей на самом деле не так много.

Элементы для рассмотрения (в произвольном порядке)

Аппаратное обеспечение:

  1. Ограничена ли память SQL Server? Другими словами, достаточно ли оперативной памяти для выполнения своей работы? Если он подменяет память на диск, то это верный признак того, что вам нужно обновление.
  2. Ограничен ли диск машины. Другими словами, достаточно ли быстры диски для выполнения запросов, которые вам нужно выполнить? Если память ограничена, то скорость диска становится большим фактором.
  3. Ограничен ли процессор машины? Например, когда вы выполняете запрос, происходит ли скачок процессора в течение длительного времени? Или уже запущено много других запросов, которые отбирают у вас ресурсы ...

Структура базы данных:

  1. У вас есть индексы для столбцов, используемых в предложении where? Если у таблиц нет индексов, тогда придется выполнить полное сканирование обеих таблиц, чтобы определить, какие записи соответствуют.
  2. Устранить вызовы функции ISNULL. Если это прямой запрос, попросите вызывающий код проверить параметры и установить значения по умолчанию перед выполнением. Если это в хранимой процедуре, выполните проверки в верхней части s'proc. Если вы не выполняете это с RECOMPILE, который выполняет анализ параметров, эти функции должны будут оцениваться для каждой строки.

Сеть:

  1. Медленная сеть между вами и сервером? В зависимости от объема извлеченных данных вы можете перетаскивать ГБ данных по проводам. Я не уверен, что хранится в «сырой» колонке. Первый вопрос, который вам нужно задать, это «сколько данных возвращается клиенту?» Например, если каждая запись имеет размер более 1 МБ, то, вероятно, будут задействованы ограничения диска и сети.

Общие сведения:

  1. Я не уверен, что означает "медленный" в вашем вопросе. Означает ли это, что на обработку запроса уходит около 1 секунды или же это занимает 5 минут? Здесь все относительно.

По сути, невозможно дать точный ответ без множества заданных вами вопросов. Все это подтвердится, если вы профилируете запросы, поймете, что и сколько нужно вернуть клиенту, и будете наблюдать за взаимодействиями между различными частями.

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

3 голосов
/ 29 июля 2011

Для одного, используйте SELECT TOP () вместо SET ROWCOUNT - у оптимизатора будет гораздо больше шансов на это.Другое предложение состоит в том, чтобы использовать правильное внутреннее соединение вместо того, чтобы потенциально заканчиваться декартовым произведением, использующим таблицу старого стиля, синтаксис объединения таблиц (здесь это не так, но со старым синтаксисом это может произойти гораздо проще).Должно быть:

...
FROM Stxn INNER JOIN Sprovider
  ON Stxn.SproviderID = SProvider.Sproviderid
...

И если вы считаете, что 100К строк много, или что этот объем является причиной замедления, вы сильно ошибаетесь.Скорее всего, у вас есть действительно плохие стратегии индексации, возможно, какой-то анализ параметров, возможно, некоторые неявные преобразования ... трудно сказать, не понимая типы данных, индексы и не видя план.

3 голосов
/ 29 июля 2011

Вы должны рассмотреть возможность использования плана выполнения и искать недостающие индексы. Кроме того, сколько времени требуется, чтобы выполнить? Что у тебя медленно?

Может быть, вы не могли бы также вернуть столько строк, но это только предположение. На самом деле нам нужно увидеть вашу таблицу и индексы плюс план выполнения.

Проверка sql-tuning-tutorial

0 голосов
/ 29 июля 2011

Что следует учесть: когда ROWCOUNT или TOP используются с предложением ORDER BY, сначала создается и сортируется весь набор результатов, а затем возвращаются первые 10 результатов.

Как это работает без предложения Order By?

0 голосов
/ 29 июля 2011

Я не вижу многого, что можно сделать с самим запросом, но я вижу, как на схеме выполняются действия:

  • Создание индекса / PK для Stxn.SproviderID
  • Создание индекса / PK для SProvider.Sproviderid
  • Создание индексов по состоянию, CreatedOn, CreatedBy, StxnID
0 голосов
/ 29 июля 2011

Убедитесь, что все индексы Stxn.SproviderID, Stxn.status, Stxn.CreatedOn, Stxn.CreatedBy, Stxn.StxnID и SProvider.Sproviderid определены.

(Примечание: вам могут не понадобиться все, ноэто не повредит.)

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