2014-02-13 3 views
0

У меня 3 различных таблиц (без какого-либо первичного или внешнего ключа) в базе данных DB2 вМедленная реакция DB2 на нескольких соединений в запросе от JDBC

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-запроса преимуществом в этом случае ???

Заранее спасибо

Кишор

ответ

2

Это звучит, как будто это просто вопрос масштаба.

Предложения WHERE разделяют кусочки каждого набора. Оптимизатор выполняет эти операции сначала, поэтому к тому времени, когда он начнется в JOINs, вам будет просто меньше работы. Он должен быть функцией от общего числа возвращенных строк.

Вам нужно сделать несколько вещей:

  1. Выполнить эквивалент DB2 из EXPLAIN PLAN, чтобы увидеть, если сканирование таблицы делается. Если это так, возможно, вам нужно больше индексов
  2. Создайте VIEW и запросите это. Амортизируйте время JOIN.
  3. Задайте себе, какие записи вам действительно нужны.
+1

Как сказал @duffymo, вам нужно посмотреть, что пытается сделать оптимизатор. Вы не указали первичный ключ и не индексы, которые говорят мне, что, скорее всего, сканирование таблицы происходит.«Distinct» и «Order By» могут также сильно повлиять на производительность. В вашем втором 'Select' есть предложения' Where', что означает, что он сужает область каждого набора данных на каждом шаге. Утомляйтесь, что выполнение через клиента может быть оптимизировано иначе, чем через JDBC. Я просто столкнулся с этой проблемой с MS SQL, где выбор работал отлично на клиенте и убил сервер через JDBC. – CodeChimp

+0

@duffymo, я просто попытался выполнить тот же запрос на VIEWS вместо таблиц. Но это также потребляет то же время. – Kishore

+0

Будет ли использование Хранимой процедуры вместо SQL-запроса преимуществом в этом случае ??? – Kishore

4

У вас есть индекс на столе XW. Он определяется пунктом unique. Это столбцы в индексе: SRCLB, SRCFL, SRCMB, NAME, а затем VARSQ.

В предложении where индексы должны использоваться слева направо - порядок столбцов имеет значение. Итак, когда у вас есть условие на name, индекс не может быть использован.

Если у вас есть условие на SRCLB, SRCFL, SRCMB и SRNAME, то индекс может быть использован.

Кроме того, объем данных, выбранный по предложению where после фильтрации, скорее всего, будет меньшим с большим количеством условий равенства в предложении where, что также улучшит производительность.

+0

Данные не могут быть меньше, поскольку они варьируются от приложения к приложению. Не могли бы вы предложить еще один ключ? – Kishore

+2

@Kishore. , , Имея четыре условия равенства в предложении 'where', и только один из них обычно выбирает меньше данных. Меньше данных часто приводит к более быстрому запросу. –

+0

Будет ли использование Хранимой процедуры вместо SQL-запроса преимуществом в этом случае ??? – Kishore

Смежные вопросы