Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL行的插入顺序是否重要?_Sql_Indexing_Sql Insert - Fatal编程技术网

SQL行的插入顺序是否重要?

SQL行的插入顺序是否重要?,sql,indexing,sql-insert,Sql,Indexing,Sql Insert,我是第一次探索数据仓库的数据库新手。我已经完成了将大量数据从一个生产系统(MS SQL Server 2012)复制到数据仓库(MySQL)的过程 我遇到的问题是,我可用于ETL过程的软件/硬件资源不够健壮,无法使用单个查询复制较大表中的所有数据(程序将耗尽内存并崩溃)。为了解决这个问题,我在表id上添加了一个使用模运算符的where子句,将这些表分成12个块,因为这样写起来既快又容易: SELECT * FROM table WHERE table.tableID % 12 = 0; SELE

我是第一次探索数据仓库的数据库新手。我已经完成了将大量数据从一个生产系统(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引擎是否会根据索引重新排列内存中的数据,以加快读取速度


这样复制和插入数据会给我自己带来麻烦吗?

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

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

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

  • 一种查询,它没有ORDERBY子句,但需要特定ordr中的结果
  • 使用MySQL mis(功能)的查询,允许在聚合查询的
    SELECT
    中使用非聚合、非键列
  • 一种查询,它取决于没有ORDER BY子句的
    GROUP_CONCAT()
    中值的顺序
这些是“不好的”,因为它们取决于系统的观察行为,而不是记录的行为(毫无疑问,我可能遗漏了一些)


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

如果索引相同,那么数据的存储方式或多或少都是相同的,比如在列上有一个哈希索引。这种结构在MySql DB和MySql server中的实现类似。问题在于oltp工作负载与olap工作负载不同,因此oltp的良好索引对于数据仓库来说仍然不是一个好的索引,但它取决于您的数据。请阅读本文以更好地理解oltp和olap的区别:。试着考虑如何减少表基数,假设在oltp系统中存储销售信息,您有如下内容:

|  DateTime        | Product | QTY |
| ---------------- | --------|-----|
| 2018-03-05 10:50 |  prod1  |  5  |
|    Date    |     Qty     |
|------------|-------------|
| 2018-03-05 |    10000    |
包含10^8条记录的表。也许您只想在一个日期中存储产品的数量,例如:

|  DateTime        | Product | QTY |
| ---------------- | --------|-----|
| 2018-03-05 10:50 |  prod1  |  5  |
|    Date    |     Qty     |
|------------|-------------|
| 2018-03-05 |    10000    |

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

为什么可以
orderby
?@emsimpson92这是关于性能的问题,我想不是SQLitself@connorg98你说得对。如果插入顺序与数据在光盘上的位置直接相关,则按日期排序/过滤可能需要触摸更多内存块。再说一次,我只是模糊地理解了这些事情,对数据库的工作原理也不太了解。如果表上有一个聚集索引,它将按照该索引进行排列,正如Gordon在下面的回答中指出的那样。因此,这样分割插入可能会由于页面分割而导致数据总页数增加,但查询性能几乎不会受到影响。在数据仓库上运行50秒的测试查询在生产数据库上运行不到1秒。另外两个可能起作用的因素:1)在ETL过程中,我将生产数据库(20180601)中的整数日期转换为数据仓库(“2018-06-01”)中的SQL日期,在BEVER子句中处理这些日期可能要慢得多?2) 我们正在原型化整个数据仓库概念,因此目前数据仓库使用的硬件资源比生产数据库少。我们还在测试查询的联接中发现一个错误,导致返回的行数过多。一旦我解决了这个问题,查询就及时完成了。这似乎证明了@Gordon的观点,即顺序并不重要。仍然对上面的日期问题感到好奇。@GenuineSmile29。这并不能“证明”这一点。不过,它确实提供了支持性证据。干杯很高兴它能成功。谢谢你的反馈和有用的文章!