optymalizacja zapytania

Odpowiedz Nowy wątek
2011-08-25 16:01
0

hej, może ktoś wpadnie jak to zrobić.
jest zapytanie

 SELECT 
    B.ID
    , B.VER
    , MAX(A.VER)
    , A.ID_SCALES
    , A.VER_SCALES
FROM 
    T_ATTRDEF A 
LEFT JOIN 
    T_DEFINITIONATTR B 
ON 
    (A.ID = B.ID_ATTRDEF)
WHERE 
    B.SYS_FLAG = 2 
GROUP BY 
    A.ID
    , B.ID
    , B.VER
    , A.ID_SCALES
    , A.VER_SCALES

które wykonuje się w pętli w pewnej procedurze

tabele są opisane następująco

 CREATE TABLE T_ATTRDEF
(
  ID INTEGER NOT NULL,
  F_NAME VARCHAR(200) NOT NULL,
  VER INTEGER NOT NULL,
  F_TYPE INTEGER,
  ID_SCALES INTEGER DEFAULT NULL,
  VER_SCALES INTEGER DEFAULT 0,
  F_GRADE BLOB SUB_TYPE 0,
  F_EXPECTED_VALUE BLOB SUB_TYPE 0,
  F_DIVERGENCE BLOB SUB_TYPE 0,
  F_DESCRIPTION BLOB SUB_TYPE 0,
  F_FREQUENCY INTEGER,
  F_QUESTION INTEGER,
  ID_USER INTEGER,
  VER_USER INTEGER,
  F_WEIGHT INTEGER DEFAULT 0 NOT NULL,
  CONSTRAINT PK_T_ATTRDEF PRIMARY KEY (ID,VER)
);
ALTER TABLE T_ATTRDEF ADD CONSTRAINT FK_T_ATTRDEF_1
  FOREIGN KEY (ID_SCALES,VER_SCALES) REFERENCES T_SCALES (ID,VER) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE T_ATTRDEF ADD CONSTRAINT INTEG_244
  FOREIGN KEY (ID_USER,VER_USER) REFERENCES T_USERS (ID,VER) ON UPDATE CASCADE ON DELETE SET NULL;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON T_ATTRDEF TO  SMART;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON T_ATTRDEF TO  SYSDBA WITH GRANT OPTION;

oraz

 CREATE TABLE T_DEFINITIONATTR
(
  ID INTEGER NOT NULL,
  VER INTEGER NOT NULL,
  ID_DEFINITION INTEGER NOT NULL,
  VER_DEFINITION INTEGER DEFAULT 0 NOT NULL,
  ID_ATTRDEF INTEGER NOT NULL,
  VER_ATTRDEF INTEGER DEFAULT 0 NOT NULL,
  F_PUBLISHED INTEGER,
  F_ORDER INTEGER,
  F_VALUE BLOB SUB_TYPE 0,
  SYS_FLAG INTEGER DEFAULT 0 NOT NULL,
  ID_USER INTEGER,
  VER_USER INTEGER,
  CONSTRAINT PK_T_DEFINITIONATTR PRIMARY KEY (ID,VER),
  CONSTRAINT UQ_DEFINITIONATTR UNIQUE (ID_DEFINITION,ID_ATTRDEF,VER_DEFINITION,VER_ATTRDEF)
);
ALTER TABLE T_DEFINITIONATTR ADD CONSTRAINT INTEG_181
  FOREIGN KEY (ID_DEFINITION,VER_DEFINITION) REFERENCES T_DEFINITION (ID,VER) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE T_DEFINITIONATTR ADD CONSTRAINT INTEG_182
  FOREIGN KEY (ID_ATTRDEF,VER_ATTRDEF) REFERENCES T_ATTRDEF (ID,VER) ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE T_DEFINITIONATTR ADD CONSTRAINT INTEG_245
  FOREIGN KEY (ID_USER,VER_USER) REFERENCES T_USERS (ID,VER) ON UPDATE CASCADE ON DELETE SET NULL;
CREATE INDEX IDX_T_DEFINITIONATTR ON T_DEFINITIONATTR (SYS_FLAG);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON T_DEFINITIONATTR TO  SMART;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON T_DEFINITIONATTR TO  SYSDBA WITH GRANT OPTION;
 

teraz tak. Zapytanie przy left joinie wykonuje się 30 sekund. razy X iteracji - baza wisi. zapytanie przy inner joinie trwa 1 sekundę. każdego joina da sie zapisać jako podzapytanie. pytanie brzmi - czy tam może być inner join ? oraz prośba numer 2 - przepisać wersję z left join - na podzapytanie

Pozostało 580 znaków

2011-08-25 19:12
0

jeżeli są Tobie potrzebne tylko takie rekordy z tabeli A, które występują w tabeli B, to tak, możesz zastosować INNER JOIN'a


pozdrawiam
paweld

Pozostało 580 znaków

2011-08-25 19:30
0

słuchaj ja tego nie pisałem, zastanawiam się co tu można zrobić bo to wiesza całą aplikację

edytowany 1x, ostatnio: lightning3, 2011-08-25 19:30
poczytaj sobie o JOIN'ach: http://en.wikipedia.org/wiki/Join_%28SQL%29 LEFT JOIN = LEFT OUTER JOIN - Paweł Dmitruk 2011-08-25 20:50

Pozostało 580 znaków

2011-08-29 13:03
0

bardzo dziękuję, podpowiedzi dały efekt :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0