Ziy*_*ang 113 sql performance where-clause
假设我有一个名为PEOPLE3列的表ID, LastName, FirstName,这些列都没有被索引.
LastName更独特,FirstName更不独特.
如果我做2次搜索:
select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"
Run Code Online (Sandbox Code Playgroud)
我的信念是第二个更快,因为更独特的标准(LastName)在where条款中排在第一位,记录将更有效地消除.我不认为优化器足够聪明,可以优化第一个sql.
我的理解是否正确?
mar*_*c_s 91
不,这个顺序无关紧要(或者至少:无所谓).
任何体面的查询优化器都将查看该子句的所有部分,WHERE并找出满足该查询的最有效方法.
我知道SQL Server查询优化器会选择一个合适的索引 - 无论你有两个条件在哪个顺序.我假设其他RDBMS将有类似的策略.
重要的是你是否有合适的索引!
对于SQL Server,如果您有以下情况,它可能会使用索引:
(LastName, FirstName)(FirstName, LastName)(LastName)或just (FirstName)(或两者)的索引另一方面 - 再次为SQL Server - 如果您使用从表中SELECT *获取所有列,并且表相当小,那么查询优化器很可能只执行表(或聚簇索引)扫描而不是使用索引(因为查找完整数据页以获取所有其他列的速度非常快).
Gor*_*off 18
WHERE子句的顺序不应对符合SQL标准的数据库产生影响.大多数数据库都不保证评估顺序.
不要以为SQL关心订单.以下在SQL Server中生成错误:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Run Code Online (Sandbox Code Playgroud)
如果首先执行此子句的第一部分,则只将数字表名称转换为整数.但是,它失败了,提供了一个明确的例子,SQL Server(与其他数据库一样)不关心WHERE语句中子句的顺序.
| 归档时间: |
|
| 查看次数: |
64899 次 |
| 最近记录: |