|
|
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
hi all Сабж. разглядывая картинки в "Episode 2 - Page Types ", так и не въехал, по каким признакам коннект должен смекнуть, что страница с данными устарела и её надо бы перечитать с диска. Контрольной суммы там нету. Момента времени - тоже. И второй вопрос (оффтоп, но отдельную тему по нему нет смысла создавать). Из рисунка (см аттач, скопировал его сюда) и объяснений к нему:Ann As more data is stored on the page, the index grows downward. The data - records, blobs, and fragments - start at the end of the page and go upward.- следует, что если на страницу размером 4096 байт были записаны 80 раз строки длиной по 50 байт (к примеру, двадцатью отдельными транзакциями), то более "поздние" строки лягут ближе к началу страницы - это так или нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 13:55:12 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
PS. Заметил еще вот что. Если 1) коннект_1 сделал вычитку данных (напр., select * from t where id between 7894561 and 7894570;), 2) коннект_2 изменил страницы хранения этих данных, но НЕ завершил транзакцию, - то повторная вычитка коннектом_1 этих же строк приводит всегда к reads > 0, т.е. он таки лезет на диск за этой страницей (хотя коннект_2 не выполнил еще ни commit ни rollback). Выполнение коннектом_2 отмены транзакции также приведет к тому, что коннект_1 при перечитывании этих строк полезет на диск (reads опять >0). Это работает как при snapshot, так и при read committed record_version. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:14:25 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
через лок-менеджер. Если коннект владеет блокировкой, то страница в его кеше валидна. Если потерял блокировку, то ее надо перечитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:21:17 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
[quot Таблоид]более "поздние" строки лягут ближе к началу страницы - это так или нет ?/quot] все верно, насколько я помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:22:23 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, ну так 2 коннект вытесняет данные из кеша. Ты же не думаешь, что данные попадают в кеш по коммиту? Таблоидпо каким признакам коннект должен смекнуть, что страница с данными устарела и её надо бы перечитать с диска. Когда он не находит её в кеше перечитывает с диска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:23:08 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Симонов Денис Когда он не находит её в кеше перечитывает с диска. Тут ступил, ответил не на то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:24:40 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидповторная вычитка коннектом_1 этих же строк приводит всегда к reads > 0, т.е. он таки лезет на диск за этой страницей (хотя коннект_2 не выполнил еще ни commit ни rollback) работа с кешем практически не пересекается с транзакционным механизмом, они на разных уровнях находятся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:26:42 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrчерез лок-менеджер. Если коннект владеет блокировкой, то страница в его кеше валидна. Если потерял блокировку, то ее надо перечитать.Хорошо, вот сценарий: 0. DDL: Код: sql 1. 2. 3. 4. 5. 6. 7. Код: 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. Повторяю еще раз шаги 2 и 3 - получаю всё время в коннекте -1 число reads = 1 . То же самое при обычном update ... where id between ... Таким обр., каждый раз, когда залоченные "нами" записи кто-то другой хочет изменить, "мы" (коннект-1) при обращении к соотв-щей странице всё равно лезем на диск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:48:06 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Симонов Денисну так 2 коннект вытесняет данные из кеша. Ты же не думаешь, что данные попадают в кеш по коммиту?с какого будуна коннект-2 вытолкнет страницу из ЧУЖОГО кеша ? (посмотри сабж топега! Классик и СуперКлассик - там же кеши у всех "свои") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:52:37 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrработа с кешем практически не пересекается с транзакционным механизмом, они на разных уровнях находятсятогда как объяснить, что аз есмьВыполнение коннектом_2 отмены транзакции также приведет к тому, что коннект_1 при перечитывании этих строк полезет на диск (reads опять >0). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:54:22 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоидболее "поздние" строки лягут ближе к началу страницы - это так или нет ?все верно, насколько я помнюА тогда правильно ли я понимаю, что db_key отражает удалённость записи не от "верха", а именно от "подвала" страницы (если смотреть на вышеприведенный рисунок с "Эппизодов"): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 14:59:23 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
ТаблоидТаким обр., каждый раз, когда залоченные "нами" записи кто-то другой хочет изменить, "мы" (коннект-1) при обращении к соотв-щей странице всё равно лезем на диск. конечно, т.к. "хочет изменить" = "берет эксклюзивную блокировку на страницу", а мы ее теряем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:21:47 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидс какого будуна коннект-2 вытолкнет страницу из ЧУЖОГО кеша ? не вытолкнет, но пометит инвалидной и требующей перечитки самим коннектом-1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:23:16 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидправильно ли я понимаю, что db_key отражает удалённость записи не от "верха", а именно от "подвала" страницы в общем случае, он вообще никак не отражает положение записи на странице, т.к. адресует логический слот. При последовательном заполнении все будет как ты сказал, после первых же удалений это уже не факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:26:51 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitr"хочет изменить" = "берет эксклюзивную блокировку на страницу ", а мы ее теряем Кажись, дошло: когда я делаю select for update with lock / update или delete даже одной записи, то он делает низкоуровневую кратковременную excl-блокировку всей страницы, после чего тут же отпускает её (это и есть "мы её теряем"). Это так ? И если да, то получается, я могу заставить все аттачи с незакоммиченными update/delete-транзакциями перечитывать по-новой страницы с диска, даже если они залочили ВСЕ записи таблицы - если буду делать вот такое "идиотство": Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. - так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:47:49 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrПри последовательном заполнении все будет как ты сказал, после первых же удалений это уже не факт.я именно про последовательное заполнение и говорю. Значит, db_key = 810000000 1 000000 будет у записи, которая ближе к ПОДВАЛУ страницу, а 810000000 5 000000 - у записи, которая ближе к её ВЕРХУ. Но тогда при вычитке страницы в память (от ВЕРХА к ПОДВАЛУ) мы должны были бы при увидеть эти строки в "перевернутом" порядке: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:53:34 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, так, только перечитываться страницы будут по необходимости (при следующем обращении) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:55:52 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидпри вычитке страницы в память (от ВЕРХА к ПОДВАЛУ) я не знаю, о чем ты. Страница в память читается единым блоком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 15:57:25 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоидпри вычитке страницы в память (от ВЕРХА к ПОДВАЛУ) я не знаю, о чем ты. Страница в память читается единым блоком.я о том, что 10 записей длиной по 100 каждая будут представлены на странице не в виде одной "неделимой атомарной точки", а именно как 10 последовательностей по 100 байт каждая. Первая послед-сть в 100 байт была сохранена возле "подвала", вторая - "над первой" и т.д. А как их будет вычитывать оттуда движок, в каком порядке ? От заголовка вниз к подвалу или также, как они были сохранены, т.е. от подвала вверх ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:12:51 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
ТаблоидА как их будет вычитывать оттуда движок, в каком порядке ? в порядке возрастания dbkey ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:31:50 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrТаблоидА как их будет вычитывать оттуда движок, в каком порядке ?в порядке возрастания dbkeyМеньшие dbKey лежат возле подвала страницы (она так заполняется, когда изначально пустая). Значит, движок будет читать страницу "задом наперёд", от подвала к верху. То есть - против порядка, в котором байты этой страницы пролетают под головкой диска. Это так или нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:35:20 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, забудь про головку диска, вся страница уже в памяти и пофиг в каком порядке из нее дергать байты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:37:48 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrзабудь про головку диска, вся страница уже в памяти и пофиг в каком порядке из нее дергать байтыЭто как это ? Что за чудеса ? Кто-то же должен её с диска в память-то прочитать ?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:49:35 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидdimitrзабудь про головку диска, вся страница уже в памяти и пофиг в каком порядке из нее дергать байтыЭто как это ? Что за чудеса ? Кто-то же должен её с диска в память-то прочитать ?.. Толсто троллишь :) С диска оно приходит блоками контроллера диска/контроллера рэйда/кэша операционки. Каких оно там размеров никто уже тебе точно и не скажет. У приличных людей размеры этих блоков стремятся к размерам страницы БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 17:12:32 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, еще раз - в кеш страница с диска читается одним куском , как при этом бегают головки HDD - пофиг. Читать и распаковывать записи (хоть первую, хоть последнюю, хоть все подряд) начинаем когда вся страница уже в памяти. Ну и какая тут нафиг разница, в "голове" или в "хвосте" страницы лежит искомая запись? И читать их "вверх" по байтам или "вниз"? Ты до какого-то бреда уже докопался, ей богу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 17:13:45 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrТы до какого-то бреда уже докопался, ей богу.OK, оставим это :-) Вернёмся к перечитке страниц с диска. Вот DDL, тут в новой базе с page_size=4096 создается табличка, одно из полей которой есть varchar(32760). И заполняется оно так, чтобы никакое RLE-сжатие не катило: Код: sql 1. 2. 3. 4. Далее смотрим в gstat: в базе 196 страниц (якобы; но мы-то все знаем, что в 2.5 показываются только страницы, относящиеся к хвостам-огрызкам длинных записей) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Теперь делаем следующее. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. PS. И какие бы записи я не апдейтил в коннекте-2, коннект-1 при перечитке своей записи с id=1 каждый раз лезет на диск: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 18:06:46 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, а с чего ты взял, что перечитывается именно страница данных? Ты смотрел на счетчик page writes на шагах 2 и 4? В первом случае наверняка изменяется pointer page (ибо твой апдейт приводит к выделению новой страницы), которую запросто может захотеть перечитать коннект 1. Во втором случае он наверняка будет перечитывать измененную TIP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 22:26:09 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitrТы смотрел на счетчик page writes на шагах 2 и 4?сорри, я там ошибся: делал вставку в таблицу t 3 , которая уже балы в этой базе, да еще и структура у неё та же самая оказалась :( Сделал всё с самого начала. Странности всё-таки есть. Лезут. Всех, кому интересно, прошу проверить у себя, на базе с page_size = 4096 , charset = none. ФБ 2.5, в архитектуре SuperClassic . Вот DDL : Код: sql 1. 2. 3. 4. Далее: Код: 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. И еще одно наблюдение. Несложный (но муторный) повтор для разных значений ID'шников привёл к следующим результатам: коннект-1 будет реагировать статистикой с reads=1 ... 1) ... как для update t set s = null, так и для rollback'a в коннекте-2, - но только при условии, что коннект-2 меняет записи с id=2...5; 2) ... только для rollback'a в коннекте-2, если этот коннект-2 меняет записи с id=6...110 Если же коннект-2 меняет записи с id >= 111, то ни апдейт, ни роллбак НЕ будут отражены в reads коннекта-1 при перечитке записи. Что касается счетчика writes, то он в коннекте-1 ВСЁ ВРЕМЯ был равен нулю. Мутная вода. Длина данных в каждой записи (32760 строка + 4 байта id'шник + 16 байт заголовок записи) в ВОСЕМЬ раз превышает размер страницы базы. Счетчик записей (writes) во всех замерах был равен НУЛЮ ==> никаких новых страниц там не выделялось. Установка коннектом -2 в записи с ID =5 длинного varchar-поля в NULL никак не может отражаться на страницах, прочитанных коннектом -1 для записи с ID =1 . Они же разделены как минимум 8*3 = 24 штуками других страниц!! А про "эхо" от роллбака, идущее аж от 110-й страницы, я вообще молчу тихо об лёд... dimitrВ первом случае наверняка изменяется pointer page (ибо твой апдейт приводит к выделению новой страницы), которую запросто может захотеть перечитать коннект 1.Нету там новой страницы. Я делал после первых трёх апдейтов нуллами вот это: Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 00:33:47 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
ТаблоидКак это достоверно определить ? Если под виндой, то можно воспользоваться утилиткой из набора Sysinternals, например Process Monitor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 01:22:27 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
NickDeeТаблоидКак это достоверно определить ? Если под виндой, то можно воспользоваться утилиткой из набора Sysinternals, например Process Monitor. Кроме этого там видно все действия по загрузке плагинов и ICU. ICU - это отдельная песенка :) Нужно только в фильтре указать ProcessName = firebird.exe. И всё тайное станет явным :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 01:28:47 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоидсорри, я там ошибся: делал вставку в таблицу t 3 , которая уже балы в этой базе, да еще и структура у неё та же самая оказалась :( зато я не ошибся и делал все для t ТаблоидЧто касается счетчика writes, то он в коннекте-1 ВСЁ ВРЕМЯ был равен нулю. ты как обычно не читаешь, что тебе пишут. Ибо я говорил следить за ним в коннекте-2. ТаблоидУстановка коннектом -2 в записи с ID =5 длинного varchar-поля в NULL никак не может отражаться на страницах, прочитанных коннектом -1 для записи с ID =1 . Они же разделены как минимум 8*3 = 24 штуками других страниц!! запросто может, ибо одна pointer page адресует почти тысячу страниц данных. А pointer page имеет полное право изменяться при апдейте. ТаблоидА про "эхо" от роллбака, идущее аж от 110-й страницы, я вообще молчу тихо об лёд... роллбек или коммит изменяет TIP, один TIP адресует состояние кучи транзакций, коннект-2 изменил состояние последней транзакции, селект в коннекте-1 хочет узнать состояние некоторой предыдущей транзакции (инсертившей запись) и читает ту же самую страницу TIP. Продолжай молчать тихо об лед. ТаблоидНету там новой страницы я выполнял твой тест, апдейт приводил к аллокации новой страницы. Но даже без создания новой страницы pointer page может меняться при изменении страницы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 09:30:32 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
dimitr, вот это: аз есьмЕсли же коннект-2 меняет записи с id >= 111 , то ни апдейт, ни роллбак НЕ будут отражены в reads коннекта-1 при перечитке записи.- чем объяснить ? Если апдейт длинной записи на NULL меняет PP, то он меняет для любого ID'шника или нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 10:49:49 |
|
||
|
Classic & SuperClassic: как коннект узнаёт, что ему надо перечитать страницу в свой кеш ?
|
|||
|---|---|---|---|
|
#18+
Таблоид, во-первых, pointer page меняется не всегда, а только при определенных условиях (зависит от заполнения страницы). Но в твоем случае скорее всего записи с id >= 111 относятся уже к другой pointer page, которая не нужна первому коннекту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2013, 11:00:19 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1564063]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
203ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 191ms |
| total: | 530ms |

| 0 / 0 |
