Iam*_*mIC 6 sql-server postgresql indexing sql-execution-plan
假设一个表包含足够的信息以保证索引搜索,SQL Server(或PostgreSQL)选择索引扫描的基数是什么?
我问这个的原因是我之前发布了一个问题(链接),其中两个查询以相同的速度执行,但是一个没有尝试在已处理的列上使用索引.在SQL Server建议我放置一个覆盖索引,其中包括要查询的列(它为两个查询建议这个),我开始寻找原因,为什么它会提出这样一个奇怪的建议.
我尝试使索引覆盖和复合,但两者都在同一时间执行(我们说的是300万行).
最后我得出结论是因为数据的超高基数.每一行都是独特的.我推断这导致SQL服务器选择索引扫描.但是,查询声明"WHERE Col1>?AND Col2 <?",所以这有点令人困惑.
我的问题是:
我附上了执行计划.

就SQL Server而言,这被称为引爆点,金伯利的博客文章对其进行了很好的阅读.http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx
临界点是表中总页数的25%-33%的指导,表示为行,例如,10k数据页将给出2500-3333行的临界点.作为指导方针,这是非常好的,并且你会得到的好 - 请记住查询计划引擎是一个黑盒子,虽然它会给你一个查询计划,它只说明它决定了什么,而不是为什么.
然而,就倾覆覆盖指数而言,这实际上并不容易,即使选择了100%的数据,覆盖索引仍将在大多数情况下寻求过度扫描.
这是有道理的,如果您认为成本优化器没有为索引页面层次结构分配任何实际成本,那么任何成本只会占用索引叶页的访问权限.此时,扫描或寻找100%的覆盖指数的成本相同.
我从我自己的实验中发现(http://sqlfascination.com/2009/11/07/can-a-covering-nc-index-be-tipped)使用一个inter子句会导致它扫描,但其他where子句会不是 - 从我可以告诉它纯粹是通过查询引擎的路线.
| 归档时间: |
|
| 查看次数: |
2030 次 |
| 最近记录: |