SQL ワイルドカード:パフォーマンスのオーバーヘッド?
-
18-09-2019 - |
質問
この質問を Google で検索しましたが、一貫した意見や、確かなデータに基づいた多くの意見が見つからないようです。SQL SELECT ステートメントでワイルドカードを使用すると、各項目を個別に呼び出す場合よりも追加のオーバーヘッドが発生するかどうかを知りたいだけです。いくつかの異なるテスト クエリで両方の実行計画を比較しましたが、推定値は常に同じであるようです。他の場所でオーバーヘッドが発生する可能性はありますか、それとも本当に同じように処理されるのでしょうか?
私が特に言及しているのは次のとおりです。
SELECT *
対
SELECT item1, item2, etc.
解決
SELECT * FROM...
そして
SELECT every, column, list, ... FROM...
どちらも最適化されていないスキャンであるため、同じように実行されます
違いは次のとおりです。
- 解決するための sys.columns 内の追加の検索 *
- テーブルスキーマが変更された場合の契約/署名の変更
- カバリングインデックスを作成できない。実際、チューニングオプションはまったくありません
- スキーマバインドされていない場合はビューを更新する必要がある
- * を使用してビューにインデックスを付けたりスキーマバインドしたりすることはできません
- ...その他
同じテーマに関する他の SO の質問...
他のヒント
ということですか? select * from ...
の代わりに select col1, col2, col3 from ...
?
列に名前を付けて最小限の情報を取得する方が常に良いと思います。
- コードは、データベース内の列の物理的な順序とは無関係に機能します。列の順序はアプリケーションに影響を与えることはありませんが、使用する場合は影響を受けるでしょう。
*
. 。データベースの移行などの場合には危険な可能性があります。 - 列に名前を付けると、DBMS は実行をさらに最適化できます。たとえば、関心のあるすべてのデータを含むインデックスがある場合、そのテーブルにはまったくアクセスされません。
「ワイルドカード」が別のことを意味している場合は、私の答えを無視してください...
EDIT:あなたはSelect * From ...
のようにアスタリスクワイルドカードの話をしている場合は、他の回答を参照してください...
以下に説明するように、あなたはその後、(_ , % )
、述語句でワイルドカード、またはオペレータのように使用して他のクエリ式の話をしている場合:
これは、ワイルドカードを使用すると、SQLは「SARG-ABLE」であるか否かに影響するかどうかに関係しています。検索引数可能、(検索引数可能な)は、既存のインデックスにエントリのパラメータとして使用できるかどうか、クエリの検索や引数を並べ替えることを意味します。あなたは、引数の先頭にワイルドカードを付加した場合、
Where Name Like '%ing'
すると 'ING' での の終わりのののノードを見つけるために、名前フィールドにインデックスをトラバースする方法はありません。
あなたが最後にワイルドカードを追加大藤場合は、
Where Name like 'Donald%'
、オプティマイザは、まだ名前の列に索引を使用することができ、およびクエリがまだSARG-ことができます。
野生の車は*です。それは自己によるパフォーマンスのオーバーヘッドを意味するものではありません。テーブルが拡張されている場合しかし、あなた自身が、あなたが検索しないフィールドを取得見つけることができます。 一般に、フィールド内の特定されて、あなたは、検索や挿入しない悪い癖です。 考えてみましょう。
insert into mytable values(1,2)
テーブルは三つのフィールドに拡張された場合に何が起こる?
これは、実行計画の観点から、より多くの仕事ではないかもしれません。あなたが実際には必要のない列をフェッチしている場合しかし、それは、データベースとアプリケーションの間で使用されている追加のネットワーク帯域幅です。あなたが返されるデータ(例えば、Perlのselectall_hashref
)上のいくつかの作業を行い、高レベルのクライアントAPIを使用している場合も、それらの余分な列は、クライアント側のパフォーマンスコストを課すことになります。いくら?依存ます。