【发布时间】:2018-07-05 15:56:58
【问题描述】:
我是第一次探索数据仓库的数据库新手。我已经完成了将大量数据从我们的一个生产系统 (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.
我现在想知道的是,这是否会影响我的数据仓库相对于原始数据库的性能。在旧数据库中,数据大致按时间顺序插入,显然新数据仓库不会如此。
我对数据库引擎实际存储数据的方式知之甚少,无法知道这是否是一个问题。我在数据仓库中拥有与原始表中相同的所有索引,但我不知道数据库引擎是否真的会根据索引重新排列内存中的数据以加快读取速度。
以这种方式复制和插入数据是否给自己带来了麻烦?
【问题讨论】:
-
当你可以
orderby时为什么重要? -
@emsimpson92 这是一个关于性能的问题,我猜不是 SQL 本身
-
@connorg98 你是对的。如果插入的顺序与数据在磁盘上的位置直接相关,那么按日期排序/过滤可能需要接触更多的内存块。再说一次,我对这些东西的理解很模糊,对 DB 的底层工作方式知之甚少。
-
如果表上有聚集索引,它将按该索引排列,正如 Gordon 在下面的答案中指出的那样。因此,像这样划分插入可能会导致由于页面拆分而拥有更多的总页数,但查询性能几乎不会受到影响。
标签: sql indexing sql-insert