繁体   English   中英

SQL Server 表扫描时间是否取决于查询?

[英]Does SQL Server Table-Scan Time depend on the Query?

我观察到根据查询执行全表扫描需要不同的时间。 我相信在相似的条件下(选择下的列集,列数据类型),表扫描应该花费一些相似的时间。 好像不是这样。 我只是想了解这背后的原因。

我在查询之前使用了“CHECKPOINT”“DBCC DROPCLEANBUFFERS” ,以确保查询缓存没有影响。

桌子:

  • 10 列
  • 10M 行每列具有不同的密度,范围从 0.1 到 0.000001
  • 没有索引

查询:

查询 A:返回 100 行,耗时:~ 900ms

SELECT [COL00]
FROM [TEST].[dbo].[Test]
WHERE COL07 = 50000

查询 B:返回 910595 行,耗时:~15000ms

SELECT [COL00]
FROM [TEST].[dbo].[Test]
WHERE COL01 = 5

** 其中列 COL07 随机填充了范围从 0 到 100000 的整数,列 COL01 随机填充了范围从 0 到 10 的整数

花的时间:

  • 查询 A :大约 900 毫秒
  • 查询 B :大约 18000 毫秒

我在这里想念的重点是什么?

查询A:(返回100行,耗时:~900ms)

查询B:(返回910595行,耗时:~15000ms)

我相信您缺少的是在第二个查询中要获取大约 x100 多行。 这只能解释为什么它花费了 20 倍的时间。

两列具有不同的数据密度。

查询 A,COL07:10000000/100000 = 100
查询 B,COL05:10000000/10 = 1000000

两个搜索参数都在数据范围的中间这一事实并不一定会影响搜索速度。 这取决于引擎扫描列以返回搜索谓词值的次数。

为了查看是否确实如此,我将尝试以下操作:
COL04:10000000/1000 = 10000。在 WHERE COL04 = 500 上过滤
COL08: 10000000/10000 = 1000. 过滤 WHERE COL05 = 5000

考虑到初始测试的时间,您可能会在 ~7200 毫秒看到 COL04,在 ~3600 毫秒看到 COL05。

一篇关于SQL Server COUNT() 函数性能比较的有趣文章

全表扫描(也称为顺序扫描)是对数据库进行的扫描,其中被扫描的表的每一行都按顺序(串行)顺序读取

参考

在您的情况下,全表扫描按顺序(以有序方式)扫描,因此它不需要扫描整个表来推进下一条记录,因为 Col7 是有序的。

但在 Query2 中情况并非如此,Col01 是随机分布的,因此需要进行全表扫描。

查询 1 是乐观扫描,而查询 2 是悲观扫描。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM