【问题标题】:Optimize Simple SQL SELECT优化简单 SQL SELECT
【发布时间】:2012-09-21 01:51:17
【问题描述】:

我有一个简单的选择语句:

SELECT id1, id2, id3 FROM Table1

Table1 包含大约 400,000 条记录。

目前,这条语句的执行时间为 5 秒。

是否可以对此进行优化(不减少返回的记录数)?

【问题讨论】:

  • 如果您经常查询 400k 行而没有过滤到您关心优化它的地步,那么您的应用程序中存在一个您应该解决的设计问题。
  • @SeanBright 同意了。此语句实际上不会在生产中应用。

标签: sql sql-server optimization


【解决方案1】:

添加一个包含所有三个字段的索引,这将导致 SQL 从索引页面读取。这也称为覆盖索引。但要记住的一件事是,添加索引会减慢写入时间,因为必须在写入期间重建索引。

CREATE INDEX IDX_CoveredIndex ON Table1 (id1, id2, id3)

但是,只有 400K 行,我想说这可能不是问题。

【讨论】:

  • +1 当然假设表中的字段多于三个选定字段,否则索引不会有太大区别。
  • 这似乎不影响速度。我使用您的上述语法来创建索引。 @Guffa 这些是表中唯一的字段。编辑看起来很喜怒无常 - 现在它在 3 到 4 之间播放:P
  • @Rivka:这个“服务器”是你的笔记本电脑还是开发盒?
  • @Mike 使用我的开发机器,但连接到实时服务器的一个实例(我认为)。
  • @Rivka:如您所见,添加索引减少了 30% 到 40% 的查询时间。现在感觉就像您正在处理“服务器”上的资源不足问题。
【解决方案2】:

不,您的查询会导致简单的表扫描。只要你没有whereorder 声明,那是你能做的最好的了。

问题是,为什么要选择所有没有过滤器的行?如果您在应用程序中进行过滤,那么您做错了。

【讨论】:

    【解决方案3】:

    这不是优化,但你应该尝试在表名后使用(nolock),这样你就不会在这5秒内锁定表,让其他人也可以使用它......

    仅当您尝试同时从多个位置访问表时,这才是优化,因此您无需等待一个结束使用该表来启动另一个,一次完成所有操作。

    SELECT id1, id2, id3 FROM Table1 (nolock)
    

    PS:这是 SQL Server sintax...不知道其他 SGBD,但很确定有类似的...但是由于您的问题是关于 SQL Server,所以我想没关系! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      相关资源
      最近更新 更多