
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
13.09.2012, 01:29
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Таблица типа create table TAB ( x smallint not null, y smallint not null, id_ver smallint not null, size int not null, ......, constraint PK_TAB primary key (x, y, id_ver) ) Оба x и y принимают любые значения от 0 до 4095 каждое (4096*4096 = 16 777 216). Большие значения исключены на 100%. id_ver думаю в реальности будет никак не более 10 штук, в среднем наверное 2. Сабжевые значения числа записей реально достижимы. Больше никаких альтернативных индексов нет. Предполагаются запросы вида: 1. select ... where x=20 and y=44. 2. select ... where x=20 and y=44 and id_ver=2. 3. select ... where x=20 and y=44 and id_ver<=8. 4. select ... where (x between 20 and 30) and (y between 44 and 48). В select этих запросов - только x, y, id_ver (то есть тут попадание в ПК). Однако в любом из этих запросов может быть условие на size=0 или size<>0, что конечно изгадит всю "красоту" и полезет в таблицу. Модификацию данных не рассматриваем (только insert и select, ну ещё будет delete). А теперь идея. При сохранении в БД сдвигать X на 1 разряд и прибавлять 1 если size=0. Соответственно запросы выше видоизменяются на: 1. select ... where (x between 40 and 41) and y=44. 4. select ... where (x between 40 and 61) and (y between 44 and 48). причём условие на size=0 или size<>0 даже опускаем (хотя по идее и его можно добавить). Теперь по результатам select-а не вылезая из полей ПК сразу видим на клиенте size=0 или size<>0. При полном сохранении возможности работы по диапазонам. Предполагается что двух записей с x=40 и x=41 при равных остальных полях y и id_ver залетать не будет. Вопросы: 1. Кто-нибудь юзал такие "феньки" при условии, что реально используемая "мощность" ПК на пару порядков меньше его ширины (здесь достаточно было бы 2 полуторабайтных целых поля, в сумме лишний байт получается)? 2. Есть ли основания предполагать, что из-за замены x=20 на (x between 40 and 41) и (x between 20 and 30) на (x between 40 and 61) хоть сколько-нибудь что-нибудь "просядет"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 02:07
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
1. Даже на 100 миллионов экономия в 1 байт, это всего лишь несчастные лишних 100МБ. Экономия на спичках, с альтернативой упаковки и распаковки значений как при записи, так и поиске. IMHO, не стоит того. Только механизм усложнять и причастных к этому безобразию путать. Лично я не стал бы этим заниматься, выигрыш в целом неочевиден. Например, на MS SQL, если такой ключ сделать кластерным, с учетом характера приведённых запросов нет необходимости в дополнительном лукапе данных из таблице, фактически ты сразу получаешь данные из поля size. Т.е., кластерный индекс уже таблица упорядоченная постранично. Запросы будут с минимальным IO, так как поиск по точному значению или диапазону, которые вычисляются по дереву и поднимаются только нужные pages. Быстрее вряд ли получится. P.S. На Oracle аналогом, ЕМНИП, будут IOT-таблицы. На других тоже наверное есть аналоги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 02:17
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей Васкецов, Я думаю что при таком объеме данных проще сделать выборку по ПК и потом уже из нее условие по size. Просто реально на таком объеме сразу условие size сведет ПК в канаву, но если условия будут такие как описано, то так думается будет проще. Попробуйте на реальных данных прогнать запрос и посмотрите замер скорости. Кто-то слегка промахнулся при создании базы... В некоторых случаях замечено что Код: sql 1. отрабатывает быстрее чем Код: sql 1. поскольку неуказана БД, то возможно Вам это как-то и поможет методом ненаучного тыка найти "золотую середину". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 02:45
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
ChAвыигрыш в целом неочевиден Ну выигрыш именно чтобы только по данным ПК поиметь знание принака size=0. Большего не требуется. Но это - важно. ChAесли такой ключ сделать кластерным Разумеется. ChAсразу получаешь данные из поля size Не понял. Если к запросам добавить and size=0 - почему ничего не изменится в смысле IO? Злой Бобрпри таком объеме данных проще сделать выборку по ПК и потом уже из нее условие по size Имеешь в виду select x,y,id_ver,size from tab where <тут нет условия для size>? Злой БобрКто-то слегка промахнулся при создании базы Базы ещё нет. Это некая таблица, одна из десятков тыщ других похожих. Где-то больше записей, где-то меньше, но в некоторых оно точно будет достижимо под завязку. Слить в одну нельзя по причине слишком уж сурового общего количества записей (рабочий максимум порядка 300 млрд., в реальности наверное 1 млрд.) и непрогнозируемого их распределения. Злой Бобрнеуказана БД БД - любая из "взрослых" РСУБД (скажем, из "большой пятёрки"), причём предполагается что уровень знаний в администрировании этой СУБД у пользователя не обязательно выше среднего (максимум - выделил память и место, привязал кэш и настроил рост девайсов). На особенности раскидывания по кэшам и всяким партициям закладываться нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 03:02
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовChAсразу получаешь данные из поля sizeНе понял. Если к запросам добавить and size=0 - почему ничего не изменится в смысле IO?Кластерный индекс в MS SQL, представляет собой саму таблицу. Здесь чуть подробнее. Поиск по индексу сразу приводит на страницы данных из которых собственно и берешь значение size, которые физически "живут" вместе с индексом. Так что получаешь ты их фактически бесплатно, IO уходит только на поиск и выборку pages. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 03:08
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовChAвыигрыш в целом неочевиден Ну выигрыш именно чтобы только по данным ПК поиметь знание принака size=0. Большего не требуется. Но это - важно.Опять же в том же MS SQL можешь задать некластерный индекс с дополнительными полями, т.е., в сам индекс добавить значение поля size. Так называемые covered индексы.Но если понадобяться остальные данные, то engine придется все равно потом лезть в таблицу за ними, а это уже дополнительное IO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 13:21
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовСлить в одну нельзя по причине слишком уж сурового общего количества записей (рабочий максимум порядка 300 млрд., в реальности наверное 1 млрд.) и непрогнозируемого их распределения. Уверен? Делал эксперименты или высосал из пальца? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 13:24
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Уверен. Ибо данные уже и так есть. По шкафам на винтах. Надо запихнуть их в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:07
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовУверен. Ибо данные уже и так есть. По шкафам на винтах. Надо запихнуть их в БД. Не, повторю вопрос: с чего ты уверен, что "слить в одну нельзя" если даже не пытался? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:20
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Dimitry Sibiryakovесли даже не пытался? Я как бы сильно не первый день замужем. И знаю характерные отличия устриц от г-на в контексте общения с теми, кто их ел либо не ел. Основное написано выше: БД - любая из "взрослых" РСУБД (скажем, из "большой пятёрки"), причём предполагается что уровень знаний в администрировании этой СУБД у пользователя не обязательно выше среднего (максимум - выделил память и место, привязал кэш и настроил рост девайсов). На особенности раскидывания по кэшам и всяким партициям закладываться нельзя. То есть это не столько вопрос способности сервера поворочать ярдами записей в табличке при наличии нужного количества рук бесконечного радиуса кривизны, сколько выбор удобоваримого решения для администратора средней тупости, впрочем неспособного устроить себе слишком уж откровенный "хэдшот в ногу". Вариант всё слить в одну таблу при наличии пряморукого DBA безусловно будет, но поскольку он совершенно тривиальный с точки зрения DML - рассматривать его на форуме глупо. Кроме того, здесь приведена не вся информация о таблице и не все возможные запросы. Будет например select * по диапазону xy и order by id_ver desc. Полей ещё на 20 байт + image (в терминах MSSQL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:27
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовЯ как бы сильно не первый день замужем. Дык именно поэтому должен бы знать, что стоимость индексного доступа не зависит от прямизны рук DBA и довольно слабо - от числа записей в таблице. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:31
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Дружище, она зависит даже от того, влезет ли индекс в кэш (здесь=оперативку), и если влезет - то сколько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:36
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовДружище, она зависит даже от того, влезет ли индекс в кэш (здесь=оперативку), и если влезет - то сколько. И опять же этот фактор не зависит от DBA, который не в состоянии память раздвинуть. И, поскольку в память достаточно влезть только тем страницам индекса, на которые приходятся данные result-set-а, от общего количества записей в таблице (тех, которые не попадают в выборку) оно опять же не зависит. Нет разницы между чтением десяти страниц индекса из двадцати или десяти из тысячи. Это те же десять чтений. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 14:59
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Dimitry Sibiryakovэтот фактор не зависит от DBA, который не в состоянии память раздвинуть Отнюдь. Привязать вот эту таблу к этому кэшу, а эту оставить болтаться по остаточному принципу - вполне доступно даже для двоешнегов. Dimitry SibiryakovНет разницы между чтением десяти страниц индекса из двадцати или десяти из тысячи. Это те же десять чтений. Это в идеальном мире. В реальном мире будут важны не 10 абстрактных чтений индекса, а скажем так, мат.ожидание IO (а ещё точнее - общего времени ответа на запросы, но тут всё будет упираться в IO). Несмотря на то что xy определены для SELECT как диапазон - "окно" это может располагаться во всём множестве определения xy совершенно произвольно. Понятно что вследствие ограниченности памяти возможно придётся решать, что пришпилить в кэш (скажем так, часто используемое), а что пусть подтягивается и сливается на общих основаниях. Кроме того я указал, что тащиться будет не только ПК, но и хвост (иногда с image, иногда - без), так что с точки зрения попадания всех запрошенных данных в кэш в памяти всё несколько более напряжно, чем хотелось бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.09.2012, 19:10
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей Васкецовнапример select * по диапазону xy и order by id_ver desc.По тому же индексу будет прекрасно работать.Сергей ВаскецовПолей ещё на 20 байт + image (в терминах MSSQL).image обычно храниться не в том же адресном пространстве, что и остальные данные, дабы без надобности не увеличивать IO. Так что при включении image в результат, дополнительный IO будет однозначно. Можно явно вынести image в отдельную таблицу, если не вовсе в файловую систему. Но это зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.09.2012, 07:55
|
|||
|---|---|---|---|
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
Сергей ВаскецовОднако в любом из этих запросов может быть условие на size=0 или size<>0, что конечно изгадит всю "красоту" и полезет в таблицу. Ну не обязательно. Скажем Код: plsql 1. 2. Сергей Васкецов2. Есть ли основания предполагать, что из-за замены x=20 на (x between 40 and 41) и (x between 20 and 30) на (x between 40 and 61) хоть сколько-нибудь что-нибудь "просядет"? Если запросы будут именно такими (с константами), то я бы проблем не ожидал. А вот при использовании параметров оптимизатор вполне может недооценить селективность такого between. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.09.2012, 11:01
|
|||
|---|---|---|---|
|
|||
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей |
|||
|
#18+
softwarer(с константами) Я пока что предполагаю использовать для XY константы, а не параметры, диапазон окна будет порядка 10-20. softwarer(x, y, id_ver, size) Идея с покрывающим индексом понятна. Тем более что внезапно(!) обнаружилась ещё одна вещь, признак которой хотелось бы более или менее халявно подтягивать в запросе, и которая семантически неплохо "ложится" в size (в минус). То есть сама задача именно к этому и подталкивает ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=32&mobile=1&tid=1541545]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 471ms |

| 0 / 0 |
