Я уже задавал подобный вопрос вчера. ( Вопрос )
Но после настройки запроса - производительность действительно низкая.
Положение
Положение таблицы (количество: 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)