Почему CTE работает намного лучше, чем временные таблицы в хранилище данных Sql? - PullRequest
0 голосов
/ 11 декабря 2019

Я хочу выбрать данные из большой таблицы (около 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 намного лучше справляется с таким простым запросом, как этот?

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