假设我有一个名为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.
我的理解是否正确?
从性能的角度来看,我的SQL WHERE语句的顺序是否有所不同?
例如
SELECT ... FROM ...
WHERE a > 1
AND b < 2
Run Code Online (Sandbox Code Playgroud)
会比这更快/更慢吗?
SELECT ... FROM ...
WHERE b < 2
AND a > 1
Run Code Online (Sandbox Code Playgroud)
让我们假设我事先知道a > 1会缩小结果集.
另外,如果我按照WHERE语句的顺序加入两个或更多表,这有关系吗?
有没有办法明确说明发生WHERE条件的顺序?我意识到查询优化器将查看WHERE子句的所有部分,以确定满足查询的最有效方法,如以下答案中所述:
但是,有没有办法检查其他条件会依赖的条件?这些线程的答案之一涉及到我所追求的,但没有提供解决方案:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
Run Code Online (Sandbox Code Playgroud)
这可能会失败,因为可以在确定table_name字段是否为数字之前评估CAST(因此会为无效转换引发错误).
当然必须有办法实现这一目标吗?
我不认为它对数据库有任何影响,但在连接表时,您更喜欢编写条件:
SELECT
...
FROM AAA
INNER JOIN BBB ON AAA.ID=BBB.ID
WHERE ...
Run Code Online (Sandbox Code Playgroud)
要么
SELECT
...
FROM AAA
INNER JOIN BBB ON BBB.ID=AAA.ID
WHERE ...
Run Code Online (Sandbox Code Playgroud)