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