Я хочу выбрать данные из большой таблицы (около 1 миллиарда строк), которая соответствует идентификатору таблицы, созданной из входящих данных json.
Вот что я сделал сначала:
SELECT *
#JsonIds
FROM OPENJSON(CONVERT(VARCHAR(MAX), '[{"id": "18897126"},{"id": "710990568"},{"id": "610990568"},{"id": "510990568"}]'))
WITH (id BIGINT);
SELECT *
FROM #jsonIds j
INNER JOIN [schema].[myBigTable] t ON t.id = j.id
Это ужасно. Финиш занял почти 3 минуты!
После нескольких попыток я решил посмотреть, как будет работать CTE:
WITH JsonIds AS
(
SELECT *
FROM OPENJSON(CONVERT(VARCHAR(MAX), '[{"id": "18897126"},{"id": "710990568"},{"id": "610990568"},{"id": "510990568"}]'))
WITH (id BIGINT)
)
SELECT p.*
FROM [schema].[myBigTable] p
inner join JsonIds j on p.id = j.id
К моему удивлению, CTE пошел намного лучше. Это заняло меньше секунды.
Почему CTE намного лучше справляется с таким простым запросом, как этот?