SQl优化在哪里存在

SQl优化在哪里存在,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,正在查询的数据库包含数百万条记录——只是想知道下面的查询是否可以优化 SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId] FROM [Plan] AS [t0] WHERE EXISTS( SELECT NULL AS [EMPTY] FROM [Entry] AS [t1] WHERE ([t1].[PlanId] = ([t0].[id])) AND ([t1].[EntryMobile] = 1) AND (

正在查询的数据库包含数百万条记录——只是想知道下面的查询是否可以优化

SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId]
FROM [Plan] AS [t0]
WHERE EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [Entry] AS [t1]
    WHERE ([t1].[PlanId] = ([t0].[id])) 
    AND ([t1].[EntryMobile] = 1) AND (NOT ([t0].[Deleted] = 1)))

以下是另外两个输出与您相同的查询:

一,

二,

我怀疑2是他们中速度最快的,但不是很快


要进行测试,请在SQLServerManagementStudio中的单个SQL批处理中同时运行它们,并设置“包含实际执行计划”选项,然后比较执行计划以确定哪一个是最佳的。有时它会告诉你是否缺少索引。

你为什么要问,它运行得不好吗?列出的列是否都已正确索引?您是否检查了执行计划中的瓶颈?需要更多信息。可以使用索引优化零件的位置。若你们在t1上创建覆盖索引所有包含的字段——planid,entrymobile,那个么接下来最糟糕的部分将是COUNTDISTINCT。当然你也需要覆盖索引id,deleted,t0上的guserid。@HellBaby我不同意上面关于连接比exists语句快4K倍的说法。。。我很想看到一些证据证明notexists可能是最好的SQL。否则,速度应主要基于指标。我只想尝试一件事:将AND NOT[t0].[Deleted]=1条件从EXISTS中移出,优化器应该足够聪明来做这件事,当您检查计划时,它应该是相同的,但人们永远不会知道……在这种情况下,查看执行计划确实会发现连接速度更快
SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId]
    FROM [Plan] AS [t0]
        CROSS APPLY (SELECT TOP 1 1 X 
             FROM [Entry] AS [t1]
             WHERE [t1].[PlanId] = [t0].[id]
               AND [t1].[EntryMobile] = 1) t1
    WHERE [t0].[Deleted] <> 1
SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId]
    FROM [Plan] AS [t0]
    WHERE [t0].[Deleted] <> 1
        AND [t0].[id] IN (SELECT [PlanId]
             FROM [Entry] 
             WHERE [EntryMobile] = 1)