SQL Server - 为什么这个查询需要这么长时间?

时间:2014-02-27 14:58:15

标签: sql sql-server

WITH Hierachy 
   ( 
      jobmst_id,  
      jobdep_jobmst,  
      Level 
   ) as  
   (  
   SELECT jobmst_id as dependency,  
      jobdep_jobmst as jobmst_id,  
      0 as Level  
   FROM jobdep m  
   WHERE (m.jobmst_id = '53047') -- insert parameter here

   UNION ALL  
   SELECT m.jobmst_id,  
      m.jobdep_jobmst,  
      ch.Level + 1  
   FROM jobdep m  
   INNER JOIN Hierachy ch  
   ON m.jobmst_id = ch.jobdep_jobmst  
   )  
SELECT jobmst_id AS jobmst_id,  
   jobdep_jobmst AS dependency  
FROM Hierachy  
WHERE Level > 0  
AND Level < 5

我对它进行了估计执行,并进行了几次聚簇索引扫描,每次扫描占40%以上。有没有更好的方法来编写此查询?

我基本上想从主人(53047)获得一个层次结构,但只有5个级别。

目前执行大约需要4分钟。

2 个答案:

答案 0 :(得分:0)

基本上你需要jobdep.jobmst_id上的索引。

如果你有它们,你应该在计划索引中看到这两个指数。如果您拥有它们并且没有看到它们的搜索,那么您可能会遇到统计问题。因此,重建统计数据或在2个表格上添加搜索提示。

答案 1 :(得分:0)

性能问题可能非常棘手,但是使用可用信息,如果在两列上创建索引,它将提高效率,因为sql server不需要从磁盘读取表数据页。基本语法如下:

CREATE INDEX jobdep_hierachy ON (jobmst_id, jobdep_jobmst);

请注意,列的顺序不重要:要搜索的列必须首先出现在索引中。