|
|
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
hi all Дано: 1) Из текущих сырцов собран LI-V2.5.3.26554 (никаких патчей от Источников Света к сырцам не применял). 2) Имеется база с единственной таблицей `t` (id int, s varchar(50), h bigint; поле `id` - индексное), в таблице 1 миллиард записей. Размер базы - 118 Гб. 3) Никаких "фрагментов" файла базы в кеше операционки нет. Вижу на такой базе несколько удивительных эффектов (все коннекты к базе - через TCP). ЭКСПЕРИМЕНТ-1. Запускаю трейс, в другом окне - isql. Ввожу в isql: select * from t where id = 789456123; (такой ID'шник - существует). Выборка по индексу единственной записи уходит в себя на... 5 минут. ДЕ мне объяснил, что это время тратится на "вычитку" PP. Но не многовато ли 5 минут читать эту самую "пэ-пэ" ? Я знаю, что скорость копирования файлов на этой машине ~50 Mb/sec ==> за 300 сек можно скопировать ~15 Gb. Как примерно определить, сколько места занимает PP ? Далее, в трейсе вышеприведенный запрос появится только после того, как будет завершена эта самая "вычитка" PP. И там будет некоторое микроскопическое время, которое он якобы делался. Я понимаю, что трейс на сегодня показывает не все "служебные действия" (sweep только) - но нельзя ли расширить его в этом вопросе ? ЭКСПЕРИМЕНТ-2. В первом окне ввожу запрос к таблице `t` на выборку данных (не подсчет строк - а именно выборку полей). Во втором окне пытаюсь срубить деятельность окна_1 через Код: sql 1. Результат: ноль. Окно_1 будет работать, невзирая на все потуги окна_2. Срубить окно_1 можно только через delete from mon$attachments. Код: plaintext 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. ЭКСПЕРИМЕНТ 3. Срубил окно, пытавшееся завалить выборку, но саму выборку оставил работать. Запустил с другой машины isql и попытался подключиться к этой же базе. Результат: подключение к базе из второго isql-окна длится... МИНУТУ(!). В подключающемся окне я запускал батник, в котором непосредственно перед isql указано: echo %time%. Затем посмотрел, в какой момент времени трейс покажет установку соединения от этого второго окна. Итого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 17:53:32 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
PS. Повторил эксперимент_2 на "разогретой" базе - ноль эмоций: index-выборка из 10Е9-таблицы через mon$statements не срубается (вводил в другом окне commit; delete from mon$statements where ... ; commit; не менее 10 раз - всё бестолку). Трейс этих лихорадочных попыток срубить запрос см. в аттаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 18:09:51 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидВыборка по индексу единственной записи уходит в себя на... 5 минут. не выборка, а prepare запроса, потому что да, prepare читает PP таблицы для определения ее кардинальности (хочет понять, сколько там записей). и на терабайтной базе было не 5 минут, а 45 секунд, и не на миллиарде записей, а на 3.7 миллиардах. ТаблоидИ там будет некоторое микроскопическое время, которое он якобы делался. да, тоже есть такой эффект. Якобы время сканирования pp для сервера пролетело как один миг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:01:31 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
kdvи на терабайтной базе было не 5 минут, а 45 секунд, и не на миллиарде записей, а на 3.7 миллиардах.Очень странно. У мну эта база сейчас на нормальном linux-серваке, с вменяемым дисковым массивом. Но время таки не 45 сек, а гораздо больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:21:24 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
kdvне выборка, а prepare запроса, потому что да, prepare читает PP таблицы для определения ее кардинальности (хочет понять, сколько там записей)..А зачем ему оценивать кардинальность, когда нет соединения с другим источником и есть эвристика оптимизатора, при которой индексное поле обязательно будет задействовано в случае указания его в where-предикате ? То есть, зачем ему что-то там оценивать, когда нет альтернативы и всё равно придется "ходить лошадью индексом" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:26:41 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидА зачем ему оценивать кардинальность, когда нет соединения с другим источником и есть эвристика оптимизатора, при которой индексное поле обязательно будет задействовано в случае указания его в where-предикате ? То есть, зачем ему что-то там оценивать, когда нет альтернативы и всё равно придется "ходить лошадью индексом" ? Кардинальность оценивается всегда - цена универсальности оптимизатора. Он вполне может решить не использовать индекс и пройтись натуралом. Другой вопрос, что нет заточки для частных синтетических случаев, когда например индекс уникальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:36:59 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
avp_Он вполне может решить не использовать индекс и пройтись натуралом.Не в ФБ. Если по полю создан индекс и это поле указано в предикате, то индекс *будет* задействован, помимо нашей воли и сознания. Даже при выборке всех строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:44:02 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Таблоидavp_Он вполне может решить не использовать индекс и пройтись натуралом.Не в ФБ. Если по полю создан индекс и это поле указано в предикате, то индекс *будет* задействован, помимо нашей воли и сознания. Даже при выборке всех строк. Может быть натурал и не заложен, но порядок соединения и используемые индексы однозначно оценивает через умножение кардинальности на селективность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 19:49:39 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидОчень странно. У мну эта база сейчас на нормальном linux-серваке, с вменяемым дисковым массивом. Но время таки не 45 сек, а гораздо больше. Ничего странного: у тебя страница четыре килобайта, а у ДК - 16. Время чтения (как обнаружил Пол Ривз на конференции) зависит не от объёма, а от количества чтений, коих у тебя вчетверо больше. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 20:09:30 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидНе в ФБ не в текущих версиях ФБ, не более того. Это всегда может измениться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 21:13:21 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВремя чтения (как обнаружил Пол Ривз на конференции) зависит не от объёма, а от количества чтений, коих у тебя вчетверо больше.Поздравляю с открытием Вот тебе еще одно "откровение" - для SSD это тоже верно, хоть и в меньшей степени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 21:20:54 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Таблоид ЭКСПЕРИМЕНТ-1. Я понимаю, что трейс на сегодня показывает не все "служебные действия" (sweep только) - но нельзя ли расширить его в этом вопросе ? трейс должен это время показывать в строке, относящейся к prepare Таблоид ЭКСПЕРИМЕНТ-2. В первом окне ввожу запрос к таблице `t` на выборку данных (не подсчет строк - а именно выборку полей). Во втором окне пытаюсь срубить деятельность окна_1 через Код: sql 1. Результат: ноль. Окно_1 будет работать, невзирая на все потуги окна_2. Срубить окно_1 можно только через delete from mon$attachments. особенность текущей реализации, к сожалению. Удалить (сиречь: остановить) можно только активный риквест. А в твоем случае он всегда опознается как неактивный (stalled), мы это уже обсуждали недавно. Я подумаю, что тут можно сделать. Таблоид ЭКСПЕРИМЕНТ 3. Срубил окно, пытавшееся завалить выборку, но саму выборку оставил работать. Запустил с другой машины isql и попытался подключиться к этой же базе. Результат: подключение к базе из второго isql-окна длится... МИНУТУ(!). вот это фигня какая-то, не должно такого быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 21:21:10 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
hvladПоздравляю с открытием Да для меня-то это открытием не было, но удивление Пола было так забавно, что я не преминул встрять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 21:27:41 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
hvladТаблоид ЭКСПЕРИМЕНТ 3. Срубил окно, пытавшееся завалить выборку, но саму выборку оставил работать. Запустил с другой машины isql и попытался подключиться к этой же базе. Результат: подключение к базе из второго isql-окна длится... МИНУТУ(!).вот это фигня какая-то, не должно такого бытьЭто повторяется уже как минимум в третий раз. И происходит сиё, когда : 0) во втором isql-окне делаем quit; 1) в "молотильном" isql-окне ждём, когда завершится выборка по диапазону, для верности делаем там commit; 2) даём серверу заняться чем-то, что вытеснит базу или часть её из кеша операционки (увы, но я не сразу вспомнил про FileSystemCacheThreshold, см ниже) 3) в "молотильном окне" запускаем одиночный index-поиск: Код: sql 1. При этом в трейсе *НЕ* появится никакого сообщения о prepare stetement. Будет только START_TRANSACTION. Акцентирую на этом особое внимание, т.к. из слов kdv выше следует обратное: что затраты идут именно на prepare. 4) снова пытаемся подключиться вторым isql-окном: Код: plaintext 1. В итоге, в трейсе на момент завершения одиночного index-поиска, который длился 201 секунду(!), вижу: trace Код: plaintext 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. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 1) старт транзакции, в которой отдана команда одиночного index-поиска: 2012-11-10T 22:05:18 .9720 2) выполнение prepare этого index-запроса: 2012-11-10T 22:08:40 .0550 Разница между ними равна 3 мин 21 сек, т.е. около 201 секунды. Можно, конечно, изо всех сил не поверить своим глазам и сказать себе "я ошибся". Однако, в isql того окна, где был одиночный index-поиск, вижу то же самое - общее время более трёх минут: isql stats Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. PS. Файловый кеш линуха сильно мешает чистоте замеров. Выключу-ка его: поставлю FileSystemCacheThreshold = 75 при кеше коннекта = 768, "пущай полетает" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 22:41:20 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Пардон муа, опечатался при правке предыдущего поста. Вот эта цитата:вот это фигня какая-то, не должно такого быть- принадлежит не Владу, а Дмитрию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 22:43:12 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
dimitrтрейс должен это время показывать в строке, относящейся к prepareОн там показываает какой-то момент времени, но не длительность этого самого препаре. См. выше, повторю на всякий случай еще раз:Таблоид Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 22:46:40 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Таблоидгде тут видно временн ы е затраты ?Отбой, глаза замылены уже. Вижу :-) Выключил использование кеша операционки (поставил fileSystemCacheThreshold = 0), рестартовал ФБ. Запустил снова isql с одиночным index-запросом. В соседнем окне выполнял батник, выводящий время (echo %time%) и натравливающий isql на простенький скрипт: select current_timestamp from rdb$database; commit; Длительность установки коннектов в этом окне составляет 2-3 сек (причём в первый запуск isql - 10 сек, второй - 7 сек). Затраты на прераре в окне с одиночным index-поиском составили 121 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 22:57:34 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
Итак, загадочная пауза вызвана затратами на prepare. Тогда вопрос: что там скрывается, в этих затратах ? Запрос, который надо выполнить: Код: sql 1. - для разбора тривиален и должен ( вроде бы ) привести к мгновенному рождению плана его выполнения. Именно в виду эвристик, которые заложены в нынешний код ФБ. Тогда что еще включено в "препарирование" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:05:57 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидИтак, загадочная пауза вызвана затратами на prepare. я ж сразу сказал... ТаблоидТогда что еще включено в "препарирование" ? просчет кардинальности, т.е. скан pp. Он самый долгий на больших базах. Вернее, на больших базах более заметен, чем на мелких. И, чем больше таблиц в запросе, тем дольше будет просчет, т.к. кардинальность считается для всех таблиц (вроде). Подробнее разве что в http://firebird.svn.sourceforge.net/viewvc/firebird/firebird/tags/R2_5_2/src/jrd/Optimizer.cpp?revision=57336&view=markup ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:22:01 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
kdv prepare читает PP таблицы для определения ее кардинальности (хочет понять, сколько там записей).Ну так я снова хочу поинтересоваться: сколько можно читать PP единственной таблицы, если база имеет такую статистику: gstat -r Код: plaintext 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. Как хотя бы примерно оценить размер этой PP ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:23:49 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидТогда что еще включено в "препарирование" ? тьфу. кроме кардинальности еще наличие индексов и их селективность. Но с индексами проще, в том смысле, что найти их все и вытащить селективность - это быстро делается. Хотя, была какая-то штука, при большом количестве таблиц и индексов был долгий перебор вариантов. Но вроде это давно починили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:24:10 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
kdvросчет кардинальности, т.е. скан pp . <...> Подробнее разве что в http://firebird.svn.sourceforge.net/viewvc/firebird/firebird/tags/R2_5_2/src/jrd/Optimizer.cpp?revision=57336&view=markup гы... и где ТАМ искать пресловутый "скан PP" ? (по словам `pp` и `pointer`, кстати, ничего релевантного там нету!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:33:33 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
ТаблоидНу так я снова хочу поинтересоваться: сколько можно читать PP единственной таблицы, если база имеет такую статистику... Как хотя бы примерно оценить размер этой PP ? 28567997 страниц данных, это примерно 3 млн pointer pages. Столько случайных дисковых чтений нужно для оценки кардинальности таблицы. Ты же специально выбрал самый поганый сценарий, с минимальным размером страницы. Вот и огребай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:44:01 |
|
||
|
Его Величество Миллиард (эксперименты с таблицей в 10E9 строк)
|
|||
|---|---|---|---|
|
#18+
dimitr28567997 страниц данных, это примерно 3 млн pointer pages пардон, 30 тыс конечно же. Пиво мешает арифметике :-) Но отмечу, что эти 30 тыс равномерно размазаны по 118ГБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2012, 23:46:45 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38033061&tid=1564260]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
214ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 540ms |

| 0 / 0 |
