Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Добрый день. В тестовой базе 10.5.3 на SLES 11 SP1 есть строчная компрессная табличка, по которой выполняется запрос вида : Код: sql 1. 2. 3. 4. 5. 6. 7. В таблице ~184 мил. записей, по указанному предикату отбирается ~ 950 тыс. Без никаких индексов (фуллскан) выполняется за 31-32 сек. Код: sql 1. 2. 3. 4. 5. 6. План : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. Навешиваем индекс : Код: sql 1. 2. 3. 4. Собираем статистику : Код: sql 1. 2. 3. Перезапускаем запрос, получаем : Код: sql 1. 2. 3. 4. 5. 6. План : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. Разница почти в два раза. При создании индекса вида : Код: sql 1. 2. 3. 4. 5. 6. ситуация сильно не меняется (57-58) сек. При тестовых запусках параллельной нагрузки нет. При плане по индексу идет wait i/o в 70-80%, при фулскане 10-15% во время выполнения запроса. Как бы заставить по индексу работать побыстрее ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 09:36 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Из снепшота выяснилось, что при индексе : Код: sql 1. 2. 3. При фулскане : Код: sql 1. 2. 3. Правда не очень понятно, как Time waited for prefetch может быть в разы больше чем весь Execute Time ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 10:44 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusr, Добрый день. Попробуйте: Код: sql 1. 2. 3. Нужный индекс при этом сам создастся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 11:03 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, MDC - это следуюйщий шаг :) Хочется понять почему с "обычным" индексом идет просадка, должно же быть всяко быстрее фулскана ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 11:25 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusrХочется понять почему с "обычным" индексом идет просадка, должно же быть всяко быстрее фулсканаДанные могут быть не кластеризованы по индексу, оптимизатор неправильно оценивает стоимость IXSCAN-FETCH против TBSCAN. Попробуйте Код: sql 1. dsusrПравда не очень понятно, как Time waited for prefetch может быть в разы больше чем весь Execute TimeВремя ожидания суммируется по каждому из 8-ми параллельных агентов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 11:52 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinДанные могут быть не кластеризованы по индексу, оптимизатор неправильно оценивает стоимость IXSCAN-FETCH против TBSCAN. Действительно, с кластерным индексом по PERIOD, а также после реорга с обычным индексом все становится веселее : Код: sql 1. 2. 3. 4. 5. 6. Тот же запрос, но по колоночной таблице : Код: sql 1. 2. 3. 4. 5. 6. А говорят, что для BLU индексов никаких не надо :) Mark BarinsteinВремя ожидания суммируется по каждому из 8-ми параллельных агентов. Понятно. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 17:40 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusr, Что-то слишком сильно весело стало: это что, по строчной таблице меньше секунды стало выполняться? А если на холодную (рестарт базы)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 18:07 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Что-то слишком сильно весело стало: это что, по строчной таблице меньше секунды стало выполняться? А если на холодную (рестарт базы)? Хоть и 1-е апреля, но похоже на то (после пары десятков прогонов) :) MDC-вариант тоже 1.5 - 2 сек. При этом время выполнения одинаковое как в 1 поток так и в 8 Правда теперь на этом фоне BLU-результат выглядит бледновато :) Каждый запуск db2batch делаю на "холодном" буферпуле сразу после db2stop force;db2start;db2 connect to <dbname> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2014, 22:37 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusrПравда теперь на этом фоне BLU-результат выглядит бледновато :)Кластеризация (с помощью кластерного индекса или MDC) это, конечно, сильная штука. Но там есть свои минусы: - в случае с индексом она со временем ухудшается (надо реорганизовывать таблицу время от времени) - в случае MDC надо заранее выбирать ключи - в обоих случаях запрос с "неудобным" предикатом (не по полю клатерного индекса или по полю, не входящему в набор полей MDC) производительность будет заметно хуже С BLU вы об этом не думаете. А какой набор полей в synopsis таблице у вас? Т.е. таблицы: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:37 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein- в обоих случаях запрос с "неудобным" предикатом (не по полю клатерного индекса или по полю, не входящему в набор полей MDC) производительность будет заметно хуже Да, это понятно. Просто интересовала "синтетика" на простом кейсе в сравнении c BLU (с прицелом на PoC) В общем поигравшись с предикатом на предмет разных диапазонов PERIOD получил почти одинаковый рантайм на колоночной таблице. Стало понятно, что чего-то не так с data skiping'ом. База была профикспачена с 10.5.0 до 10.5.3 - может сломалось чего "по дороге" Пересоздал и перегрузил колоночную таблицу, теперь исходный запрос "на холодную" по ней выполняется за : Код: sql 1. 2. 3. 4. 5. 6. т.е где-то в 2 раза лучше, чем по кластерному индексу. При этом в синопсис-таблице есть поля "PERIODMIN" и "PERIODMAX" Теперь еще один вариант сравнения BLU c обычным (не кластерным и не-MDC) индексом : Cоздан индекс по ACCNT_CODE, собрана статистика, по ACCNT_CODE='ZQTY' отбирается ~ 1.1 мил. записей : Код: sql 1. 2. 3. 4. 5. По строчной таблице : Код: sql 1. 2. 3. 4. 5. 6. По колоночной таблице : Код: sql 1. 2. 3. 4. 5. 6. И вот здесь уже в синопсис-таблице MIN/MAX распределений для колонки ACCNT_CODE нет. Cобственно из 44-х колонок таблицы в синопсисе парами min/max описаны только 16 Есть где-то информация по какому принципу BLU выбирает поля для синопсис-таблицы ? И как-то повлиять на это можно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:55 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusr... И вот здесь уже в синопсис-таблице MIN/MAX распределений для колонки ACCNT_CODE нет. Cобственно из 44-х колонок таблицы в синопсисе парами min/max описаны только 16 Есть где-то информация по какому принципу BLU выбирает поля для синопсис-таблицы ? И как-то повлиять на это можно ?По строковым полям эта информация хранится, если эти поля являются частью первичных или внешних ключей. Не помню, появляются ли сами записи по полю, если на таблицу с данными навесить внешний ключ, содержащий это поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 16:17 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinПо строковым полям эта информация хранится, если эти поля являются частью первичных или внешних ключей. Не помню, появляются ли сами записи по полю, если на таблицу с данными навесить внешний ключ, содержащий это поле. Ясно. Спасибо. Маркетинг, рассказывая про data skiping, как-то об этом умалчивает :) Получается, что : 1) дата-скиппинг работает только если колонки указанные в предикатах присутствуют в синопсисе, в остальных случаях BLU сканит всю колонку; 2) по-дефолту (без ключей) в синопсис попадают только численные колонки; 3) таблицы с большим количеством CHAR/VARCHAR/DATE/etc колонок могут быть не самым оптимальным вариантом для BLU; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2014, 13:35 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusrПолучается, что : 1) дата-скиппинг работает только если колонки указанные в предикатах присутствуют в синопсисе, в остальных случаях BLU сканит всю колонку; 2) по-дефолту (без ключей) в синопсис попадают только численные колонки; 3) таблицы с большим количеством CHAR/VARCHAR/DATE/etc колонок могут быть не самым оптимальным вариантом для BLU; 1) Да. 2) Нет. Еще DATE, TIME, TIMESTAMP. 3) Да, в данный момент повлиять на это можно только созданием внешних ключей (они всё равно not enforced) на какую-нибудь таблицу со строковым ПК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2014, 14:25 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein2) Нет. Еще DATE, TIME, TIMESTAMP. Действительно. Это уже интереснее :) Тогда еще один маленький тест. Таблица LINEITEM из TPC-H. 300M строк Запрос : Код: sql 1. 2. 3. 4. как полностью по всей таблице, так и с любым дипазоном дат в предикатах вида : Код: sql 1. 2. 3. 4. 5. выполняется одинаково за 25-26 сек. Инфа по колонке l_shipdate в синопсисе есть В плане есть операции после CTQ (т.е. уже на строчном движке) : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. Получается дата-скипинг не срабатывает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2014, 17:11 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusrПолучается дата-скипинг не срабатывает ? А вы посмотрите распределение дат по TSN в таблице синопсиса. Если таблица физически не отсортирована по дате, может получаться так, что приходится просматривать все куски в поисках нужных дат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2014, 17:18 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
dsusr, Операции на строчном движке уже не добавляют стоимость запроса. Как оно легло можно для диапазонов where l_shipdate between '1994-12-01' and '1994-12-31' where l_shipdate between '1994-06-01' and '1994-12-31' where l_shipdate between '1994-01-01' and '1994-12-31' как-то так посмотреть (в предположении, что нет пропусков по TSN): Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2014, 18:10 |
|
||
|
index vs. fullscan
|
|||
|---|---|---|---|
|
#18+
Mark Barinsteindsusr, как-то так посмотреть (в предположении, что нет пропусков по TSN): Код: sql 1. 2. 3. 4. 5. 6. 7. Интересно, спасибо. Сделал еще одну копию колоночной LINEITEM, но уже c сортировкой при загрузке по l_shipdate Данный запрос по синопcисам обеих таблиц возвращает : Код: sql 1. 2. 3. 4. И рантайм "на холодную" теперь : Вся таблица - 18.7 сек. 12 месяцев - 3.5 сек. 1 месяц - 0.5 сек. Мораль: предварительная сортировка не просто recomended, а must have :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2014, 13:02 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=38605508&tid=1601119]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 544ms |

| 0 / 0 |
