Не знаю, как создать быстрый запрос - PullRequest
0 голосов
/ 13 сентября 2011

Я уже задавал подобный вопрос вчера. ( Вопрос )
Но после настройки запроса - производительность действительно низкая.

Положение

Положение таблицы (количество: 800'000)

Id    Number Leafnode From To   VersionId
-- --------- -------- ---- ---- ---------
 1 100200300        0 NULL NULL        33
 2 100200301        1 NULL NULL        34
 3 100200302        1    5   10        34
 ...

Переменная таблицы (количество: 1'300'000)

Id Number PositionId
-- ------ ----------
 1     01          2
 2     01          3
 3     02          3
 4     03          3
 ....

Таблица VariableText (Количество: 1'300'000)

Id Language       Text VariableId
-- -------- ---------- ----------
 1        1      Hello          1
 2        2      Hallo          1
 3        3      Salut          1
 4        1        Bye          2
 5        2     Tschau          2
 ...


Я ищу запрос с хорошей производительностью (просмотр, хранимые процедуры, пользовательские функции). Из моего приложения я бы хотел использовать запрос вроде:
SELECT Id, Number, Text, Variable
FROM <whatever>
WHERE Language = 2 AND Version = 34 AND Number IN (100200301, 100200305)

И результат будет:

Id     Number   Text Variable
--  --------- ------ --------
 2  100200301  Hallo      01
 3  100200305 Tschau      01
...


UPDATE Я загрузил резервную копию базы данных, которая содержит эти три таблицы, описанные выше. ( Резервное копирование )
Я использовал следующий запрос, чтобы получить только «число» и «идентификатор» из таблицы позиций. Никаких объединений и других вещей. И этот запрос занимает около 8 минут.
WITH C AS 
(
    SELECT T.Id, CAST(Number AS int) AS Nr, Version
    FROM Position AS T
    WHERE Leafnode = 1

    UNION ALL

    SELECT T.Id, Nr + 1 AS Expr1, T.[Version]
    FROM dbo.Position AS T 
    INNER JOIN C ON C.Id = T.Id AND T.[To] > CAST(STUFF(Nr, 1, 6, '') AS int)
)

SELECT Id, Nr, [Version]
FROM C
WHERE Version = 34 AND Nr = '241521123'
OPTION (maxrecursion 0)

Ответы [ 5 ]

1 голос
/ 13 сентября 2011

Производительность запросов можно улучшить, создав правильные индексы (кластеризованные / некластеризованные / составные / ...) в правильных столбцах.

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

Индексы по столбцам, по которым вы выполняете поиск, сортируете и объединяете, могут быть кандидатами в индексы.

0 голосов
/ 13 сентября 2011

Это, вероятно, вызывает проблему

INNER JOIN C ON C.Id = T.Id AND T.[To] > CAST(STUFF(Nr, 1, 6, '') AS int)

Удаление первых 6 цифр из номера не является SARGable и, вероятно, вызывает некоторые проблемы.

Есть несколько способов справиться с этим, но, вероятно, наиболее целесообразным будет создать индекс для вычисляемого столбца , где вычисляемый столбец равен STUFF(Number, 1, 6, '')

Для этого требуется SQL Server 2005 или более поздняя версия (примечание ! = )

0 голосов
/ 13 сентября 2011

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

0 голосов
/ 13 сентября 2011

Вы можете включить статистику производительности для запроса, используя SET STATISTICS PROFILE ON.Это покажет каждую часть запроса и сколько времени это займет, что должно дать вам представление о том, что замедляет его.

Я подозреваю, что вы используете оператор IN.Вы можете изменить на ГДЕ (номер = 100200301 ИЛИ номер = 100200305)

http://wraithnath.blogspot.com/2011/01/getting-performance-data-from-sql.html

0 голосов
/ 13 сентября 2011

Возможно, вы захотите добавить некоторые индексы в столбцы Language, Version и Number

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