当包含group by,sum或where子句时,为什么这个SQL语句会挂起?

时间:2011-05-11 17:44:31

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有一个SQL语句:

select
   t3.item1,
   t3.item2,
   sum(t1.moneys)
from
   table t1
inner join table t2 on t1.key = t2.key
inner join table t3 on t1.key2 = t3.key2
where
   t2.type = 'thistype'
   and t3.type2 = 'thistype'
group by
   t3.item1, t3.item2

如果我删除了group bysumwhere条款,它运行正常 - 但如果我将其中的任何一个添加回来,它会永远挂起......任何想法......这个在SQL Server Management Studio 2008 R2上

由于

进一步测试

所以我创建了一个视图:

select
       t3.item1,
       t3.item2,
       t1.moneys,
       t2.type,
       t3.type2
    from
       table t1
    inner join table t2 on t1.key = t2.key
    inner join table t3 on t1.key2 = t3.key2

我可以从视图中选择前1000并查看我想在数据中专门查看的类型,但是当我添加'where type2 ='thistype''时它会再次挂起......

4 个答案:

答案 0 :(得分:1)

我认为在得到一个可靠的答案之前,我们需要查看一些表结构并了解有关您的数据库的更多信息。但首先,要对其进行跟踪并查看它告诉您的内容。

乍一看,我发现聚合函数(求和,分组等)的问题往往源于a)过大的数据集(即:你只是试图回收过多的数据)或b)来自过于复杂的结构或连接表上的关系。

然而,这些只是我的一般经验法则,可能不适用于特定情况:运行跟踪和任何其他形式的分析,您可以看到它告诉您的内容。

答案 1 :(得分:1)

你加入三张桌子和数百万条记录,这是正常的,需要花一点时间才能运行。

要回答有关统计信息的问题,它们就是索引用于从表中更快地检索记录的内容。如果没有准确或最新的统计数据,索引实际上可能会减慢您的查询速度。

http://blogs.technet.com/b/rob/archive/2008/05/16/sql-server-statistics.aspx

答案 2 :(得分:0)

你看过你得到的执行计划了吗?这会告诉你问题出在哪里。您是否在要加入和分组的列上有覆盖索引?

答案 3 :(得分:0)

执行计划是否可能已损坏? http://msdn.microsoft.com/en-us/library/aa175244(v=sql.80).aspx

尝试使用sp_recompile

重新编译计划