|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
DB2 9.7 Имеем таблицу миллион записей, 170 полей, поля без фанатизма т.е. BLOB и т.п. нет, длина записи 1400. Выбираем: Код: sql 1. 2.
Выбирает десяток строчек мгновенно. Выбираем: Код: sql 1. 2. 3.
1й раз думает минут 7, последующие секунд 40-50. Без order by - мгновенно, причём, этот факт до оптимизатора не доходит и он продолжает упорствовать. Если подождать минут 10-15 начинает думать больше 50 секунд. При попытке сгенерить план запроса ругается: [IBM][CLI Driver][DB2/NT64] SQL0220N Столбец "DB2ADMIN.EXPLAIN_OBJECT" таблицы объяснения "PAGES" не содержит подходящего определения или же отсутствует. SQLSTATE=55002 Т.е., я так понимаю, нарушилось что-то в данных, на основании которых оптимизируются запросы. Очень хочется понять, куда копать. На всякий случай индексы: (Почему именно так, даже не догадываюсь - не моё) ALTER TABLE "CHANGES "."MAN" ADD PRIMARY KEY ("ID", "CHANGEDATE"); CREATE INDEX "CHANGES "."MANFIO" ON "CHANGES "."MAN" ("FA" ASC, "IM" ASC, "OT" ASC, "POL" ASC, "RDAT" ASC, "NPERS" ASC, "CHANGEDATE" ASC, "ID" ASC) COMPRESS YES ALLOW REVERSE SCANS; CREATE INDEX "CHANGES "."MANSNILS" ON "CHANGES "."MAN" ("NPERS" ASC, "CHANGEDATE" ASC, "ID" ASC) COMPRESS YES ALLOW REVERSE SCANS; CREATE INDEX "DB2ADMIN"."IDX_MAN_RE" ON "CHANGES "."MAN" ("RE" ASC, "ID" ASC, "CHANGEDATE" ASC) PCTFREE 10 COLLECT SAMPLED DETAILED STATISTICS COMPRESS YES ALLOW REVERSE SCANS; CREATE UNIQUE INDEX "DB2ADMIN"."IDX1602020502141" ON "CHANGES "."MAN" ("CHANGEDATE" ASC, "ID" ASC) COLLECT SAMPLED DETAILED STATISTICS COMPRESS YES ALLOW REVERSE SCANS; ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 13:08 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Честный чайник, Оптимизатор при построении плана запроса не использует explain таблицы. Эти таблицы используются для получения пользователем плана запроса. У вас, видимо, они как-то не так создались. Привести их в чувство можно так: -- удалить call SYSINSTALLOBJECTS('EXPLAIN', 'D', NULL, 'DB2ADMIN'); -- создать call SYSINSTALLOBJECTS('EXPLAIN', 'C', NULL, 'DB2ADMIN'); Ну и планы запроса от db2extfmt покажите. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2017, 13:43 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Mark Barinstein, call SYSINSTALLOBJECTS('EXPLAIN', 'C', NULL, 'DB2ADMIN'); Помогло. Стало рисовать планы. Поскольку табличка относительно большая, а со средневековыми интерфейсами я не в ладу, вывод получился великоват. Поэтому я избранные места процитирую, а архив с файликами приложу. Без order by ******************** EXPLAIN INSTANCE ******************** DB2_VERSION: 09.07.6 SOURCE_NAME: SQLC2H23 SOURCE_SCHEMA: NULLID SOURCE_VERSION: EXPLAIN_TIME: 2017-03-31-12.36.26.322001 EXPLAIN_REQUESTER: DB2ADMIN Database Context: ---------------- Parallelism: None CPU Speed: 2.243635e-007 Comm Speed: 100 Buffer Pool size: 757056 Sort Heap size: 112539 Database Heap size: 60000 Lock List size: 871344 Maximum Lock List: 87 Average Applications: 1 Locks Available: 24258216 Package Context: --------------- SQL Type: Dynamic Optimization Level: 5 Blocking: Block All Cursors Isolation Level: Cursor Stability ---------------- STATEMENT 1 SECTION 203 ---------------- QUERYNO: 1 QUERYTAG: Statement Type: Select Updatable: No Deletable: No Query Degree: 1 Original Statement: ------------------ SELECT * FROM CHANGES."MAN" where fa=' ' and Im=' ' and Ot=' ' Optimized Statement: ------------------- SELECT Q1.ID AS "ID", Q1.RE AS "RE", Q1.RA AS "RA", Q1.FA AS "FA", Q1.IM AS "IM", Q1.OT AS "OT", Q1.RDAT AS "RDAT", Q1.POL AS "POL", Q1.PUNKT AS .................... Q1.KOL_FAKTRAB AS "KOL_FAKTRAB" FROM CHANGES.MAN AS Q1 WHERE (Q1.OT = ' ') AND (Q1.IM = ' ') AND (Q1.FA = ' ') Access Plan: ----------- Total Cost: 129.45 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 16.3092 FETCH ( 2) 129.45 37.384 /---+----\ 16.3092 1.05938e+007 RIDSCN TABLE: CHANGES ( 3) MAN 25.7303 Q1 2 | 16.3092 SORT ( 4) 25.73 2 | 16.3092 IXSCAN ( 5) 25.7284 2 | 1.05938e+007 INDEX: CHANGES MANFIO Q1 С order by ******************** EXPLAIN INSTANCE ******************** DB2_VERSION: 09.07.6 SOURCE_NAME: SQLC2H23 SOURCE_SCHEMA: NULLID SOURCE_VERSION: EXPLAIN_TIME: 2017-03-31-15.08.54.521001 EXPLAIN_REQUESTER: DB2ADMIN Database Context: ---------------- Parallelism: None CPU Speed: 2.243635e-007 Comm Speed: 100 Buffer Pool size: 757056 Sort Heap size: 112539 Database Heap size: 60000 Lock List size: 871344 Maximum Lock List: 87 Average Applications: 1 Locks Available: 24258216 Package Context: --------------- SQL Type: Dynamic Optimization Level: 5 Blocking: Block All Cursors Isolation Level: Cursor Stability ---------------- STATEMENT 1 SECTION 203 ---------------- QUERYNO: 1 QUERYTAG: Statement Type: Select Updatable: No Deletable: No Query Degree: 1 Original Statement: ------------------ SELECT * FROM CHANGES."MAN" where fa=' ' and Im=' ' and Ot=' ' order by changedate Optimized Statement: ------------------- SELECT Q1.ID AS "ID", Q1.RE AS "RE", Q1.RA AS "RA", Q1.FA AS "FA", Q1.IM AS "IM", Q1.OT AS "OT", Q1.RDAT AS "RDAT", Q1.POL AS "POL", Q1.PUNKT AS ................................. Q1.KOL_FAKTRAB AS "KOL_FAKTRAB" FROM CHANGES.MAN AS Q1 WHERE (Q1.OT = ' ') AND (Q1.IM = ' ') AND (Q1.FA = ' ') ORDER BY Q1.CHANGEDATE Access Plan: ----------- Total Cost: 3.39691e+007 Query Degree: 1 Rows RETURN ( 1) Cost I/O | 16.3092 FETCH ( 2) 3.39691e+007 2.64444e+006 /----+-----\ 1.05938e+007 1.05938e+007 IXSCAN TABLE: CHANGES ( 3) MAN 126591 Q1 13530.7 | 1.05938e+007 INDEX: DB2ADMIN IDX1602020502141 Q1 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 12:50 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Честный чайник, Да, выглядит очень странно. Открывайте PMR в поддержку. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 19:25 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Пока не дочитал. Вижу, что имеем Код: sql 1. 2. 3.
Код: sql 1. 2. 3. 4.
и получаем Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Видим, что в одном случае над IXSCAN стоит 16.3092, а во втором 1.05938e+007. А это ничто иное, как количество строк, которое должно было возвратиться. Если к обоим индексам приложены одни и те же предикаты с одним и теми же параметрами, оптимизатор должен давать одинаковую оценку... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 20:07 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Как бы то ни было, глюк-неглюк, а напрашивается что-то вроде CREATE INDEX changes.man_fa_im_ot on changes.man(fa,im,ot); REORG TABLE changes.man; -- Number of Rows: 10593817 -- Table Overflow Record Count: 2387904 RUNSTATS ON TABLE changes.man WITH DISTRIBUTION AND DETAILED INDEXES ALL; -- SET PROFILE? ну, и SMS tablespace как бы давно не рекомендуется? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 20:37 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Victor Metelitsa И всё равно, я ожидал бы, что RETURN на верхушке показывал бы одинаковое количество строк. Чёто глючу. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 20:40 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Вот почему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
миллионов строк, а стоимость и I/O такие маленькие? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 20:48 |
|
Глюк оптимизатора.
|
|||
---|---|---|---|
#18+
Page size для таблицы не могу определить. Но надо думать, что 4096. А TEMPSIZE: (Temporary Table Page Size) 4096. и Width of Rows: 1387 Сортировать в таких условиях такие строки на диске должно быть очень дорого. Но оптимизатор считает, что их должно остаться всего 16. Может, перестраховывается? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2017, 21:48 |
|
|
start [/forum/topic.php?fid=43&fpage=10&tid=1600466]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 312ms |
total: | 441ms |
0 / 0 |