Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
Mysql 投影中属性的顺序是否会影响SQL查询的执行速度?_Mysql_Sql Server_Database_Performance_Projection - Fatal编程技术网

Mysql 投影中属性的顺序是否会影响SQL查询的执行速度?

Mysql 投影中属性的顺序是否会影响SQL查询的执行速度?,mysql,sql-server,database,performance,projection,Mysql,Sql Server,Database,Performance,Projection,假设我有一个表,其中列a、B、C、D、E、F、G、H、I按顺序排列,我只需要选择列a、C、F、I(可能是表有更多的列,我也必须检索更多的列) 我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么 我知道顺序访问比随机访问快,但是我的示例中没有一个是顺序的,所以我不确定这两个投影顺序的性能差异是什么 谢谢。在SELECT语句中选择a、B、C和SELEC B、a、C列的顺序

假设我有一个表,其中列a、B、C、D、E、F、G、H、I按顺序排列,我只需要选择列a、C、F、I(可能是表有更多的列,我也必须检索更多的列)

我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么

我知道顺序访问比随机访问快,但是我的示例中没有一个是顺序的,所以我不确定这两个投影顺序的性能差异是什么


谢谢。

在SELECT语句中选择a、B、C和SELEC B、a、C列的顺序完全相同。这是完全不相干的

如果你从一个有100列的巨大表格中只选择了3列,那么重要的是天气与否。如果在a、B、C列上有一个复合的非稀疏索引,数据库引擎可以使用它来避免执行整行读取

如果您在SELECT语句中引用的A、B、C列上提供索引,则可能。。。DB引擎可能会决定最好的做法是执行一个仅索引的计划,而不需要加载100列的单个DB行列中涉及的所有字节

尽管如此。 在FROM子句中声明表的顺序一点也不无关

您通常应该在FROM子句中命名表,从您认为有更多选择性谓词用于筛选数据的表开始,并通过这些谓词实现嵌套循环联接

我见过像HSQL这样的数据库,其数据库引擎优化未能使用我根据我在FROM子句中命名表的顺序创建的所有适当索引。 这取决于DB查询优化是如何实现的,以及它将探索多少查询执行计划。在FROM子句中以适当的顺序编写表将有助于您解决此问题

了解如何规划索引以优化查询

祝你好运。

简短的回答:不

详细回答:这要看情况

在一般情况下,如果不知道您使用的是哪种产品,这个问题是不可能回答的

输出列的排序应该无关紧要

在大多数基于行的关系数据库(包括Microsoft、PostgreSQL和Oracle)中,输出列的顺序没有明显的区别。这是因为行数据是按块从内存中读取的(例如,在8kB或32kB的块中)。读入内存后,处理成本相当低

输出列的数量会有所不同,尤其是在使用列式(基于列的)存储构建的数据库中。对于基于行的存储,这也很重要(因为内存中的处理成本和数据传输成本)

请指定您是否考虑使用特定的数据库引擎

我的问题是,如果我将要在投影中检索的列的顺序保持为按列索引号升序(例如a、C、F、I),而不是以完全随机的顺序(例如F、a、I、C)检索它们,那么(性能方面)会有什么不同吗。为什么

可能,但这不太可能是重大的,而且会因实施情况而有所不同。MySQL和SQL Server可能很容易得到完全不同的答案

例如,我对SQL Server的理解是,它以称为页面的固定块读取磁盘,页面大小为8KB。除了LOB的一些例外情况外,单个行不允许跨越多个页面,这会造成8060字节的限制。如果您的数据将超过这个值,并且您没有使用LOB,那么实际上您必须创建另一个表。所以,不管您做什么,当SQL Server从表中读取记录时,它读取的是整个页面,因此也是整个记录

现在,有很多事情可以改变发生的事情。覆盖所有列、稀疏列、LOB等的索引将显著改变数据在表中的存储和访问方式。但这一切都不会受到你的订购方式的影响。查询引擎的部分工作是确定从磁盘检索数据的最有效方式

底线:I/O的成本将比内存中这些列的排序高出几个数量级。除了一个可能的人为的例子之外,我想不出有什么原因可以作为编写查询的考虑因素