|
|
|
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?fid=40&msg=38500718&tid=1564063]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
176ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 188ms |
| total: | 424ms |

| 0 / 0 |
