SQL插入行顺序很重要吗?

时间:2018-07-05 15:56:58

标签: sql indexing sql-insert

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

我遇到的问题是,我可用于ETL流程的软件/硬件资源不够强大,不足以使用单个查询复制较大表中的所有数据(程序将耗尽内存并崩溃)。 。为了解决这个问题,我使用表id上的取模运算符添加了一个where子句,将这些表分为12个块,因为这很容易编写:

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.

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

我对DB引擎实际上如何存储数据一无所知,以了解这是否是一个问题。我在数据仓库上拥有与原始表相同的所有索引,但是我不知道DB引擎是否会根据该索引实际重新排列内存中的数据以加快读取速度。

通过这种方式复制和插入数据是否使我陷入困境?

2 个答案:

答案 0 :(得分:3)

这可能不会有所作为。通常,只有在声明了某种形式的聚集索引时,数据库才可以利用表内的排序。如果声明了一个,则无论插入顺序如何,数据都将在数据页上排序。如果您没有,那么优化器将无法利用排序。

有些类型的查询(特别是exists)的性能可能会受到数据在读取时到达的实际顺序的影响。但这并不常见。如果表不能容纳在内存中,并且您依赖于位于同一位置的相似数据来提高性能,那么您的性能也可能会很差。通常,这是一个错误的假设,但可能是某些查询的基础。

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

  • 没有ORDER BY子句,但希望在特定ordr中得到结果的查询。
  • 使用MySQL mis(feature)的查询,该查询允许在聚合查询的SELECT中使用非聚合的非键列。
  • 取决于没有GROUP_CONCAT()子句的ORDER BY中值的顺序的查询。

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

当然,您可以测试您的新系统,看看是否是这种情况。但是先验插入顺序并不是我的首要考虑。

答案 1 :(得分:1)

如果索引相同,则数据将以相同的方式或多或少地存储,假设您在列上具有哈希索引,则该结构的实现在MySql DB和MySql服务器中将类似。问题在于oltp工作负载与olap工作负载不同,因此oltp的良好索引仍然不是数据仓库的良好索引,但它取决于您的数据。请参阅本文,以更好地理解与oltp和olap的区别:oltp vs olap。尝试考虑如何减少表基数,假设在oltp系统中存储了有关销售的信息,并且您有类似以下内容:

|  DateTime        | Product | QTY |
| ---------------- | --------|-----|
| 2018-03-05 10:50 |  prod1  |  5  |
具有10 ^ 8条记录的

表。也许您只想存储某个日期的产品数量,例如:

|    Date    |     Qty     |
|------------|-------------|
| 2018-03-05 |    10000    |

这将减少表的基数,并提高应用程序的效率