我是一个数据库新手,第一次探索数据仓库。我已经完成了将大量数据从我们的生产系统(MySQL 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引擎是否真的会根据索引重新排列内存中的数据,以加快读取速度。
我用这种方式复制和插入数据,让自己陷入麻烦了吗?
发布于 2018-07-05 16:08:22
这可能不会有什么区别。数据库通常只能在声明(某种类型的)聚集索引时才能利用表中的排序。如果您声明了一个,那么数据将在数据页上排序,而不管插入顺序如何。如果没有优化器,那么优化器就不能利用排序。
有一些类型的查询(特别是exists),其性能可能会受到数据读取时到达的实际顺序的影响。但这种情况并不常见。如果表不适合内存,并且依赖于相同的数据以获得性能,则性能也可能较差。这通常是一个错误的假设,但它可能是一些查询的基础。
在某些情况下,数据排序可能会产生看似正确的结果,但这些结果都是“糟糕的”SQL:
ORDER BY子句但期望在特定ordr中获得结果的查询。SELECT中的非聚合、非键列。GROUP_CONCAT()子句的ORDER BY中值的排序的查询。这些都是“坏”的,因为它们取决于系统的观察行为,而不是文档化的行为(毫无疑问,我可能漏掉了一些)。
当然,你可以测试你的新系统,看看是否是这样的。但是,首先,我并不是首先考虑的是插入件的排序。
发布于 2018-07-05 16:59:05
如果您有相同的索引,数据将或多或少地以相同的方式存储,假设您在一个列上有一个散列索引,这种结构的实现在MySql DB和MySql服务器中将是相似的。问题是oltp工作负载与olap工作负载不同,因此oltp的好索引仍然不是数据仓库的好索引,但它取决于您的数据。查看本文,以更好地理解oltp和olap:oltp对olap的不同之处。试着考虑如何减少表基数,假设在oltp系统中存储有关销售的信息,并且有如下内容:
| DateTime | Product | QTY |
| ---------------- | --------|-----|
| 2018-03-05 10:50 | prod1 | 5 |表中有10^8条记录。也许你只想在约会中存储产品的数量,比如:
| Date | Qty |
|------------|-------------|
| 2018-03-05 | 10000 |这将减少表的基数,并将提高应用程序的效率。
https://stackoverflow.com/questions/51195627
复制相似问题