2011-10-17 18 views
1

私はアプリケーションの一部でこのステートメントを使用しています。 LIKE '%%'は、検索パラメータが送信されていないためにのみ空であるため、すべての結果が取得されます。DB2 SQLのヒント/ヒント

私はまだデータベース全体の初心者ですが、私の声明を改善するためのヒントがあるのでしょうか?

私は恐ろしいようですが、私には簡単に行ってください!

更新:私はほとんどこれからより良いパフォーマンスを得るために探しています。私は既にDB2のアドバイザーを使用して、私が作成すべきと言ったキーを作成しました。それはいくつかの助けになりましたが、私が望んでいたよりもまだ遅いです。

ありがとうございます。

SELECT * FROM 
(
    SELECT rownumber() OVER (ORDER BY pgmajdsc, item) AS ROW_NUM, 
    line, item, pgmajdsc, manufacturer 
    FROM 
    (
     SELECT iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
     FROM itemmast 
     LEFT JOIN itemweb on iline=line and iitem=item 
     JOIN linemst ON iline=lline 
     LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
     LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
     LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
     LEFT JOIN prodgrp ON iaclass=pgclass 
     WHERE ico = 01 
     AND iecomm = 'Y' 
     AND (UPPER(ITEMDESC) LIKE '%%' OR UPPER(PRODDESC) LIKE '%%' OR 
      LINE LIKE '%%' OR UPPER(MFGNAME) LIKE '%%' OR ITEM LIKE '%%' OR 
      PRODNAME LIKE '%%' OR IDESC1 LIKE '%%' OR IDESC2 LIKE '%%' OR 
      IMFGNO LIKE '%%' OR IITEM LIKE '%%') 
    ) AS TEMP 
) AS ROW_NUM 
WHERE ROW_NUM BETWEEN 0 AND 25 
ORDER BY pgmajdsc, item 
+1

フォーマットに加えて改善したいものは何ですか? –

+0

あなたはそれを別々の行に分けることで、より読みやすくなります。D – Ruben

+0

@Bead人間がDB2のパーサーで解釈できるようにこのクエリを再フォーマットする必要はありません。それを除けば、あなたはこの質問を言い換えて、**特定の質問を**求めるようにする必要があります。現在、あなたが何を答えようとしているのかは明らかではありません。 –

答えて

1

あなたは私が変化するであろう最初のものは、それがnullであるかどうかを確認するために、そのステートメントであるような句のパラメータを使用していると仮定すると、それは他のすべての比較を避けることができます。もう一つの変更は、入れ子を取り除くことです。あなたはFetch first句を使って同じ効果を達成することができます(とにかく思います)。

注:私は現時点で私の前にデータベースがないので、これはテストされていませんが、私はそれがうまくいくと確信しています。

SELECT rownumber() OVER (ORDER BY pgmajdsc, item) AS ROW_NUM, 
     iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
FROM itemmast 
    LEFT JOIN itemweb on iline=line and iitem=item 
    JOIN linemst ON iline=lline 
    LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
    LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
    LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
    LEFT JOIN prodgrp ON iaclass=pgclass 
WHERE ico = 01 
    AND iecomm = 'Y' 
    AND (parameter IS NULL 
     OR (UPPER(ITEMDESC) LIKE '%'||parameter||'%' 
     OR UPPER(PRODDESC) LIKE '%'||parameter||'%' 
     OR LINE LIKE '%'||parameter||'%' 
     OR UPPER(MFGNAME) LIKE '%'||parameter||'%' 
     OR ITEM LIKE '%'||parameter||'%' 
     OR PRODNAME LIKE '%'||parameter||'%' 
     OR IDESC1 LIKE '%'||parameter||'%' 
     OR IDESC2 LIKE '%'||parameter||'%' 
     OR IMFGNO LIKE '%'||parameter||'%' 
     OR IITEM LIKE '%'||parameter||'%')) 
ORDER BY ROW_NUM, pgmajdsc, item 
FETCH FIRST 25 ROWS ONLY 

EDIT:もう一つの考えはあなたが実際に行番号を必要とする場合を除き、あなたがそれを残し、ちょうどそう等によりご注文を行うことができます:

SELECT iline AS line, iitem AS item, pgmajdsc, ldesc AS manufacturer 
FROM itemmast 
    LEFT JOIN itemweb on iline=line and iitem=item 
    JOIN linemst ON iline=lline 
    LEFT JOIN custord ON opline=iline AND opitem=iitem AND opcust='1234' 
    LEFT JOIN cartwdtl ON cwline=iline and cwitem=iitem and cwusr='foo' AND cwcust='1234' 
    LEFT JOIN itematr ON iline=ialine AND iitem=iaitem 
    LEFT JOIN prodgrp ON iaclass=pgclass 
WHERE ico = 01 
    AND iecomm = 'Y' 
    AND (parameter IS NULL 
     OR (UPPER(ITEMDESC) LIKE '%'||parameter||'%' 
     OR UPPER(PRODDESC) LIKE '%'||parameter||'%' 
     OR LINE LIKE '%'||parameter||'%' 
     OR UPPER(MFGNAME) LIKE '%'||parameter||'%' 
     OR ITEM LIKE '%'||parameter||'%' 
     OR PRODNAME LIKE '%'||parameter||'%' 
     OR IDESC1 LIKE '%'||parameter||'%' 
     OR IDESC2 LIKE '%'||parameter||'%' 
     OR IMFGNO LIKE '%'||parameter||'%' 
     OR IITEM LIKE '%'||parameter||'%')) 
ORDER BY pgmajdsc, item 
FETCH FIRST 25 ROWS ONLY 

私はパフォーマンスにどのくらいのヒットかわかりませんあなたがそれを必要としない場合、それを返す必要はありません。

+0

よく私は、このWHERE ROW_NUMと0と25の間で使用しました。ユーザーがどのページを使用しているかに基づいて変更するので、次は26-50になる可能性があります。 – Bead

+0

SQL標準(およびDB2も同様)は短絡ロジックに従わないことに注意してください。実際、[マニュアル](http://tinyurl.com/6ay2mqc)p.201(iSeriesを想定)では、「括弧内の条件が最初に評価される」と述べています。私はまだこれらの行に沿ってステートメントを構造化する可能性があります:動的SQLに頼らずにパラメータの存在に基づいて条件を 'オフ'にすることができます(オプティマイザはこれを認識し、いずれかの方法)。 –