2011-10-17 3 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 절을 사용하여 동일한 효과를 얻을 수 있습니다 (필자는 어쨌든 생각합니다).

참고 : 현재로서는 나 앞에서 DB가 없으므로 테스트되지 않았지만 제대로 작동 할 것이라고 확신합니다.

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 

모르겠어요을 얼마나 히트 성능에 rownumber를 계산하는 중이지만, 필요하지 않으면 반환 할 필요가 없습니다.

+0

글쎄, 내가 어디서 ROW_NUM 0과 25 사이에 이걸 사용했는데, 나는 사용자가 어떤 페이지에 있었는지에 따라 그것을 바꿀 것이다. 그래서 다음은 26-50 일 것이다. – Bead

+0

SQL 표준 (및 DB2)도 단락 논리를 따르지 않음을 유의하십시오. 실제로 [수동] (http://tinyurl.com/6ay2mqc) p.201 (iSeries 용으로 가정)에는 '괄호 안의 조건이 먼저 평가됩니다'라고 나와 있습니다. 나는 여전히 이러한 라인을 따라 성명을 구조화 할 가능성이있다 : 동적 SQL에 의지하지 않고 매개 변수의 존재를 기반으로 조건을 'off'로 설정할 수있다 (옵티마이 저는이를 인식하고 적절히 응답 할 수있을 것 같다. 어쨌든). –