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

Does the order of the attributes in a projection impact the speed of execution of the SQL query?

假设我有一个 table 列 A、B、C、D、E、F、G、H、I 的顺序,我只需要 select 列 A , C, F, I(可能 table 有更多的列,我也必须检索更多的列)。

我的问题是,如果我将要在投影中检索的列的顺序保持在升序列索引号(例如 A、C、F、I)而不是检索它们以完全随机的顺序排列(例如 F、A、I、C)。为什么?

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

谢谢。

在SELECT 语句SELECT A、B、C 和SELEC B、A、C 中写入列的顺序完全相同。完全不相关。

重要的一件事是天气与否,如果您仅从具有 100 列的巨大 table 中选择 3 列。如果您在 A、B、C 列上有一个复合非稀疏索引,数据库引擎可以使用它来避免进行整行读取。

如果您在 SELECT 语句中引用的 A、B、C 列上提交索引,那么可能...数据库引擎可能会决定最好的做法是仅执行索引计划而无需加载 100 列的单个数据库行列中涉及的所有字节。

话虽如此。 您在 FROM 子句中声明 TABLES 的顺序根本不相关。

您通常应该在 FROM 子句中命名您的 tables,从您认为具有更多选择性谓词来过滤数据的 TABLES 开始,并且您自己可以通过它实现嵌套循环连接。

我见过像 HSQL 这样的数据库,其数据库引擎优化无法使用我创建的所有适当索引,具体取决于我在 FROM 子句中命名 table 的顺序。 这取决于数据库查询优化的实现方式以及它将探索多少查询执行计划。在 FROM 子句中以适当的顺序写入 tables 将帮助您。

了解如何规划索引以调整查询。

祝你好运。

简答:否。

长答案:视情况而定。

一般情况下,如果不知道您使用的是哪种产品,则无法回答这个问题。

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

在大多数 row-based 关系数据库(包括 Microsoft、PostgreSQL 和 Oracle)中,输出列的排序不会造成明显的差异。这是因为行数据是从内存 block-wise 中读取的(例如,8kB 或 32kB 块)。读入内存后,处理起来相当便宜。

Number 个输出列可能会有所不同,尤其是在使用列式 (column-based) 存储构建的数据库中。对于 row-based 存储,这也很重要(只是因为 in-memory 处理成本和数据传输成本)。

请说明您是否有特定的数据库引擎。

My question is, would it make a difference (performance wise) if I keep the order of the columns to be retrieved in the projection in ascending column index number (e.g A, C, F, I) rather than retrieving them at a complete random order (e.g. F, A, I, C). And why?

可能,但不太可能很重要,并且会因实施而异。 MySQL 和 SQL 服务器很容易得到完全不同的答案。

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

现在,有很多事情可以改变正在发生的事情。覆盖所有列、稀疏列、LOB 等的索引将显着改变数据在 table 中的存储和访问方式。但其中的 none 会受到您订购商品的方式的影响。查询引擎的部分工作是确定从磁盘检索数据的最有效方法。

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