Индекс SQL Server для курсоров - PullRequest
       10

Индекс SQL Server для курсоров

0 голосов
/ 15 сентября 2009

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

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

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

Запросы курсора просты и выглядят как

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4

(Таблица содержит около 1М строк. Иногда также есть одиночное левое соединение)

Если я запускаю запрос непосредственно в SSMS, это занимает менее секунды, но когда он запускается из приложения в курсоре, для извлечения первой строки может потребоваться 30 секунд (проверено с помощью sql-trace).

Поля в предложениях WHERE и ORDER BY индексируются отдельно.

Полагаю, комбинированный индекс для field1, field2, field3, field4 сделает это быстрее. Есть ли способ ускорить его без создания индекса для каждой комбинации и порядка полей?

(Просто повторюсь: я не имею никакого влияния на то, как приложение обращается к базе данных. Производительность может быть настроена только через индекс)

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

Одна вещь, которую я всегда делаю (если возможно), запускаю помощника по настройке БД.

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

И после этого вы можете решить реализовать некоторые из предложений или нет. И даже если вы сделали все возможное в дизайне - такая проверка смотрит на то, что действительно происходит (не всегда предсказуемо), и, возможно, вы забудете некоторую статистику, или другой индекс может помочь ...

0 голосов
/ 15 сентября 2009

Я бы изменил запрос, чтобы использовать фактические имена столбцов, а не SELECT *, а затем создал бы индекс покрытия для field1 = 1 и field2 = 2. Если возможно, я бы поместил кластерный индекс в field3 и field4.

Если вы используете SQL 2005+, попробуйте взглянуть на CTE вместо курсора или изменить свой запрос на использование временных таблиц.

...