Как оптимизировать левое внешнее соединение с помощью оператора case? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть две таблицы, называемые genproductstoreindex и QAT_ListElid2. Я присоединился к левому внешнему соединению, но его выполнение занимает очень много времени.

SELECT genproductstoreindex.[ElID]
    ,CASE 
        WHEN QAT_ListElid2.LeftTSMKEY IS NULL
            THEN genproductstoreindex.[TSMKEY]
        ELSE QAT_ListElid2.LeftTSMKEY + RightTSMKEY
        END
    ,[Numerical]
    ,[StringField]
    ,[DateField]
    ,[TableLevel]
    ,[TsmPath]
FROM genproductstoreindex
LEFT OUTER JOIN QAT_ListElid2 ON genproductstoreindex.ListElid = QAT_ListElid2.ListElid

Чтобы оптимизировать левое внешнее соединение с помощью оператора case, я заменил приведенный ниже код, но данные выглядят неверно. Пожалуйста, помогите мне в этом.

DECLARE @lefttsmkey NVARCHAR(30)

SET @lefttsmkey = NULL

IF @lefttsmkey IS NULL
BEGIN
    SELECT genproductstoreindex.[ElID]
        ,genproductstoreindex.[TSMKEY]
        ,[Numerical]
        ,[StringField]
        ,[DateField]
        ,[TableLevel]
        ,[TsmPath]
    FROM genproductstoreindex
    LEFT OUTER JOIN QAT_ListElid2 ON genproductstoreindex.ListElid = QAT_ListElid2.ListElid
END
ELSE
BEGIN
    SELECT genproductstoreindex.[ElID]
        ,QAT_ListElid2.LeftTSMKEY + RightTSMKEY AS [TSMKEY]
        ,[Numerical]
        ,[StringField]
        ,[DateField]
        ,[TableLevel]
        ,[TsmPath]
    FROM genproductstoreindex
    LEFT OUTER JOIN QAT_ListElid2 ON genproductstoreindex.ListElid = QAT_ListElid2.ListElid
END

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Первый запрос выглядит нормально. Вы хотите, чтобы эти индексы работали быстро:

create index idx1 on genproductstoreindex(listelid);
create index idx2 on indexqat_listelid2(listelid, lefttsmkey);

Если RightTSMKEY является столбцом в indexqat_listelid2, то добавьте его во второй индекс.

Вы можете сделать оба эти покрытие индексов путем добавления всех столбцов, используемых в запросе, к связанному индексу. Это сделает их еще более вероятными для использования. (Если вы обнаружите, что СУБД не использует ни того, ни другого, вы все равно можете легко ее отбросить.)

1 голос
/ 04 февраля 2020
SELECT genproductstoreindex.[ElID]
    ,genproductstoreindex.[TSMKEY]
    ,[Numerical]
    ,[StringField]
    ,[DateField]
    ,[TableLevel]
    ,[TsmPath]
FROM genproductstoreindex with (nolock)
LEFT OUTER JOIN QAT_ListElid2 with (nolock) ON genproductstoreindex.ListElid = QAT_ListElid2.ListElid
where QAT_ListElid2.LeftTSMKEY IS NULL
UNION
SELECT genproductstoreindex.[ElID]
    ,QAT_ListElid2.LeftTSMKEY + RightTSMKEY AS [TSMKEY]
    ,[Numerical]
    ,[StringField]
    ,[DateField]
    ,[TableLevel]
    ,[TsmPath]
FROM genproductstoreindex with (nolock)
LEFT OUTER JOIN QAT_ListElid2 with (nolock) ON genproductstoreindex.ListElid = QAT_ListElid2.ListElid
where QAT_ListElid2.LeftTSMKEY IS NOT NULL
...