Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql查询-带订单依据和不带订单依据_Sql_Sql Server - Fatal编程技术网

Sql查询-带订单依据和不带订单依据

Sql查询-带订单依据和不带订单依据,sql,sql-server,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.C

我有一个疑问。请告知

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
在sql management studio中执行上述查询大约需要7.30分钟。如果我单独删除ORDERBY子句并运行,那么它将在一分钟内运行。这意味着什么?表ABC包含数百万条记录

10k id将返回到外部查询,每个id可以有多行。在此基础上,我将在外部查询中再次选择10k行。在这个查询中,它将以升序排序记录,然后提取查询,还是提取记录并按顺序执行

如何改进此查询中的性能?我有什么遗漏吗?请就此提出建议

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

谢谢
文卡特

我能想到两个可能的原因。一种可能是,当您不使用Order By时,引擎会为该查询使用一个好的索引。当您添加订单时,它决定执行表扫描或使用不太有利的索引。如果是这种情况,查看这两个执行计划应该会让您对正在发生的事情以及如何进行有一个很好的了解


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

由于结果的大小,SQL Server使用临时表对结果进行排序。数百万行太多,无法在内存中执行此操作。因此,HDD访问会减慢查询速度。

在varchar字段上排序会很昂贵,尤其是在几百万分之一的结果集上。如果没有order by,则速度很快,这是有意义的,因为在YOU检索到10k记录后,处理会停止。Order by需要对alphnumeric字段上的所有记录(百万)进行排序。这需要时间。Top 10k在排序后工作:),因此它首先对表中的一百万条记录进行排序,然后选择10k条记录。有没有办法调整查询以提高性能?尝试减少结果行的数量,您将看到SQL Server在内存中对行进行排序,并且没有这种延迟……但是,理想情况下,如果我是否按顺序排序,我的查询应该返回相同的结果,对吗?如果我按顺序排序,记录将被排序,否则,不排序。但是,没有order by会比使用order by获取更多的记录。不知道如何找出它的查询方式。将返回相同的行集,但可能会增加创建临时集和排序的执行时间。但是很困惑。你说当你通过广告发布订单时,你得到了一组不同的记录?这根本不应该发生。唯一的猜测是注意到子查询中有“TOP10000”。不会期望子查询会影响最终集,但可能会以某种奇怪的方式影响最终集?哦,等等。你有两张订单。在子查询中,您更改的顺序是底部的主顺序还是上面的顺序?如果是子查询中的,则肯定会影响您的选择。我正在更改外部查询中的顺序,而不是子查询中的顺序。如果我在包含200万条记录的表中运行子查询,我可以在30秒内得到它。答案是在外部查询中按更改排序,而不是在内部/子查询中