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

时间:2019-01-02 23:12:10

标签: sql sql-server

我观察到,执行全表扫描会根据查询花费不同的时间。我认为,在相似的条件下(选择下的列集,列数据类型),表扫描应该花费一些相似的时间。似乎并非如此。我只想了解其背后的原因。

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

表格:

  • 10列
  • 1000万行每列的密度从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毫秒

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

3 个答案:

答案 0 :(得分:3)

  

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

     

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

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

答案 1 :(得分:0)

这两列的数据密度不同。

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

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

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

考虑到初始测试的时间,您可能希望在大约7200ms处看到COL04,在大约3600ms处看到COL05。

关于SQL Server COUNT() Function Performance Comparison

的有趣文章

答案 2 :(得分:-1)

  

全表扫描(也称为顺序扫描)是在数据库上进行的扫描,在该数据库中,被扫描表的每一行均以顺序(串行)顺序读取

Reference

在您的情况下,全表扫描按顺序(有序方式)进行扫描,因此由于Col7是有序的,因此无需扫描整个表即可前进下一条记录。

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

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