如果表没有索引,为什么没有WHERE子句的查询需要更长的时间?

时间:2013-06-10 22:33:21

标签: sql sql-server performance indexing

我从两个相同的表中运行Select * from TABLE,唯一的区别是一个没有索引。

没有任何索引的表花了7分钟,索引的表花了5分钟。

这些表各有29000行。

这是正常的吗?这是否也发生在其他数据库服务器中?

1 个答案:

答案 0 :(得分:-1)

由于信息太少,这有点疯狂猜测。一些可以解释差异的想法:

  1. 如果您的表甚至没有聚集索引(通常是主键),它将存储为堆。聚簇索引页面具有指向下一页的链接,因此它们允许快速顺序遍历。堆页面没有这样的链接,引擎必须不断地返回索引分配映射(IAM)页面。这个事实可以解释堆的完整扫描可能比聚簇索引的完整扫描慢。

  2. 您没有查询完全相同的表格,因此可能会发挥一些外部因素。桌子怎么填满?也许他们没有相同的碎片级别。碎片表的读取速度较慢。

  3. 你真的在做“SELECT * FROM ...”还是这个问题的捷径?因为如果您确实只选择了列的一个子集,则可能在覆盖索引中找到它们,这显然比完整的表数据更快。