Sql 如何使用case语句优化左外连接?

Sql 如何使用case语句优化左外连接?,sql,sql-server,optimization,left-join,case,Sql,Sql Server,Optimization,Left Join,Case,我有两个名为genproductstoreindex和QAT_ListElid2的表。我已经加入了左外连接,但它需要很长时间才能执行 SELECT genproductstoreindex.[ElID] ,CASE WHEN QAT_ListElid2.LeftTSMKEY IS NULL THEN genproductstoreindex.[TSMKEY] ELSE QAT_ListElid2.LeftTSMKEY + Righ

我有两个名为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

第一个查询看起来不错。您希望这些索引使其快速运行:

create index idx1 on genproductstoreindex(listelid);
create index idx2 on indexqat_listelid2(listelid, lefttsmkey);
如果RightsMKey是indexqat_ListLid2中的一列,则将其添加到第二个索引中


通过将查询中使用的所有列添加到相关索引,可以使这两个索引都覆盖。这将使它们更有可能被使用。如果您发现DBMS不使用其中一个,您可以很容易地再次删除它。

如果您提供创建表和插入脚本,这将非常有用。在第一次查询中使用where条件->where QAT_ListLid2.LeftsMkey为空。哪列属于哪一个表?您应该始终说明您的解决方案如何解决OP问题?谢谢。我们可以优化左外接头吗。左外连接正是您想要的,或者我理解。您希望显示所有genproductstoreindex并在可用的情况下加入QAT_ListLid2。你正是这样做的。查询很好,所以您所能做的就是1提供索引,2投资硬件,3限制您选择的数据。现在您正在选择所有genproductstoreindex。问问自己:这真的有必要吗?仅从表中选择某些数据是否足够?如果你需要全部,那么我不会改变你的问题。谢谢你的精彩解释。根据你的理解,这是正确的。我想从genproductstoreindex获取所有数据。只是我需要做一些评论。
create index idx1 on genproductstoreindex(listelid);
create index idx2 on indexqat_listelid2(listelid, lefttsmkey);