基于主键插入

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

如果您先构建非集群,然后再构建集群,则所有非集群都会基于集群重新创建。这需要更多时间。 你是对的,瑞克。脑袋放屁。我编辑了我的答案。

以上是关于基于主键插入的主要内容,如果未能解决你的问题,请参考以下文章

jfinal的Db.save方法怎么获得插入的主键ID

使用select将多行插入表中,但是表在oracle SQL中具有主键[重复]

mybatis记录随便保存数据获取自增主键的值

Sqlserver里主键插入的问题?

mysql数据库中自动增长的主键也可以手动插入值吗?如何插入

mysql主键重复则更新,不重复则插入