2

クエリを作成するときに指定する順序はパフォーマンスに影響しますか? または、SQL がスマート フィルタリングを行います。

たとえば、200 万件のレコードを持つテーブル Employee があるとします。

Employee( emp_id, name, dept_id, country_id )

国 ID が 500 で部門 ID が 17 の従業員の ID と名前を取得したいとは言えません。 .

私が行うと、パフォーマンスの違いが生じますか?

SELECT *
FROM employees
where dept_id = 17 and country_id= 500

私がするよりも:

    SELECT *
    FROM employees
    where  country_id= 500 and dept_id = 17

後者がテーブルを 100 万に削減し、そこから残りを実行すると仮定すると、最初のクエリは 300k に削減され、そこから 2 番目のフィルターを実行します。

ただし、前に述べたように、これが SQL モーターがクエリを処理する方法であるかどうかはわかりません。

4

3 に答える 3

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  

2 番目のフィルタリング サブセットの数が少ないほど、パフォーマンスが向上します。

また、言及するために、

両方の非クラスター化インデックスが存在する場合、

次に、クエリ -

SELECT *
    FROM employees
    where  dept_id = 17 and country_id= 500  

2 番目のフィルタリング サブセットの数が少ないほど、パフォーマンスが向上します。

于 2013-03-11T19:17:53.013 に答える
1

特に実行計画に述語が残っている場合は影響しますが、ほとんどの場合、クエリ オプティマイザーが述語を並べ替える作業を行います。

もちろん、これはインデックスと統計が適切に管理され、更新されていることを前提としているため、それを考慮する必要があります。

さらに読む: http://sqlserverpedia.com/wiki/Index_Selectivity_and_Column_Order

于 2013-03-11T19:29:35.530 に答える
1

ほとんどの最新の RDMBS ではWHERE、ステートメントの - 部分の値の順序に問題はありません。ほとんどの場合、それらのクエリ オプティマイザーは、パフォーマンスを最大化するために説明した方法で並べ替えます。

「間違った」順序を選択すると実際に大きな影響を受ける古い RDBMS をいくつか知っていますが、それらは過去 10 年間で時代遅れになっているはずです。

于 2013-03-11T19:05:24.217 に答える