STRING_SPLIT на INNER JOIN принимает разные индексы и низкую производительность - PullRequest
0 голосов
/ 04 августа 2020

У меня есть запрос с использованием STRING_SPLIT для INNER JOIN, и он выглядит по-разному в зависимости от того, как я присоединяюсь.

ПРИМЕР 1 (11 секунд - 161K строк)

DECLARE @SucursalFisicaIDs AS TABLE (value int)
INSERT INTO @SucursalFisicaIDs
    SELECT value FROM STRING_SPLIT('16531,16532,16533,16534,16536,16537,16538,16539,16541,16543,16591,16620,17071',',')

SELECT ArticuloID, SUM(Existencias) AS Existencias 
FROM ArticulosExistenciasSucursales_VIEW WITH (NOEXPAND)
    INNER JOIN @SucursalFisicaIDs AS SucursalFisicaIDs ON SucursalFisicaIDs.value  = ArticulosExistenciasSucursales_VIEW.SucursalFisicaID 
GROUP BY ArticuloID

enter image description here

EXAMPLE 2 (2 seconds - 161K rows)

SELECT ArticuloID, SUM(Existencias) AS Existencias 
FROM ArticulosExistenciasSucursales_VIEW WITH (NOEXPAND)
WHERE SucursalFisicaID NOT IN (16531,16532,16533,16534,16536,16537,16538,16539,16541,16543,16591,16620,17071)                                   
GROUP BY ArticuloID

enter image description here

Both Queries read from the view (it is indexed).

EXAMPLE 3 (3 seconds - 161K rows)

SELECT ArticuloID, SUM(Existencias) AS Existencias 
FROM ArticulosExistenciasSucursales_VIEW WITH (NOEXPAND)
INNER JOIN STRING_SPLIT('16531,16532,16533,16534,16536,16537,16538,16539,16541,16543,16591,16620,17071',',') AS SucursalFisicaIDs ON SucursalFisicaIDs.value = ArticulosExistenciasSucursales_VIEW.SucursalFisicaID 
GROUP BY ArticuloID

enter image description here

EXAMPLE 4 (6 seconds - 161K rows)

DECLARE @SucursalFisicaIDs AS TABLE (value int)
INSERT INTO @SucursalFisicaIDs
    SELECT value FROM STRING_SPLIT('16531,16532,16533,16534,16536,16537,16538,16539,16541,16543,16591,16620,17071',',')

SELECT ArticuloID, SUM(Existencias) AS Existencias 
FROM ArticulosExistenciasSucursales_VIEW WITH (NOEXPAND)
WHERE SucursalFisicaID NOT IN (Select Value  From @SucursalFisicaIDs)
GROUP BY ArticuloID

введите описание изображения здесь

Кто-нибудь может мне сказать, почему не работает первый пример? Он должен быть таким же и лучше других. Что-нибудь о типах, которые я должен сделать? Обратите внимание, что в примере 4 таблица просматривает SucursalFisicaIDs Table, количество строк. (3M ???)

С уважением

...