【问题标题】:Insert Based on Primary Key基于主键插入
【发布时间】:2014-02-11 20:27:22
【问题描述】:

在我们的数据仓库 (SQL Server 2005) 中,我们尝试按主键的顺序插入/更新记录。换句话说,我们从源表中提取并发出 ORDER BY DW 中的主键。这是在硬盘驱动器上保持数据读取/写入逻辑顺序并提高性能的标准做法。 (如果这不准确,请告诉我)。

在非常大的源表上发出 ORDER BY 时,这确实会降低性能。有没有其他方法可以获得相同的结果?我正在考虑索引重建和计算统计的某种组合?

希望这是有道理的!我不是DBA!谢谢。

【问题讨论】:

  • 你从源表拉到哪里?
  • 我知道有很多原因要处理或插入按主键排序的记录,但在源系统中执行实际排序会给它带来不必要的负担。

标签: sql sql-server etl data-warehouse


【解决方案1】:

如果你想强制一个特定的排序,你必须有一个 order by 子句。没有如果,ands,或buts。在您要排序的列上使用聚集索引可能会使选择运行得更快,但构建该索引最终可能会花费与原始查询一样长的时间。

我会研究重新排序目标表的替代方法(如 Johnny Bones 的回复中所建议的那样)。

【讨论】:

    【解决方案2】:

    如果该表没有索引,则页面不会以任何特定顺序存储在磁盘上。在没有任何索引的大表的情况下,来自该表的 SELECT.....ORDER BY 会出现性能问题。

    听起来您需要在主键上建立索引。

    【讨论】:

      【解决方案3】:

      如果您要从中提取的表在 PK 上有一个聚集索引(它应该),那么按照 PK 的顺序带回记录应该对性能产生零影响。您遇到的任何性能问题都可能是由于您返回的记录数量庞大(而不是 ORDER BY)。

      我不认为我完全理解你想要做什么。但是按该顺序恢复记录应该不是问题。

      【讨论】:

        【解决方案4】:

        我不知道这是否是“标准做法”,但我在一个仓库工作,我们的典型表有近十亿条记录。我们总是会删除索引,插入新数据,然后重建索引。有人,在某个时候,确定这是我们做到这一点的最有效方式。我敢肯定这里有人可以插话页面大小和物理属性(这可能比您需要知道的要多,因为您说您不是 DBA),但简短的回答是这样做。

        如果您决定走这条路,请始终记住先删除非聚集索引,然后再删除聚集索引。当你重建它们时,以相反的顺序重建它们(首先是集群,然后是非集群)。

        【讨论】:

        • 如果您先构建非集群,然后再构建集群,则所有非集群都会基于集群重新创建。这需要更多时间。
        • 你是对的,瑞克。脑袋放屁。我编辑了我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 2014-03-10
        • 1970-01-01
        相关资源
        最近更新 更多