2011-12-31 87 views
4

什么是查询的excution顺序,如:在SQL查询的执行顺序WHERE子句

SELECT * FROM [users] WHERE [userid] = 50001 AND [username] = 'new user' 

我的问题是什么将首先用于匹配 - [用户ID]或[用户名]。

等都会影响执行时间。

任何改进此查询的建议都将被appriciated。

回答

6

答案取决于您提供给SQL引擎的索引。如果userid被索引,但是username不是,则引擎是可能是userid开头;如果username被索引但userid不是,那么引擎将可能是开头的名称;如果两个字段都被索引,引擎将搜索该索引,并通过内部ID查找行。请注意,所有这些都高度依赖于您正在使用的RDBMS。当行数很少时,一些引擎会放弃索引搜索,以支持全表扫描。

+0

假设两列都是非索引的,那么首先会执行什么(因为这是一个例子,我只展示了两个匹配的条件,但如果有这么多的AND条件会怎么样)? – nirav 2011-12-31 04:46:58

+1

@ nirav.patel在没有索引的情况下,RDBMS可以自由选择它计算的任何顺序,从而获得最佳性能。一些RDBMS引擎(例如Oracle)会计算您的数据分散的统计数据以选择最佳订单。例如,如果RDBMS知道您的ID列在40000行的表中具有40000个不同的值,并且名称具有3000个不同的值,则它首先会查看ID,因为它承诺提供更具体的答案。 – dasblinkenlight 2011-12-31 05:01:52

+0

如何找到哪些列在pl/sql中编入索引? – 2016-04-14 16:15:18

0

基于SQL的数据库引擎通常会根据群集(数据记录的物理顺序)和任何可用索引进行优化。 MySQL和MS SQL Server(至少也是很多其他的)都足够聪明,可以知道执行过滤器的顺序来优化查询。

出于您的目的,没有关系,并且执行结果将以完全相同的方式,以相同的性能顺序排列。

+0

但是,如果AND条件更多地说15,那么在那种情况下将会是什么序列。 – nirav 2011-12-31 04:45:15

2

该数据库将决定什么顺序执行的条件。

通常(但并不总是)将首先在可能情况下使用索引。

你可以看到在条件或加入如何有待优化: - SQLStatementExecution - Example Discussion1 - Example Discussion2 - Example Discussion3

一般来说,WHERE子句评估和优化的标准顺序通过查询优化器创建执行计划之前。这很好。不过,我鼓励您在投入生产之前查看每个查询的查询执行计划。