Увеличение продолжительности выполнения запроса после сегментирования таблицы

Diniska
Дата: 16.10.2015 10:26:17
Добрый день.

Была обычная таблица 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
Добрый Э - Эх
Дата: 16.10.2015 10:34:29
Diniska,

что план показывает? после переделки таблицы статистику-то хоть пересобрали?
Diniska
Дата: 16.10.2015 10:49:10
Добрый Э - Эх
Diniska,

что план показывает? после переделки таблицы статистику-то хоть пересобрали?


Статистика собрана
NUM_ROWS	2282512
BLOCKS	15936
AVG_ROW_LEN	94
SAMPLE_SIZE	2282512
LAST_ANALYZED	16.10.15
LAST_ANALYZED_SINCE	16.10.15
.

Plan hash value: 4049112243

 
------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                 | Name             | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |                  |     2 |    74 |   123   (1)| 00:00:02 |       |       |
|   1 |  SORT ORDER BY                            |                  |     2 |    74 |   123   (1)| 00:00:02 |       |       |
|   2 |   VIEW                                    |                  |     2 |    74 |   122   (0)| 00:00:02 |       |       |
|   3 |    UNION-ALL                              |                  |       |       |            |          |       |       |
|   4 |     VIEW                                  |                  |     1 |    31 |    86   (0)| 00:00:02 |       |       |
|*  5 |      FILTER                               |                  |       |       |            |          |       |       |
|   6 |       SORT AGGREGATE                      |                  |     1 |    60 |            |          |       |       |
|   7 |        NESTED LOOPS                       |                  |    41 |  2460 |    86   (0)| 00:00:02 |       |       |
|   8 |         NESTED LOOPS                      |                  |    41 |  2460 |    86   (0)| 00:00:02 |       |       |
|*  9 |          INDEX RANGE SCAN                 | SMSPEC_ART       |    41 |  1066 |     4   (0)| 00:00:01 |       |       |
|* 10 |          INDEX UNIQUE SCAN                | SMCDOCUMENTS_PK1 |     1 |       |     1   (0)| 00:00:01 |       |       |
|* 11 |         TABLE ACCESS BY GLOBAL INDEX ROWID| SMDOCUMENTS      |     1 |    34 |     2   (0)| 00:00:01 | ROWID | ROWID |
|  12 |     VIEW                                  |                  |     1 |    31 |    36   (0)| 00:00:01 |       |       |
|* 13 |      FILTER                               |                  |       |       |            |          |       |       |
|  14 |       SORT AGGREGATE                      |                  |     1 |    60 |            |          |       |       |
|  15 |        NESTED LOOPS                       |                  |    16 |   960 |    36   (0)| 00:00:01 |       |       |
|  16 |         NESTED LOOPS                      |                  |    16 |   960 |    36   (0)| 00:00:01 |       |       |
|* 17 |          INDEX RANGE SCAN                 | SMSPEC_ART       |    16 |   416 |     4   (0)| 00:00:01 |       |       |
|* 18 |          INDEX UNIQUE SCAN                | SMCDOCUMENTS_PK1 |     1 |       |     1   (0)| 00:00:01 |       |       |
|* 19 |         TABLE ACCESS BY GLOBAL INDEX ROWID| SMDOCUMENTS      |     1 |    34 |     2   (0)| 00:00:01 | ROWID | ROWID |
------------------------------------------------------------------------------------------------------------------------------
Добрый Э - Эх
Дата: 16.10.2015 11:42:08
Diniska,

у тебя оракл не с той ноги таблицы заходит в запрос... поэтому плюсы секционирования не используются (пруннинг идет лесом), а минусы - тормозят запрос (многократное холостое сканирование глобального индекса).
hinotf
Дата: 16.10.2015 11:44:26
У меня тоже есть запрос, где "главная" таблица секционирована по дате (в моём случае - секция размером в 1 год), но обращение всё равно происходит по GLOBAL INDEX ROWID, а не по локальному индексу по полю секционирования. И я пока с этим не справился.
Добрый Э - Эх
Дата: 16.10.2015 11:51:52
Diniska,

как изменилась схема индексирования таблицы после её шинковки на секции?
Diniska
Дата: 16.10.2015 12:39:30
Добрый Э - Эх
Diniska,

как изменилась схема индексирования таблицы после её шинковки на секции?

Никак не изменилась, пробовал создавать локальный по рангу (дате), эффект тот же