Sql查询 - 按顺序和不按顺序排序

时间:2013-11-19 10:46:35

标签: sql sql-server

我遇到查询问题。请指教。

SELECT Top 10000
'Link' As [Link],
ODST.ID AS [ID],
ODST.Type1 AS [Type 1],
ODST.Type2 AS [Type 2],

COUNT(DISTINCT ODST.Col1) AS [Col 1],
COUNT(DISTINCT ODST.ID) AS [Col 2],
......
......
COUNT(DISTINCT ODST.Col11) AS [Col 11],
SUM(ODST.Col12) AS [Col 12],
.....
.....
SUM([Col35]) AS [Col 35]
FROM ABC ODST
WHERE id in
(Select id from
(select Top 10000 count(*) AS Line, id from ABC WHERE 1=1 
group by id order by Line desc) t2) AND 1=1 
GROUP BY ODST.id, ODST.Type1, ODST.Type2
ORDER BY ODST.Type1, ODST.Type2

上面的查询大约需要7.30分钟才能在sql management studio中执行。如果我单独删除Order By子句并运行,那么它会在一分钟内运行。这意味着什么?表ABC包含数百万条记录。

10k id将返回到外部查询,每个id可以有多行。从那以后,我在外部查询中再次选择10k行。这个查询,它会以升序命令记录,然后提取查询或获取记录并通过???执行命令

如何提高此查询的效果?我错过了什么吗?请告知此事。

表中有Type1,Type2和ID列的索引,所有三列都是varchar(50)数据类型。

由于 venkat

2 个答案:

答案 0 :(得分:0)

我能想到的两个可能的原因。一种情况是,当您不使用Order时,引擎会为此查询使用一个好的索引。当您添加Order By时,它决定执行表扫描或使用不太有利的索引。如果是这样的话,看两个执行计划应该让你知道发生了什么以及如何继续。

有点不太可能是它不是一个大表而是一个大的结果集? order by可能会添加一种导致额外时间的结果。

答案 1 :(得分:0)

由于结果大小,SQL Server使用临时表为您排序结果。在内存中,数百万行太多了。因此,硬盘访问会减慢您的查询速度。