2

您在构建查询时指定的顺序是否会影响性能?或者 SQL 进行智能过滤。

例如假设我有一个包含 200 万条记录的 Employee 表:

Employee( emp_id, name, dept_id, country_id )

不要说我想获得国家 id 500 和部门 id 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 电机处理查询的方式。

4

3 回答 3

1

大多数现代 RDMBS 不会WHERE对语句的 - 部分中的值顺序有问题,它们的查询优化器在大多数情况下会按照您描述的方式对其进行排序,以最大限度地提高性能。

我知道一些较旧的 RDBMS,如果您选择“错误”的顺序,它们实际上会受到相当大的影响,但这些在过去十年中应该已经过时了。

于 2013-03-11T19:05:24.217 回答
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  

对于数量较少的第二个过滤子集,将具有更好的性能。

于 2013-03-11T19:17:53.013 回答
1

它确实会影响,尤其是当您的执行计划中有剩余谓词时,但大多数时候查询优化器会为您重新排序谓词。

当然,这假设您的索引和统计信息得到了良好的维护和更新,因此需要考虑。

进一步阅读:http ://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order

于 2013-03-11T19:29:35.530 回答