为啥包含 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 by
、sum
或 where
子句,它运行良好 - 但如果我添加其中任何一个,它会永远挂起......任何想法......这是在 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