2012-03-27 14 views
0

このクエリのパフォーマンスを向上させようとしています。それを最適化するために私ができることは何ですか?このクエリを改善しようとしています

SELECT * FROM bldng 
WHERE bldng_type LIKE '%PTR%' OR bldng_type LIKE '%FACILITY-A%' 
OR bldng_type LIKE '%FACILITY-B%' AND area_sqf > 500 
+1

あなたが必要がない場合すべての列で '*'を必要な列のリストに置き換えることができます。 – JKirchartz

+1

データに依存しないことはほとんどできません。あなたの問い合わせは、 'bldng.bldng_type'のすべての単一値の内容全体を調べることに依存します。 'bldng'が大きければ遅くなります。代わりに、このような問合せが不要なように表のデザインを改善する必要があります。 – ruakh

+0

'bldng_type'カラムに入る文字列の完全なリストはどれくらいですか? – dasblinkenlight

答えて

0

SQL Serverを使用している場合は、Table Hints (MSDN link)を使用できます。 NOLOCKは一般的です。

1

ワイルドカードのプレフィックスのため、bldngのフルスキャンを実行します。ワイルドカード接頭辞を削除してbldng_typeにインデックスを追加すると、パフォーマンスが大幅に向上するはずです。 %text%が遅い

1

「%検索文字列%」を使用しているため、末尾の2つの記号がそれらの列のインデックスを壊します。代わりに全文索引を使用する方が良いでしょう。あなたが本当の性能と正確さを望むなら、LuceneまたはSphinx全文検索エンジンを使うことができます。

+0

ちょうど私が言うつもりだった。私はまた、多くの人が必要としないときにこの構造を使用し、最初の文字をワイルドカードにする必要がない場合は、それを除去することを指摘します。 OPがそれを使用している場合、SQL Serverにはフルテキスト検索もあります。 – HLGEM

+0

さて、CASE文も同様に役立ちますか?私はそれについて考えていましたが、それがより効率的かどうかは分かりません。 – dido

+0

データベース内からluceneまたはsphinx関数を呼び出すことはできません。しかしそれは興味深い概念です。 – Luke101

0

インデックス化area_sqf*ではなく、必要な列のみを指定すると役立ちます。

1

建物のさまざまなカテゴリを選択しようとしているようです。 bldngテーブルに 'bldng_category'カラムを入れることをお勧めします。この方法は、あなたがこのように単純なクエリを使用することができます。 をbldng FROM

SELECT * WHERE( 'PTR'、 'FACILITY_B'、 'FACILITY-B')でbldng_categoryとarea_sqf> 500

関連する問題