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分钟。
答案 0 :(得分:0)
基本上你需要jobdep.jobmst_id上的索引。
如果你有它们,你应该在计划索引中看到这两个指数。如果您拥有它们并且没有看到它们的搜索,那么您可能会遇到统计问题。因此,重建统计数据或在2个表格上添加搜索提示。
答案 1 :(得分:0)
性能问题可能非常棘手,但是使用可用信息,如果在两列上创建索引,它将提高效率,因为sql server不需要从磁盘读取表数据页。基本语法如下:
CREATE INDEX jobdep_hierachy ON (jobmst_id, jobdep_jobmst);
请注意,列的顺序不重要:要搜索的列必须首先出现在索引中。