DB2 SQL Советы / Подсказки - PullRequest
       16

DB2 SQL Советы / Подсказки

1 голос
/ 17 октября 2011

Я использую это утверждение в части моего приложения, оно сгенерировано.LIKE '%%' пусто только потому, что ему не был отправлен поисковый параметр, поэтому он извлекает все результаты.

Я все еще новичок во всей базе данных и хотел бы знать, есть ли какие-нибудь советы дляулучшать мое высказывание?

Я уверен, что это выглядит ужасно, но, пожалуйста, будьте осторожны со мной!

Обновление: я в основном рассчитываю на то, чтобы улучшить производительность от этого.Я уже использовал советник 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 Ответ

1 голос
/ 17 октября 2011

Предполагая, что вы используете параметр для подобных предложений, первое, что я хотел бы изменить, - это утверждение, чтобы проверить, является ли оно нулевым, оно избежит всех других сравнений. Другим изменением будет удаление вложенности. Вы можете добиться того же эффекта (я думаю, в любом случае) с помощью первого предложения Fetch.

ПРИМЕЧАНИЕ. Это не проверено, так как в данный момент у меня нет базы данных, но я уверен, что это сработает.

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

РЕДАКТИРОВАТЬ: Другая мысль заключается в том, что если вам не нужен номер строки, вы можете его опустить и просто выполнить свой заказ следующим образом:

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

Я не знаю, насколько сильно сказывается производительность при расчете числа, но если вам это не нужно, возвращать его не нужно.

...