Tsql SQL左连接和求和()速度慢

Tsql SQL左连接和求和()速度慢,tsql,sum,left-join,Tsql,Sum,Left Join,我正在运行一个查询以计算对象的总长度。 对象由几个较小的段(来自不同的表)组成。 为每个对象运行带有单个段的查询效果很好,但是添加更多段的负载会变得非常缓慢。(3000个对象和9000个段) 以下是我查询的相关部分: SELECT t1.ObjectID, SUM(SegmentLength) AS TotalLength FROM Objects t1 LEFT JOIN Segment t2 ON t1.ObjectID=t2.ObjectID AND

我正在运行一个查询以计算对象的总长度。 对象由几个较小的段(来自不同的表)组成。 为每个对象运行带有单个段的查询效果很好,但是添加更多段的负载会变得非常缓慢。(3000个对象和9000个段)

以下是我查询的相关部分:

SELECT
    t1.ObjectID,
    SUM(SegmentLength) AS TotalLength

FROM Objects t1

LEFT JOIN
    Segment t2
ON
    t1.ObjectID=t2.ObjectID AND
    t1.ProjektID=t2.ProjektID AND
    t1.CraneID = t2.CraneID

WHERE
    t1.ObjectID='esttest3' AND
    (x_ > 0 OR y_ > 0) AND
    x_ IS NOT NULL AND
    y_ IS NOT NULL
GROUP BY
    t1.ObjectID
对于3000个对象(每个对象有3个分段),这大约需要1分钟

我尝试添加索引:

FROM Objects t1 WITH (INDEX(IX_Object_All))

LEFT JOIN
    Segment t2 WITH (INDEX(IX_Segment_All))
但这并没有提高性能。 编辑:这些索引是非聚集索引,创建聚集索引修复了该问题。(无需参考指数)

如果我将左连接更改为内部连接,这会使提取的查询(上面的一个)瞬间发生(~0秒)。然而,在我的原始查询中,内部连接仍然需要一分钟的时间,并带有额外的字段(我想基本上还是让它成为左连接,因为每个对象都有值)

我还尝试创建一个具有计算总长度的视图,并与该视图进行左连接。仍然没有改善


我的最终想法是为段表创建一个触发器,以更新对象表中的TotalLength字段。但是,我担心这会对导入具有9k段的项目、更新每个段的值时的性能产生负面影响…

我建议您为对象使用适当的别名。使用像
t1
t2
这样的别名,jist使事情变得混乱;特别是如果在一个查询中将对象引用为
t1
,在另一个查询中将对象引用为
t2
,在另一个查询中将对象引用为
t7
。至于您的问题,请发布您的查询的查询计划(使用),以便我们了解DBMS是什么doing@Larnu这是计划,很抱歉数据库里有瑞典语,这是遗留下来的东西。。。从计划来看,您的表似乎没有聚集索引,对吗?有什么原因吗?@Larnu我创建了聚集索引,现在它就像一个符咒。非常感谢。至于原因,我不太清楚我的前任似乎也没有。