簡體   English   中英

DB2對JDBC查詢中的多個JOIN的響應慢

[英]Slow response of DB2 on multiple JOINs in query by JDBC

我在DB2數據庫中有3個不同的表(沒有任何主鍵或外鍵),

CREATE TABLE XW (
    SRCLB VARCHAR(10) NOT NULL,
    SRCFL VARCHAR(10) NOT NULL,
    SRCMB VARCHAR(10) NOT NULL,
    NAME VARCHAR(30) NOT NULL,
    VARSQ DOUBLE NOT NULL,
    UNIQUE (SRCLB, SRCFL, SRCMB, NAME, VARSQ) 
);

CREATE TABLE XO (
    LOBJ VARCHAR(10) NOT NULL,
    LTYPE VARCHAR(10) NOT NULL,
    ATTR VARCHAR(10) NOT NULL,
    LTEXT VARCHAR(50),
    UNIQUE (LOBJ, LTYPE, ATTR) 
);

CREATE TABLE XM (
    LIB VARCHAR(10) NOT NULL,
    FILE VARCHAR(10) NOT NULL,
    MBR VARCHAR(10) NOT NULL,
    SEQ DOUBLE NOT NULL,
    DTA VARCHAR(132),
    RECN INTEGER,
    UNIQUE (LIB, FILE, MBR, SEQ)
);

每個表都有2個lacs(appx)記錄。 當我執行此查詢時

SELECT
        DISTINCT XW.SRCMB
        ,XM.SEQ
        ,XM.DTA
        ,XM. FILE
        ,XM.LIB
        ,XO.TEXT
        ,XO.ATTR
    FROM
        (
            XW INNER JOIN XM
                ON (XW.VRECN = XM.RECN)
                AND (XW.SRCMB = XM.MBR)
                AND (
                    XW.SRCFL = XM. FILE
                )
                AND (XW.SRCLB = XM.LIB)
        )
    LEFT OUTER JOIN XO
        ON (XW.SRCMB = XO.LOBJ)
WHERE
(XW.NAME = 'DB-NAME-A')
ORDER BY
XW.SRCMB
,XM.SEQ;

它會在15秒以上返回結果。 但是當我在WHERE條件下指定更多列時

SELECT
        DISTINCT XW.SRCMB
        ,XM.SEQ
        ,XM.DTA
        ,XM. FILE
        ,XM.LIB
        ,XO.TEXT
        ,XO.ATTR
    FROM
        (
            XW INNER JOIN XM
                ON (XW.VRECN = XM.RECN)
                AND (XW.SRCMB = XM.MBR)
                AND (
                    XW.SRCFL = XM. FILE
                )
                AND (XW.SRCLB = XM.LIB)
        )
    LEFT OUTER JOIN XO
        ON (XW.SRCMB = XO.LOBJ)
WHERE
(XW.NAME = 'DB-NAME-A')
AND XW.SRCMB = 'CLCR0751'
AND XW.SRCFL = 'CBSRC'
AND XW.SRCLB = 'THPCOD_NEW'
ORDER BY
XW.SRCMB
,XM.SEQ;

然后結果很快就出現了,例如2秒。 您能建議我表/查詢中有哪些缺陷嗎?

以及如何提高第一查詢的性能?

在這種情況下,使用存儲過程代替SQL查詢會是一個優勢嗎???

提前致謝

Kishore

您確實在XW表上有一個索引。 它由unique子句定義。 這些是索引中的列: SRCLBSRCFLSRCMBNAME ,然后是VARSQ

where子句中,索引必須從左到右使用-列的順序有所不同。 因此,當您對name有條件時,無法使用索引。

如果您對SRCLBSRCFLSRCMBSRNAME ,則可以使用索引。

此外,所選擇的數據量由where子句后過濾很可能是與更平等條件越小在where子句,而且也將提高性能。

聽起來這只是規模問題。

WHERE子句將每個集合切成碎片。 優化器首先執行那些操作,因此在啟動JOIN時,要做的工作就更少了。 它應該是返回的總行數的函數。

您需要做一些事情:

  1. 運行等效於DB2 EXPLAIN PLAN的DB2,以查看是否已完成TABLE SCAN。 如果是這樣,也許您需要更多索引
  2. 創建一個VIEW並對其進行查詢。 攤銷加入時間。
  3. 問問自己您真正需要什么記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM