Sql server TSQL优化

Sql server TSQL优化,sql-server,tsql,sql-server-2005,query-optimization,Sql Server,Tsql,Sql Server 2005,Query Optimization,我有下面的查询,由于两个表中有大量的行(每个行超过100万行),执行该查询需要2秒钟,我想知道我是否可以进一步优化查询 表格 tblInspection.ID bigint(主键) tblInspection.IsPassedFirstTime位(非聚集索引) tblInspectionFailures.ID bigint(主键) tblInspectionFailures.InspectionID bigint(非聚集索引) 查询 SELECT TOP 1 tblInspection.ID F

我有下面的查询,由于两个表中有大量的行(每个行超过100万行),执行该查询需要2秒钟,我想知道我是否可以进一步优化查询

表格

tblInspection.ID bigint(主键)

tblInspection.IsPassedFirstTime位(非聚集索引)

tblInspectionFailures.ID bigint(主键)

tblInspectionFailures.InspectionID bigint(非聚集索引)

查询

SELECT TOP 1 tblInspection.ID FROM tblInspection 
                INNER JOIN tblInspectionFailures ON tblInspection.ID = tblInspectionFailures.InspectionID 
                WHERE (tblInspection.IsPassedFirstTime = 1)
执行计划


我可以看到我正在对索引进行聚类搜索,但仍然需要一些时间,我唯一能想到的是

    SELECT  i.ID FROM 
    (select TOP 1 id from tblInspection 
     WHERE IsPassedFirstTime = 1) i
                    INNER JOIN tblInspectionFailures ON 
i.ID = tblInspectionFailures.InspectionID 
试一试


这基本上做了相同的事情,但告诉sql在第1行之后停止返回行,仍然是2秒,并且执行计划相同;-)好的,删除TOP会将执行计划更改为使用合并联接,并将执行时间降低到705毫秒。在最初的查询计划中,Top的成本为0%(尽管获取Top项必须花费一定的成本),但我不确定为什么会出现这种情况。你能解释一下吗?不,我解释不了。我认为在连接之前将第一个集合限制为1行会有所帮助。连接大型表的速度很慢,在连接之前限制它们会使用较少的资源。
TOP
没有
ORDER BY
?语义是什么?它是IF EXISTS()查询的一部分。我正在检查是否存在任何记录,然后处理结果。移除顶部会提高性能,但我不明白为什么。通过百分比的方式,tblInspection有多少IsPassedFirstTime=1?无论哪种方式,您都可以尝试在此查询上创建一个索引视图,接受这样会减慢符合条件的DML操作。我的猜测是,
TOP 1
迫使它实际选择一条记录,而乐观主义者理解
的存在(选择*
习惯用法意味着“有记录吗?”并且实际上没有选择一个。我认为。我猜顶部意味着隐藏排序,以便在基础数据不变的情况下,结果集总是相同的。我敢打赌完整的存在(select*子句应该提供更快的结果确保将行数设回0,以在以后返回完整的查询
SET ROWCOUNT 1

SELECT tblInspection.ID FROM tblInspection 
            INNER JOIN tblInspectionFailures ON tblInspection.ID = tblInspectionFailures.InspectionID 
            WHERE (tblInspection.IsPassedFirstTime = 1)