0

A と B の 2 つのテーブルがあります。これらのテーブルは A.bid = B.id でリンクされています。テーブル A には 19 列、テーブル B には 10 列があります。両方のテーブルには、約 40,000 のレコードが含まれています。

私は次の 3 つの単純なクエリを見てきました。

-- Query 1
SELECT Col1, Col2, Col3, Col4, Col5 FROM A, B
WHERE A.bid = B.id

-- Query 2
SELECT * FROM A

-- Query 3
SELECT Col1 FROM A

私が興味深いと思ったのは、クエリ 2 の実行に最も時間がかかり、次にクエリ 1 (結合) が続き、クエリ 3 (より制限的な射影) が最も速いということです。3 つのクエリはすべて同じ数の行を返します。

この動作の原因は何ですか? プロジェクションの列数がパフォーマンスに大きな影響を与えるのはなぜですか? もちろん、プロジェクションが無料ではないことは理解していますが、(より制限されたプロジェクションを使用しても)結合が単純なSELECT *操作よりも高速に(はるかに高速に)実行される方法がわかりません。

ありがとう。

4

2 に答える 2

1

SELECT *を使用すると、テーブル内のすべての列が返されることを覚えておく必要があります。

これは、データベース エンジンがすべての列とすべての行を読み取る必要があることを意味します。これは、テーブル A の場合はさらに多くなります。また、このデータは転送する必要があります。そのため、ネットワーク トラフィックも大量に発生する可能性があります。

たとえば、SQL Server では、含まれる列 (インデックスと共に格納されるが、インデックス自体には影響しない列) を使用してインデックスを作成できます。

これにより、選択でよく使用するインデックスに含まれる列を指定できます。実際の列の結合またはフィルタリングではなく、表示または計算で使用される追加の列です。

テーブルがある場合は、列が含まれている列に INDEX を使用してTABLE_A、列を使用してみましょうA-ZA,B,CD,E,F

クエリ

SELECT A,B,C,D,E,F
FROM TABLE_A
WHERE A = ?A
AND B = ?B
AND C = ?C

このようなインデックスを使用できます。

クエリを実行する場合

SELECT *
FROM TABLE_A
WHERE A = ?A
AND B = ?B
AND C = ?C

クエリ エンジンは問題の行を簡単に識別できますが、インデックスに含まれていない列を取得するためにルックアップを実行する必要があります。

于 2013-05-30T12:58:21.200 に答える
0

Sqlエンジンは条件で使用されていなくても、選択する19列すべてを取得しているため、クエリ1では実行する列と条件が7つしかないため、これは正常です。

于 2013-05-30T12:59:39.763 に答える