如果我有一个包含3列的表格,Column A
Column B
和Column 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()
答案 0 :(得分:1)
我不相信任何 SQL标准规定了各个语句的性能要求,因此它实际上完全在实现的控制之下。
然而,如果存在重大差异,我会非常感到惊讶,因为大部分时间只是检索数据并交付数据。
大多数DBMS'在尝试执行语句之前对语句进行一些分析,以便它们可以减少对检索阶段的影响。比如确定是否可以通过仅索引读取检索所有数据,或者选择正确的索引来使用最小基数。
因此,您的列顺序可能无法在从分析到执行的过渡中继续存在(在向用户提供数据时,必须为select
重新设置它但insert
或update
)却不是这样。
可能存在微小差异,这是因为从存储在记录中的顺序重新排序数据,但是,如果它很重要,则应该转移到更好的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>
因此,所有三个测试用例都显示完全没有区别。