为啥包含 group by、sum 或 where 子句时这条 SQL 语句会挂起?

Posted

技术标签:

【中文标题】为啥包含 group by、sum 或 where 子句时这条 SQL 语句会挂起?【英文标题】:Why is this SQL statement hanging when group by, sum, or where clause is included?为什么包含 group by、sum 或 where 子句时这条 SQL 语句会挂起? 【发布时间】:2011-05-11 17:44:30 【问题描述】:

我有一条 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'' 时,它再次挂起......

【问题讨论】:

你到底想完成什么? 这三个表分别有多少条记录?他们被索引了吗?统计数据是最新的吗? 我想创建一个视图,其中包含 t3 项的聚合值,t1 包含需要聚合的值 @maple_shaft 数百万条记录,是的,统计数据? @marc_s 我需要 where 子句中的表 2 【参考方案1】:

你把三张表和几百万条记录连接在一起,这很正常,需要一点时间才能运行。

为了回答您关于统计的问题,索引利用它们来更快地从您的表中检索记录。如果没有准确或最新的统计数据,索引实际上会减慢您的查询速度。

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

【讨论】:

好吧,我将给它 20 分钟...目前在第 1 分钟 好的,所以我将 where 子句更加具体,它实际上返回了数据,所以我猜它只是数据的浩瀚 在执行报告之外,应该很少有需要获取这么多记录的情况。但是,如果您这样做,请记住仔细检查表格统计信息。【参考方案2】:

我认为我们需要查看一些表结构并了解更多关于您的数据库的信息,然后才能给出可靠的答案。不过,第一件事是对其进行跟踪,看看它告诉你什么。

乍一看,我发现聚合函数(sum、group by 等)的问题往往源于 a) 过大的数据集(即:您只是试图拉回太多数据)或b) 来自连接表上过于复杂的结构或关系。

但是,这些只是我的一般经验法则,可能不适用于特定情况:运行跟踪和任何其他形式的分析,看看能告诉你什么。

【讨论】:

@tylercomp - 我总是通过 Sql Admin(非常好)要求跟踪 SPID XXXX(无论我的 SPID 是什么)来做到这一点。【参考方案3】:

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

【讨论】:

【参考方案4】:

会不会是执行计划损坏了?http://msdn.microsoft.com/en-us/library/aa175244(v=sql.80).aspx

尝试使用sp_recompile重新编译计划

【讨论】:

以上是关于为啥包含 group by、sum 或 where 子句时这条 SQL 语句会挂起?的主要内容,如果未能解决你的问题,请参考以下文章

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

group by having where order by

group by后接的having语句怎样使用才是有效的,我为啥不行的

怎么使用group by?

为啥 MAX 语句需要 Group By?

SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中