【问题标题】:Does the order of columns in an sql statement affect the speed of the query?sql语句中列的顺序会影响查询的速度吗?
【发布时间】:2015-05-31 07:08:12
【问题描述】:

如果我有一个包含 3 列的表格,Column AColumn BColumn C

如果我的选择语句类似于Select Column A, Column B, Column C from Table,查询会更快吗?如果是Select Column A, Column C, Column B from Table呢?

更新和插入也是如此。

Update Table set Column A = '', Column B = '', Column C = ''Update Table set Column A = '', Column C = '', Column B = ''

Insert into Table (Column A, Column B, Column C) Values()Insert into Table (Column A, Column C, Column B) Values()

【问题讨论】:

  • 为什么不自己测试和验证。我提供了 3 个测试用例,请看我的回答。

标签: mysql sql sql-server oracle


【解决方案1】:

我不相信任何 SQL 标准规定了单个语句的性能要求,因此它确实完全在实现的控制之下。

但是,如果存在实质性差异,我会非常感到惊讶,因为大部分时间只是检索数据并提供数据。

大多数 DBMS 在尝试执行语句之前都会对语句进行相当多的分析,以减少对检索阶段的影响。例如确定是否所有数据都可以通过仅索引读取来检索,或者选择正确的索引以使用最小基数。

因此,您的列顺序可能无论如何都无法在从分析到执行的过渡中幸存下来(在将数据传递给用户时,必须为select 重新设置它,但insert 则不然或update)。

可能存在微小的差异,这是由于从数据存储在记录中的顺序重新排序数据造成的,但如果它很重要,您应该转向更好的 DBMS。

【讨论】:

    【解决方案2】:

    不,不在 SELECT 或 UPDATE 列中。顺序可能很重要的地方是 GROUP BY/ORDER BY 子句。 WHERE 子句和 JOIN 条件中的谓词将由优化器根据成本重新排序。

    【讨论】:

      【解决方案3】:

      如果我的选择语句类似于从表中选择 A 列、B 列、C 列,查询会更快吗?如果是从表中选择A列、C列、B列呢?

      我看到您使用多个 RDBMS 标记进行标记。我的回答只针对 Oracle

      在 Oracle SQL 中,SELECT 列表中列的顺序不会影响查询的性能。

      我们来测试验证一下:

      案例 1

      SQL> EXPLAIN PLAN FOR
        2  SELECT empno, ename, deptno FROM emp;
      
      Explained.
      
      SQL>
      SQL> SELECT * FROM TABLE(dbms_xplan.display);
      
      PLAN_TABLE_OUTPUT
      --------------------------------------------------------------------------------
      Plan hash value: 3956160932
      
      --------------------------------------------------------------------------
      | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
      --------------------------------------------------------------------------
      |   0 | SELECT STATEMENT  |      |    14 |   182 |     3   (0)| 00:00:01 |
      |   1 |  TABLE ACCESS FULL| EMP  |    14 |   182 |     3   (0)| 00:00:01 |
      --------------------------------------------------------------------------
      
      8 rows selected.
      
      SQL>
      

      案例 2

      SQL> EXPLAIN PLAN FOR
        2  SELECT deptno, ename, empno FROM emp;
      
      Explained.
      
      SQL>
      SQL> SELECT * FROM TABLE(dbms_xplan.display);
      
      PLAN_TABLE_OUTPUT
      --------------------------------------------------------------------------------
      Plan hash value: 3956160932
      
      --------------------------------------------------------------------------
      | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
      --------------------------------------------------------------------------
      |   0 | SELECT STATEMENT  |      |    14 |   182 |     3   (0)| 00:00:01 |
      |   1 |  TABLE ACCESS FULL| EMP  |    14 |   182 |     3   (0)| 00:00:01 |
      --------------------------------------------------------------------------
      
      8 rows selected.
      
      SQL>
      

      案例 3

      SQL> EXPLAIN PLAN FOR
        2  SELECT deptno, empno, ename  FROM emp;
      
      Explained.
      
      SQL>
      SQL> SELECT * FROM TABLE(dbms_xplan.display);
      
      PLAN_TABLE_OUTPUT
      --------------------------------------------------------------------------------
      Plan hash value: 3956160932
      
      --------------------------------------------------------------------------
      | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
      --------------------------------------------------------------------------
      |   0 | SELECT STATEMENT  |      |    14 |   182 |     3   (0)| 00:00:01 |
      |   1 |  TABLE ACCESS FULL| EMP  |    14 |   182 |     3   (0)| 00:00:01 |
      --------------------------------------------------------------------------
      
      8 rows selected.
      
      SQL>
      

      因此,所有三个测试用例都表明完全没有区别。

      【讨论】:

      • 虽然我完全同意你的回答,但我认为当你选择一个只有 14 行和几列的表格时,无论如何你都不会看到任何不同。
      • 这只是一个例子,我想用一百万个循环在 PL/SQL 中显示它并显示时间。但是,这点小事太费劲了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多