gpt4 book ai didi

SQL 插入行的顺序重要吗?

转载 作者:行者123 更新时间:2023-12-04 02:58:49 25 4
gpt4 key购买 nike

我是一名数据库新手,第一次探索数据仓库。我已经完成了将大量数据从我们的一个生产系统 (MS SQL Server 2012) 复制到我们的数据仓库 (MySQL) 的过程。

我遇到的问题是,我可用于 ETL 过程的软件/硬件资源不够健壮,无法使用单个查询复制我较大表中的所有数据(程序会耗尽内存并崩溃) .为了解决这个问题,我通过在表 ID 上使用模运算符添加一个 where 子句将这些表分成 12 个 block ,因为这样写起来既快又容易:

SELECT * FROM table WHERE table.tableID % 12 = 0;
SELECT * FROM table WHERE table.tableID % 12 = 1;
SELECT * FROM table WHERE table.tableID % 12 = 2;
etc.

我现在想知道这是否会影响我的数据仓库相对于原始数据库的性能。在旧数据库中,数据大致按时间顺序插入,显然新数据仓库不会出现这种情况。

我对数据库引擎实际存储数据的方式知之甚少,无法确定这是否是一个问题。我在数据仓库上拥有与原始表上相同的索引,但我不知道数据库引擎是否真的会根据索引重新排列内存中的数据以加快读取速度。

我是否因为以这种方式复制和插入数据而惹上麻烦?

最佳答案

这可能不会有什么不同。当声明(某种)聚集索引时,数据库通常只能利用表内的排序。如果声明了一个,则数据将在数据页上排序,而不管插入顺序如何。如果您没有,则优化器无法利用排序。

有些类型的查询(特别是 exists)的性能可能会受到读取数据时数据到达的实际顺序的影响。但这并不常见。如果表不适合内存并且您依赖于将相似的数据放在一起以提高性能,则您的性能也可能很差。这通常是一个错误的假设,但它可能是某些查询的基础。

在某些情况下,数据排序可能会产生看似正确的结果,但这些是“糟糕的”SQL:

  • 没有 ORDER BY 子句但期望结果按特定顺序排列的查询。
  • 使用 MySQL 错误(功能)的查询允许在聚合查询的 SELECT 中使用非聚合、非键列。
  • 一个查询,它取决于 GROUP_CONCAT() 中值的排序,没有 ORDER BY 子句。

这些是“不好的”,因为它们取决于观察到的系统行为,而不是记录的行为(毫无疑问,我可能遗漏了一些行为)。

当然,您可以测试您的新系统,看看是否是这种情况。但先验插入的顺序不是我首先关心的问题。

关于SQL 插入行的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51195627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com