首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL插入行的顺序重要吗?

问SQL插入行的顺序重要吗?
EN

Stack Overflow用户
提问于 2018-07-05 15:56:58
回答 2查看 1.9K关注 0票数 3

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

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

代码语言:javascript
复制
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引擎是否真的会根据索引重新排列内存中的数据,以加快读取速度。

我用这种方式复制和插入数据,让自己陷入麻烦了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-05 16:08:22

这可能不会有什么区别。数据库通常只能在声明(某种类型的)聚集索引时才能利用表中的排序。如果您声明了一个,那么数据将在数据页上排序,而不管插入顺序如何。如果没有优化器,那么优化器就不能利用排序。

有一些类型的查询(特别是exists),其性能可能会受到数据读取时到达的实际顺序的影响。但这种情况并不常见。如果表不适合内存,并且依赖于相同的数据以获得性能,则性能也可能较差。这通常是一个错误的假设,但它可能是一些查询的基础。

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

  • 没有ORDER BY子句但期望在特定ordr中获得结果的查询。
  • 一种使用MySQL mis(特性)的查询,它允许聚合查询的SELECT中的非聚合、非键列。
  • 依赖于没有GROUP_CONCAT()子句的ORDER BY中值的排序的查询。

这些都是“坏”的,因为它们取决于系统的观察行为,而不是文档化的行为(毫无疑问,我可能漏掉了一些)。

当然,你可以测试你的新系统,看看是否是这样的。但是,首先,我并不是首先考虑的是插入件的排序。

票数 4
EN

Stack Overflow用户

发布于 2018-07-05 16:59:05

如果您有相同的索引,数据将或多或少地以相同的方式存储,假设您在一个列上有一个散列索引,这种结构的实现在MySql DB和MySql服务器中将是相似的。问题是oltp工作负载与olap工作负载不同,因此oltp的好索引仍然不是数据仓库的好索引,但它取决于您的数据。查看本文,以更好地理解oltp和olap:oltp对olap的不同之处。试着考虑如何减少表基数,假设在oltp系统中存储有关销售的信息,并且有如下内容:

代码语言:javascript
复制
|  DateTime        | Product | QTY |
| ---------------- | --------|-----|
| 2018-03-05 10:50 |  prod1  |  5  |

表中有10^8条记录。也许你只想在约会中存储产品的数量,比如:

代码语言:javascript
复制
|    Date    |     Qty     |
|------------|-------------|
| 2018-03-05 |    10000    |

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51195627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档