|
Упаковка в индексе bigint- и int-ключей с одинаковыми знач.,< 2^31. Дифферент - 67%.Why ?
|
|||
---|---|---|---|
#18+
hi all. Растолкуйте, плз, тему про "пол-ведра компрессии", а именно - про утрамбовку ключей в индексах. Есть таблица, в ней два поля: e32 int и e64 big int. Для каждой строки в эти поля пишется одно и то же значение: {1, 1}, {2, 2} etc. Сначала заливаем строки со значениями от 1 до 16387064. Далее создаем вторую таблицу, и передаём в неё данные из первой, увеличенные в каждой строке на 2 млрд. Затем создаём в каждой таблице по два индекса (НЕ составных) - первый по e32, второй по e64. DDL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А затем вызываем gstat -r и смотрим данные. 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. 52. 53. 54.
полный вывод gstat'a Код: 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. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
Q-1. Почему для int'a показатель компрессии всегда лучше, да и листовых страниц в 1.6 раза меньше, чем для bigint'a, если все значения в e64 всё равно меньше 2^31 и, след-но, при сохранении от них должны отбрасываться незначащие биты ? Q-2. В таблице test2 сидят значения, превышающие 2 млрд. След-но, там явно побольше значащих битиков, чем в test1.e64 :-) Но средняя длина ключа в ней меньше, чем для test1. И листовых страниц - тоже меньше, на 2 тыс. Отчего это ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2015, 17:28 |
|
Упаковка в индексе bigint- и int-ключей с одинаковыми знач.,< 2^31. Дифферент - 67%.Why ?
|
|||
---|---|---|---|
#18+
Индексные ключи из значений типа INT (BIGINT) не представлены в памяти как целые числа. Все целые типы, кроме BIGINT, преобразуются в double precision. BIGINT преобразуется в double precision + smallint. Поэтому а) компрессия ключей выглядит совершенно не так, как ты это себе придумал б) ключи для одного и того же числа но в типах INT и BIGINT совершенно разные Если хочешь подробностей - читай в btr.cpp ф-цию compress() ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2015, 12:57 |
|
Упаковка в индексе bigint- и int-ключей с одинаковыми знач.,< 2^31. Дифферент - 67%.Why ?
|
|||
---|---|---|---|
#18+
hvladИндексные ключи из значений типа INT (BIGINT) не представлены в памяти как целые числа. Все целые типы, кроме BIGINT, преобразуются в double precision. BIGINT преобразуется в double precision + smallint. Поэтому а) компрессия ключей выглядит совершенно не так, как ты это себе придумал б) ключи для одного и того же числа но в типах INT и BIGINT совершенно разные Если хочешь подробностей - читай в btr.cpp ф-цию compress()Ох... я догадывался, что эти "пол-ведра компрессии" еще состроят мне злобную гримасу, но не думкал, что такую злобную :-/ Спасибо, ушёл много думать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2015, 15:01 |
|
Упаковка в индексе bigint- и int-ключей с одинаковыми знач.,< 2^31. Дифферент - 67%.Why ?
|
|||
---|---|---|---|
#18+
Рассмотрим несколько подробнее, какие ключи у нас будут для INT\BIGINT и как они будут упаковываться. Про BIGINT в двух словах скажу только что исходное значение нормируется и разбивается на две части (double и smallint). В double часть представления попадает старшие 15 десятичных цифр, делённые на 10000. В smallint часть - младшие 4 десятичных цифры, при условии, что в числе более 15 цифр. Ещё нам нужно знать, как представлены в памяти double precision числа. Я пользовался вот таким инструментом http://www.binaryconvert.com/convert_double.html Вот что получится для ключей когда тип поля INT (картинка не совсем та, что внутри ФБ, но весьма близкая) Значение double ключ длина префикс' длина'1 0x3FF0000000000000 0x3FF0 2 0 22 0x4000000000000000 0x40 1 0 13 0x4008000000000000 0x4008 1 1 1...2000000001 0x41DDCD6500400000 0x41DDCD650040 6 0 62000000002 0x41DDCD6500800000 0x41DDCD650080 6 5 12000000003 0x41DDCD6500C00000 0x41DDCD6500C0 6 5 1 А вот, что получится для тех же значений ключей, если тип поля BIGINT: Значение bigint double ключ длина префикс' длина'1 0.0001 0x3F1A36E2EB1C432D 0x3F1A36E2EB1C432D 8 0 8 2 0.0002 0x3F2A36E2EB1C432D 0x3F2A36E2EB1C432D 8 1 73 0.0003 0x3F33A92A30553261 0x3F33A92A30553261 8 1 7...2000000001 200000.0001 0x41086A0000346DC6 0x41086A0000346DC6 8 0 8 2000000002 200000.0002 0x41086A000068DB8C 0x41086A000068DB8C 8 5 32000000003 200000.0003 0x41086A00009D4952 0x41086A00009D4952 8 5 3 Напомню, что нули в конце ключа не хранятся и что используется префиксная компрессия. Колонки [префикс'] и [длина'] описывают данные в index node. Т.е. в данных собственно index node будут храниться последние [длина'] байт от полного ключа. Кто сделает выводы ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2015, 16:36 |
|
|
start [/forum/topic.php?fid=40&msg=39057612&tid=1562621]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 144ms |
0 / 0 |