sql语句中的列顺序是否会影响查询的速度?

时间:2015-03-27 02:49:06

标签: mysql sql sql-server oracle

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

如果我的select语句与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 个答案:

答案 0 :(得分:1)

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

然而,如果存在重大差异,我会非常感到惊讶,因为大部分时间只是检索数据并交付数据。

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

因此,您的列顺序可能无法在从分析到执行的过渡中继续存在(在向用户提供数据时,必须为select重新设置它但insertupdate)却不是这样。

可能存在微小差异,这是因为从存储在记录中的顺序重新排序数据,但是,如果它很重要,则应该转移到更好的DBMS。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  如果我的select语句类似于从表中选择列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>

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