Добрый день.
Была обычная таблица SMDOCUMENTS, содержащая заголовки документов (номер, дата, тип дока, сумма и т.п), 2 282 512 строк, заменили ее сегментированной - PARTITION BY RANGE ("CREATEDAT") INTERVAL (NUMTOYMINTERVAL( 3, 'MONTH'), после этого стала очень долго выполнятся функция простановки цен, которая есть в приложении (Супермаг), использующем БД. Нашел запрос, который используется вышеуказанной функцией и является причиной резкого увеличения продолжительности выполнения простановки цен.
SELECT INCOMEDOCTYPE,
INCOMEDOCID ,
INCOMEDATE
FROM
(
SELECT 'WI' INCOMEDOCTYPE ,
SUBSTR(S.INCOMEDOC, 9) INCOMEDOCID,
SUBSTR(S.INCOMEDOC, 1, 8) INCOMEDATE
FROM
(
SELECT DECODE('0' , '0', MAX(TO_CHAR(D.CREATEDAT,'YYYYMMDD')
||
D.ID), MIN(TO_CHAR(D.CREATEDAT,'YYYYMMDD')
||
D.ID) ) INCOMEDOC
FROM SUPERMAG.SMSPEC S,
SUPERMAG.SMDOCUMENTS D
WHERE S.DOCTYPE = D.DOCTYPE
AND S.DOCID = D.ID
AND S.ARTICLE = '024813'
AND
-- (
-- (
-- (
-- '0' ='0'
-- )
-- AND D.CREATEDAT <= '15.10.2015'
-- )
-- OR
-- (
-- D.CREATEDAT > '15.10.2015'
-- )
-- )
AND D.DOCSTATE = '3'
AND D.DOCTYPE = 'WI'
AND D.OPCODE IN ('0','9','16')
AND
(
(
2 = 0
AND D.LOCATIONTO = '61'
)
OR
(
2 = 1
AND D.LOCATIONTO IN
(
SELECT ID FROM SUPERMAG.TTSHOPLIST
)
)
OR 2 = 2
)
)
S
WHERE S.INCOMEDOC IS NOT NULL
UNION ALL
SELECT 'PO' INCOMEDOCTYPE ,
SUBSTR(S.INCOMEDOC, 9) INCOMEDOCID,
SUBSTR(S.INCOMEDOC, 1, 8) INCOMEDATE
FROM
(
SELECT DECODE('0' , '0', MAX(TO_CHAR(D.CREATEDAT,'YYYYMMDD')
||
D.ID), MIN(TO_CHAR(D.CREATEDAT,'YYYYMMDD')
||
D.ID) ) INCOMEDOC
FROM SUPERMAG.SMSPEC S,
SUPERMAG.SMDOCUMENTS D
WHERE S.DOCTYPE = D.DOCTYPE
AND S.DOCID = D.ID
AND S.ARTICLE = '024813'
AND
-- (
-- (
-- (
-- '0' ='0'
-- )
-- AND D.CREATEDAT <= '15.10.2015'
-- )
-- OR
-- (
-- D.CREATEDAT > '15.10.2015'
-- )
-- )
AND D.DOCSTATE = '3'
AND D.DOCTYPE = 'PO'
AND D.OPCODE = '13'
AND
(
(
2 = 0
AND D.LOCATIONTO = '61'
)
OR
(
2 = 1
AND D.LOCATIONTO IN
(
SELECT ID FROM SUPERMAG.TTSHOPLIST
)
)
OR 2 = 2
)
)
S
WHERE S.INCOMEDOC IS NOT NULL
)
ORDER BY INCOMEDATE DESC ,
INCOMEDOCTYPE DESC,
INCOMEDOCID DESC
Измененная таблица - SMDOCUMENTS.
Узкое место закомментировано. При этом, если изменить фрагмент данного запроса, указав одно из двух явно
and D.CREATEDAT <= '15.10.2015'
или
and D.CREATEDAT > '15.10.2015'
то он выполняется так же быстро, как в несегментированной таблице.
Может кто-нибудь объяснить почему так увеличилась продолжительность запроса и можно ли ее победить, не изменяя текст запроса? Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production