SQLのようなパフォーマンスのワイルドカード(%)としての価値
-
05-07-2019 - |
質問
私はその性能のクエリーのようなもののようなキーワードにワイルドカードとしての価値の比較をwhere節です。
検討をwhere節など"のように'%'".この場合、全て可能な値の列'a'.どのようなことなのwhere節です。
その理由をお願いいことしている場合がある分野のユーザが指定した値を検索します。場合には、ユーザーのように検討を重ねてまいりました。私は現在使用し、単一クエリのようになります:
SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?
価値に'%'と'%'を供給することができます試合全ての値、またはb.この便利なかではモーバイルコンピューティングの名前のクエリを入れます。どんな性能を考慮しています。のクエリ-オプティマイザの削減のように'%'を単純に一致す。を実現するためを使用してい名前のクエリ(意書の場合にも影響を与えたと言えるのでしょうか。私の回答はデータベース固有のものです。では具体的にはどのようにこの作品は、Oracle、MS SQLサーバーのダービー.
の代替アプローチする3つの別々のクエリーのユーザー入力、ワイルドカード.
Aワイルドカード:クエリを
SELECT * FROM TableName WHERE b LIKE ?
Bにはワイルドカード:クエリを
SELECT * FROM TableName WHERE a LIKE ?
AとBはワイルドカード:
SELECT * FROM TableName
ないワイルドカード:
SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?
に明らかに単一クエリは最もシンプルで、簡単ナンス性の向上にも寄与します。されているのではないかと思い用のクエリの場合の性能が良いです。
解決 3
つくろうと思いましたが、教科書かないで大きく異なり異なるデータベースです。の応答を示すかを動かして行く必要があるので試験がうと思います。
自主目標は、ダービー、MS SQLやOracleデータベースです。以来、ダービーで実行される組込みが簡単にセットアップでき、試験学三田キャンパスにて行われることです。この結果は驚きです。いたしまし最悪の場合シナリオに対してかなり大きます。また、試験1000回の平均。
クエリの1:
SELECT * FROM TableName
クエリー2(値のa="%"b="%"):
SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?
クエリの1平均時間:178ms
クエリの2つの平均時間:181ms
で性能ダービーとほぼ同じ間ます。
他のヒント
SQLサーバー一覧
WHERE City LIKE 'A%'
とて
WHERE City >= 'A' AND City < 'B'
...と、楽しく使用の指標を求めなければなりません。と言っても一般的に入ってから私は見たことがない簡素化場合があります。
あい:
WHERE City LIKE '%ville'
...次の指標を追求することを目的とするものである。
ものなど簡単なもの:
WHERE City LIKE '%'
れに相当す:
WHERE City IS NOT NULL
利用できなクエリの解析にDBMSには、例えば EXPLAIN
のためのMySQL、 SET SHOWPLAN_ALL ON
MS SQLを使用し、 その他の方法), EXPLAIN PLAN FOR
Oracle)どのようにクエリが実行されることはありません。
他のDBMSの価値その塩もして LIKE '%'
条項の前にもう走りを返します。私はかなり確実などの見DB2/zこの実行計画の策定。
の算書いくこすることによって 実 SQLになる前に実行エンジンです。
しかし、すべての最適化問題 の措置なっ!DBAsからこそ存在が常にチューンのDBMSに基づく実際のデータ変化する。での観光スポットを表示一部の観光、時間の実行計画)すべてのバリエーションに適した静的データがあります。
知っているクエリのように:
select c from t where ((1 = 1) or (c = ?))
は 最適化された全体を削除しwhere条項の条件実行前(DB2とにかく前にお願いをの構築に役立つ場所を削除する必要があるのは、where節が維持のプレースホルダパラメータを使用BIRT Javascriptを変更するクエリーのためのワイルドカード)).
ダービーには、ツールの検討のための実際のクエリプランを使用した、実行できる実験用のダービーパークエンダービーに選びました。きーゲーム-Dderby.言語です。logQueryPlan=true、ダービーのままのクエリプランにダービー.ログを使用できますRUNTIMESTATISTICS施設としてここで記載している: http://db.apache.org/derby/docs/10.5/tuning/ctundepth853133.html
くなった場合はダービーはストリップには、のように'%'の時間もしないと思うのが存在する条項導入の減速などの命令の高速実行を実現します。
さんに非常に興味のある方は実際のクエリプラン出力でいただく環境をみると、となるように'%'の項です。
Oracle10gR2が表示されない、特別最適化のためのこうした状況になることを認識するように'%'を除くnull.
create table like_test (col1)
as select cast(dbms_random.string('U',10) as varchar2(10))
from dual
connect by level <= 1000
/
insert into like_test values (null)
/
commit
/
exec dbms_stats.gather_table_stats(user,'like_test')
explain plan for
select count(*)
from like_test
/
select plan_table_output from table(dbms_xplan.display)
/
explain plan for
select count(*)
from like_test
where col1 like '%'
/
select plan_table_output from table(dbms_xplan.display)
/
explain plan for
select count(*)
from like_test
where col1 is not null
/
select plan_table_output from table(dbms_xplan.display)
/
...を...
Plan hash value: 3733279756
------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| LIKE_TEST | 1001 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------
...と---
Plan hash value: 3733279756
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 10 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 10 | | |
|* 2 | TABLE ACCESS FULL| LIKE_TEST | 1000 | 10000 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("COL1" LIKE '%')
...と---
Plan hash value: 3733279756
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 10 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 10 | | |
|* 2 | TABLE ACCESS FULL| LIKE_TEST | 1000 | 10000 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("COL1" IS NOT NULL)
注のカーディナリティ(行)のテーブルにアクセスフルライン
によってどのように述語構造の分野におい試験が必要なときは、フルテーブルスキャン!意味的に'%'がことを意味しているフルテーブルスキャンがSqlサーバーはあらゆる最適化の社内のクエリ.その質問につながはSqlサーバーの最適化により構成されている。述語形成と'%'と投げ出ることができなければ、このWHERE?
一つの側面であるかを議論することにOP望を用います。当時の計算書を作成し、データベース/プティマイザはできませんので、起等以上のような最適化の a like '%'
としての価値を知られていないので準備します。
そのため:
- 使用時もしていなニュアルレポートを見る(0、a、b、両方の利用により、適切な時に必要な
- だくより良い性能を利用しない場合は、用意書きにこだわりは一つだけ書きがでしょうか簡単にいてくれたみなさま、本当にありが空の状態)
えばカラムがnull以外の空白はどのようなものか?検索もしております。
このクエリーのための実世界応用を試し用の無料のテキスト指数付けの特徴で最も近代的なsqlデータベースです。の性能に問題が軽微であります。
単純合算 た場合(B) 検索b の他(A) 検索 else B 検索b else 教えてユーザーのなかった特に何も指定し
は自明であるが維持なくしてわかりやすいのではなく、前提になります。さんも一緒に戦ってくれるかなというのUIとにかく表示すると結果"のご見つかり×"や"検索コマーシャルペーパーが..."
なんなのかの値を用いて作算書のようなパラメータだけを記述する.その理由はい抜かのクエリ-オプティマイザへの準備を行いるところは完全に間違いによって、パラメータが'%'.
たとえば書を作成した実行計画のインデックスカラムでのパラメータ欄に'%'が経験している。
where句と"のように'%'"としてのみ述語行動するような全く同じなのwhere節です。