寻找一些帮助提高此SQL查询的性能

Ama*_*son 1 sql performance sql-server-2008

我不是一个真正的大型TSSQL专家.我们有一个返回近200万条记录的查询.运行需要2.5分钟.我们已经添加了索引,并且削减了一分钟(过去需要3.5分钟才能运行),但2.5分钟仍然太慢.谁能告诉我如何修改此查询以提高其性能?我怀疑在"in"语句中会发生更改,并且计算"LOCATION"值的方式,但我不确定如何去做.

select distinct
A.ptid,
A.ptmgrx,
A.ptmgry,
A.fename,
B.fename XFENAME,
A.rt1 route,
A.pr,
A.mp,
A.rdbranch,
A.gs grade,
A.cs,
A.csmp,
A.cspath,
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdl) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyl) + ' County, ' +
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdr) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyr) + ' County' LOCATION
from intersectionApproaches A INNER JOIN intersectionApproaches B ON A.ptid = B.ptid
where A.ptid in 
(select distinct C.ptid from intersectionApproaches C, intersectionApproaches B
where C.ptid = B.ptid)
Run Code Online (Sandbox Code Playgroud)

编辑:数据库服务器是MS SQL Server 2008.我有执行计划,但似乎没有办法让它很容易看到.它将自己保存为.sqlplan文件.不确定这是否适用于其他任何人.但我可以提供一些信息.

29%的时间用于进行不同的排序.

15%的时间用于做"索引假脱机"(它做了三次不同的时间)

6%用于做"表盘"(只有一次)

8%做"排序"

回答JNK:原始查询是在存储过程中,并采用了一些限制结果集的参数.以下是包含这些参数的原始查询:

select distinct
A.ptid,
A.ptmgrx,
A.ptmgry,
A.fename,
B.fename XFENAME,
A.rt1 route,
A.pr,
A.mp,
A.rdbranch,
A.gs grade,
A.cs,
A.csmp,
A.cspath,
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdl) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyl) + ' County, ' +
(select distinct twpname from tamc.dbo.fipsmdot where fipscode = A.fmcdr) + '; ' +
(select distinct county from tamc.dbo.fipsmdot where fipsco = A.countyr) + ' County' LOCATION
from intersectionApproaches A INNER JOIN intersectionApproaches B ON A.ptid = B.ptid
where A.ptid in 
(select distinct C.ptid from intersectionApproaches C, intersectionApproaches B
where C.ptid = B.ptid
and (C.fename + isnull(' ' + C.fetype,'') like @str + '%' or @str in (C.rt1name, C.rt2name, C.rt3name)) and (B.fename + isnull(' ' + B.fetype,'') like @xstr + '%' or @xstr in (B.rt1name, B.rt2name, B.rt3name)))
Run Code Online (Sandbox Code Playgroud)

希望这有助于解释发生的事情.我删除了where子句的最后一部分,因为我试图获得未被这些参数过滤的结果集.我想把它移到一个视图中.

更多编辑:表格"IntersectionApproaches"是道路交叉点的方法表.例如,标准道路交叉口由4个方法组成(交叉路口的每一侧可以接近交叉路口).存储过程的最初目的是返回与特定街道名称对匹配的intersectionApproaches列表.

例如,你有"Main"和"1st",他们有一个交集.

这一个十字路口有四种交叉路口.

"主要和第一"

"第一和主要"

"第1和第1"

"主要和主要"

它们都共享相同的"PTID",即交叉ID.

但是,IntersectionApproaches表只有一个字段用于街道名称"FENAME".为了使记录完整,我们需要相应的跨街道的名称(因此查询中的"B.Fename XFENAME").这允许我们查询结果并说"让我所有的记录都有'Main'街和'1st'的街道." 此外,我们还需要填充由查询中的多个"select distinct"语句定义的"LOCATION"值,因为我们也可以对其进行过滤.

我试图将其设置为视图,而不是首先提供交叉街道以获得可管理的记录集,然后再在"位置"字段上进行过滤.当前的存储过程也没有帮助我进行分页或排序.我只想把它全部放到一个视图中,这样我就可以更自然地使用它了.

希望这可以帮助...

JNK*_*JNK 5

DISTINCT在你的代码中计算了六次.那太多了,太多了.

甚至没有看到你的数据,最后DISTINCTIN条款完全不需要. IN因为它短路,所以不关心子查询中是否有欺骗.

看起来您的子查询也可以全部替换为JOIN.

现在你fipsmdot从主表每行查询五次.

你也有一个看起来完全没有INNER JOIN主表(自连接)的东西.

要获得更多详细信息,您需要发布一些示例数据,表格结构以及您想要获得的内容.