构建查询时指定的顺序是否会影响性能?或者SQL做智能过滤。
例如,假设我有一个包含200万条记录的表Employee:
Employee( emp_id, name, dept_id, country_id )
不要说我想获得国家ID 500和部门17的员工的ID和名称。 不要说那个部门大约有300k,而那个国家大约有100万,但那些符合这两个标准的人的结果是50k。
如果我这样做会产生性能差异:
SELECT *
FROM employees
where dept_id = 17 and country_id= 500
比我做的那样:
SELECT *
FROM employees
where country_id= 500 and dept_id = 17
假设后者将表减少到100万,那么从那里做其余的 第一个查询将减少到300k并从那里进行第二次过滤。
但是如前所述,我不确定这是SQL电机如何处理查询。
答案 0 :(得分:1)
大多数现代RDMBS都不会对WHERE
- 语句中的值的顺序有问题,他们的查询优化器在大多数情况下会按照您描述的方式对其进行排序以最大化性能
我知道一些较旧的RDBMS,如果选择“错误”的订单,实际上会受到很大的影响,但在过去的十年里,这些应该是不合时宜的。
答案 1 :(得分:1)
在上表中,
如果有非聚集索引 -
表中的(country_id,dept_id,employee_id),
然后查询 -
SELECT *
FROM employees
where country_id= 500 and dept_id = 17
会有更好的表现。
和
如果有非聚集索引 -
表中的(dept_id,country_id,employee_id),
然后查询 -
SELECT *
FROM employees
where dept_id = 17 and country_id= 500
会有更好的表现。
如果没有非聚集索引,
然后查询 -
SELECT *
FROM employees
where dept_id = 17 and country_id= 500
第二过滤子集的性能会更好。
另外,
如果非聚集索引都存在,
然后查询 -
SELECT *
FROM employees
where dept_id = 17 and country_id= 500
第二过滤子集的性能会更好。
答案 2 :(得分:1)
它确实会影响,尤其是当您的执行计划中有剩余谓词时,但大多数情况下查询优化器将为您重新排序谓词。
当然,假设您的索引和统计信息得到了很好的维护和更新,因此需要考虑到这一点。
进一步阅读:http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order