Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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_Sql Server_Oracle - Fatal编程技术网

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

Mysql sql语句中列的顺序是否会影响查询的速度?,mysql,sql,sql-server,oracle,Mysql,Sql,Sql Server,Oracle,如果我的表有3列,列a列B和列C 如果我的select语句类似于从表中选择A列、B列和C列,查询是否会更快?如果是则从表中选择A列、C列和B列 更新和插入也一样 updatetable set Column A=''、Column B=''、Column C=''和updatetable set Column A=''、Column C=''、Column B='' 插入表(A列、B列、C列)中的值()和插入表(A列、C列、B列)中的值()我不相信任何SQL标准规定了单个语句的性能要求,因此它实

如果我的表有3列,
列a
列B
列C

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

更新和插入也一样

updatetable set Column A=''、Column B=''、Column C=''
updatetable set Column A=''、Column C=''、Column B=''

插入表(A列、B列、C列)中的值()
插入表(A列、C列、B列)中的值()

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

但是,如果有实质性的差异,我会非常惊讶,因为大部分时间都是简单地检索数据并交付数据

大多数数据库管理系统在执行语句之前都会对语句进行一定程度的分析,以便减少对检索阶段的影响。例如,确定是否所有数据都可以通过只读取索引来检索,或者选择正确的索引以使用最小基数

因此,您的列顺序可能无论如何都无法在从分析到执行的转换过程中保持不变(在向用户交付数据时,必须为
select
重新设置列顺序,但为
insert
update
重新设置列顺序)


从数据在记录中的存储顺序重新排序数据可能会导致微小的差异,但如果差异很大,则应移到更好的DBMS。

否,而不是在选择或更新列中。顺序可能起作用的地方是GROUP BY/order BY子句。优化器将根据成本对WHERE子句和联接条件中的谓词重新排序

如果我的select语句类似于从表中选择列A、列B、列C,那么查询是否更快?如果是从表中选择A列、C列和B列,该怎么办

我看到您已使用多个RDBMS标记进行标记。我的答案只适用于Oracle

在Oracle SQL中,选择列表中列的顺序对查询的性能没有影响。

让我们来测试和验证:

案例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>

因此,这三个测试用例都表明它们之间完全没有区别。

为什么不自己测试并验证呢。我已经提供了3个测试用例,请看我的答案。虽然我完全同意你的答案,但我不认为当你选择一个只有14行和几列的表时,你在任何情况下都不会看到任何区别。这只是一个例子,我想用PL/SQL显示它,并显示一百万个循环和计时。但是,对于这件琐碎的事情来说,这太费劲了。