【问题标题】:Why does query without WHERE clause take longer if table doesn't have index?如果表没有索引,为什么没有 WHERE 子句的查询需要更长的时间?
【发布时间】:2013-06-10 22:33:21
【问题描述】:

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

没有索引的表耗时 7 分钟,有索引的表耗时 5 分钟。

每个表有 29000 行。

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

【问题讨论】:

  • 你试过多次了吗?重复测量时结果是否有任何变化?
  • 查询计划是什么?
  • 一个表是基于堆的,另一个是集群的吗?你能告诉我们确切的 DDL 吗?
  • 第二个猜测:如果你有一张真实的生活表,它有 2 年的历史……只是为了练习,你决定使用 CTAS 创建第二个表,那么不,这些表并不完全相同。不要忘记数据碎片。
  • 7 分钟到底是什么?只有 29K 行似乎很慢。 select count(*) 需要多长时间?

标签: sql sql-server performance indexing


【解决方案1】:

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

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

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

  3. 您真的是在执行“SELECT * FROM...”还是该问题的捷径?因为如果您确实只选择了列的子集,它们可能已经在覆盖索引中找到,这显然比读取完整的表数据要快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多