0

所以最近当我在大表上运行查询时,我将使用如下top 10 *符号:

select  top 10 * from BI_Sessions (nolock)
where SessionSID like 'b6d%'
and CreateDate between '03-15-2012' AND '05-18-2012'

我以为它可以让它跑得更快,但似乎并非如此,这个花了 4 分钟(或者那是可以的时间)?

我想我很好奇该top功能是否在它提取所有数据之后发生(这似乎效率低下)。

谢谢

4

2 回答 2

2

这完全取决于查询,除了“Top 0”。“前 0”确实返回得更快。

在您的情况下,查询必须查看大表中的行以查找与 WHERE 子句匹配的行。如果未找到任何行,则返回的行数无济于事。如果行在表扫描的末尾,则返回的行数没有帮助。

在某些情况下,查询更复杂,“顶部”可能会影响性能。整体优化和返回的第一行之间存在差异。我不确定 SQL Server 的优化器是否认识到这种差异。

于 2012-06-29T15:31:19.480 回答
1

这要看情况。如果您在 BI_sessions 及其大型数据库上没有覆盖索引,那么答案可能是。一个好的覆盖索引可能类似于:CreateDate、SessionSIS 以及您实际需要返回的所有列。如果你确实有一个覆盖索引,那么 SQL 甚至不会读取表,它会从覆盖索引中获取它需要的所有数据。如果您指定了实际需要返回的列,则可能会在几分之一秒内返回 10 行。有关更多有用信息 http://www.mssqltips.com/sqlservertip/1078/improve-sql-server-performance-with-covering-index-enhancements/ 和更多技术信息: http://www.simple-talk。 com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/http://www.sqlserverinternals.com/http://www.insidesqlserver.com/thebooks.html

于 2012-06-29T15:32:50.743 回答