簡體   English   中英

如何用case語句優化左外連接?

[英]How to optimize the left outer join with the case statement?

我有兩個名為 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 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

第一個查詢看起來不錯。 您希望這些索引能夠快速運行:

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

如果RightTSMKEYRightTSMKEY中的一列, indexqat_listelid2其添加到第二個索引中。

您可以通過將查詢中使用的所有列添加到相關索引來覆蓋這兩個索引。 這將使它們更有可能被使用。 (如果您發現 DBMS 不使用其中一個,則無論如何您都可以輕松地再次刪除它。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM