2017-09-13 12 views
0
INSERT INTO tab2 NOLOGGING 
SELECT 
    ID, 
    ORG_NAME 
FROM tab3 
WHERE ((upper(NVL(org_name,company_given)) LIKE '%MSOFT%' 
OR upper(NVL(org_name,company_given)) LIKE 'M SOFT' 
OR upper(NVL(org_name,company_given)) LIKE '%MISOFT%' 
OR upper(NVL(org_name,company_given)) LIKE 'MSN %' 
OR upper(NVL(org_name,company_given)) LIKE '%N APP%' 
OR upper(NVL(org_name,company_given)) LIKE '%NAPP%' 
OR upper(NVL(org_name,company_given)) LIKE '%NAPPE%' 
OR upper(NVL(org_name,company_given)) LIKE '%NAPPS%' 
OR upper(NVL(org_name,company_given)) LIKE '%NEK%APPLIANCE%' 

上記のコーディングには時間がかかりすぎます。テーブルtab3は非常に巨大です。 上記は動的です。 nvlの代替手段はありますか?上位とnvl関数を含むクエリのパフォーマンスを向上させます。

答えて

1

OR upper(NVL(org_name,company_given)) LIKE 'M SOFT' 

下の行は

OR ((orgname is not null and upper(org_name) LIKE 'M SOFT') 
    OR ((orgname is null and upper(company_given) LIKE 'M SOFT') 

ない、それは高速です確かに置き換えることができます。

また、あなたは、テーブル内のname_for_filter列を導入し、トリガーで一度それを埋めることであろうサブクエリ

SELECT * 
FROM (
    SELECT 
     ID, 
     ORG_NAME, 
     upper(NVL(org_name,company_given)) as name_for_filter 
    FROM tab3) 
WHERE name_for_filter LIKE '%MSOFT%' 
    OR name_for_filter LIKE 'M SOFT' 
... 

最良の方法で一度それを実行しようとすることができます。次に、この列をフィルタリングに使用できます。

1

このクエリは、テーブルのフルテーブルスキャンを実行します。あなたはテーブルが巨大だと言うので、長い時間がかかります。

通常のインデックスは、再生中に2つの列があるため役立ちません。このようにもファンクション索引...

create index fbi3 on tab3(upper(NVL(org_name, company_given))) 

インデックスが前面にワイルドカードを持つlikeフィルタに対して役に立たない、とあなたはそれらの持っているので...助けにはなりません。

LIKE '%NEK%APPLIANCE%' 

これが1回限りの練習である場合、私はあなたが時間を飲み、その声明が終わるのを待つことを勧めます。しかし、このような種類のクエリを頻繁に実行したいと仮定しましょう。もしそうなら、それをサポートするインフラを構築する価値があります。

  1. 検索条件の新しい列。基本的には、関数で使用される引数があらかじめ設定されている列です。 11gの以上、この仮想列にする:あなたは、通常の列を構築し、トリガを移入する必要がありますデータベースの古いバージョンを使用している場合

    alter table tab3 add search_name as (upper(NVL(org_name, company_given)));

  1. search_name列にテキストインデックスを作成します。短いので、トランザクションで管理されるCTXCATインデックスを使用することができます。
  2. like演算子の代わりにcatsearch()構文を使用するようにクエリを書き直す必要があります。 Find out more
+0

tab3が表示されます。私はこのビューの上にビューを作成する場合。 {view tab3_vwをselect org_name、upper(NVL(org_name、company_given))をtab3からorg_name1として作成する}このビューでSelect操作が実行されると、パフォーマンスが向上します。 – user3165555

0

既に提案されているように、準備された検索列を作成するのが最善でしょう。たとえば、'N APP''NAPP'の両方の検索を避けるためにスペースを削除することもできます(ただし、場合によっては誤検出の可能性があります)。

pseudocode: 

    'MSN %' 
or ('%SOFT%' and ('M SOFT' or '%MSOFT%' or '%MISOFT%')) 
or ('%APP%' and ('%N APP%' or '%NAPP%' or '%NEK%APPLIANCE%')) 

SOFT場合やAPPが見つからない:使用しているときあなたはすでにそれがより速くなるはずです%NAPP%

を含むレコードが含まれているため、あなたが%NAPPE%%NAPPS%のチェックを削除することができますその上で

同じ単語を含む他のものを確認する必要はありません。andは、最初の部分がすでにfalseである場合は避けます。

これは単なる例であり、これらのパラメータが可変であれば、(SQLサーバーがそれをしていない限り)それらの検索条件を最適化するコードを書くことができます。

関連する問題