Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей / 17 сообщений из 17, страница 1 из 1
13.09.2012, 01:29
    #37955295
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Таблица типа

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) хоть сколько-нибудь что-нибудь "просядет"?
...
Рейтинг: 0 / 0
13.09.2012, 02:07
    #37955300
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
1. Даже на 100 миллионов экономия в 1 байт, это всего лишь несчастные лишних 100МБ. Экономия на спичках, с альтернативой упаковки и распаковки значений как при записи, так и поиске. IMHO, не стоит того. Только механизм усложнять и причастных к этому безобразию путать. Лично я не стал бы этим заниматься, выигрыш в целом неочевиден.

Например, на MS SQL, если такой ключ сделать кластерным, с учетом характера приведённых запросов нет необходимости в дополнительном лукапе данных из таблице, фактически ты сразу получаешь данные из поля size. Т.е., кластерный индекс уже таблица упорядоченная постранично. Запросы будут с минимальным IO, так как поиск по точному значению или диапазону, которые вычисляются по дереву и поднимаются только нужные pages. Быстрее вряд ли получится.

P.S. На Oracle аналогом, ЕМНИП, будут IOT-таблицы. На других тоже наверное есть аналоги.
...
Рейтинг: 0 / 0
13.09.2012, 02:17
    #37955304
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей Васкецов,

Я думаю что при таком объеме данных проще сделать выборку по ПК и потом уже из нее условие по size. Просто реально на таком объеме сразу условие size сведет ПК в канаву, но если условия будут такие как описано, то так думается будет проще. Попробуйте на реальных данных прогнать запрос и посмотрите замер скорости.
Кто-то слегка промахнулся при создании базы...

В некоторых случаях замечено что
Код: sql
1.
select ... where x=20 and ((y=44) or (y=45) or (y=46) or (y=47) or (y=48))


отрабатывает быстрее чем
Код: sql
1.
select ... where x=20 and (y between 44 and 48)


поскольку неуказана БД, то возможно Вам это как-то и поможет методом ненаучного тыка найти "золотую середину".
...
Рейтинг: 0 / 0
13.09.2012, 02:45
    #37955308
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
ChAвыигрыш в целом неочевиден
Ну выигрыш именно чтобы только по данным ПК поиметь знание принака size=0.
Большего не требуется. Но это - важно.

ChAесли такой ключ сделать кластерным
Разумеется.

ChAсразу получаешь данные из поля size
Не понял. Если к запросам добавить and size=0 - почему ничего не изменится в смысле IO?

Злой Бобрпри таком объеме данных проще сделать выборку по ПК и потом уже из нее условие по size
Имеешь в виду select x,y,id_ver,size from tab where <тут нет условия для size>?

Злой БобрКто-то слегка промахнулся при создании базы
Базы ещё нет. Это некая таблица, одна из десятков тыщ других похожих. Где-то больше записей, где-то меньше, но в некоторых оно точно будет достижимо под завязку. Слить в одну нельзя по причине слишком уж сурового общего количества записей (рабочий максимум порядка 300 млрд., в реальности наверное 1 млрд.) и непрогнозируемого их распределения.

Злой Бобрнеуказана БД
БД - любая из "взрослых" РСУБД (скажем, из "большой пятёрки"), причём предполагается что уровень знаний в администрировании этой СУБД у пользователя не обязательно выше среднего (максимум - выделил память и место, привязал кэш и настроил рост девайсов). На особенности раскидывания по кэшам и всяким партициям закладываться нельзя.
...
Рейтинг: 0 / 0
13.09.2012, 03:02
    #37955310
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовChAсразу получаешь данные из поля sizeНе понял. Если к запросам добавить and size=0 - почему ничего не изменится в смысле IO?Кластерный индекс в MS SQL, представляет собой саму таблицу. Здесь чуть подробнее. Поиск по индексу сразу приводит на страницы данных из которых собственно и берешь значение size, которые физически "живут" вместе с индексом. Так что получаешь ты их фактически бесплатно, IO уходит только на поиск и выборку pages.
...
Рейтинг: 0 / 0
13.09.2012, 03:08
    #37955313
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовChAвыигрыш в целом неочевиден
Ну выигрыш именно чтобы только по данным ПК поиметь знание принака size=0.
Большего не требуется. Но это - важно.Опять же в том же MS SQL можешь задать некластерный индекс с дополнительными полями, т.е., в сам индекс добавить значение поля size. Так называемые covered индексы.Но если понадобяться остальные данные, то engine придется все равно потом лезть в таблицу за ними, а это уже дополнительное IO.
...
Рейтинг: 0 / 0
13.09.2012, 13:21
    #37955945
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовСлить в одну нельзя по причине слишком уж сурового общего количества записей (рабочий
максимум порядка 300 млрд., в реальности наверное 1 млрд.) и непрогнозируемого их
распределения.
Уверен? Делал эксперименты или высосал из пальца?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2012, 13:24
    #37955951
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Уверен. Ибо данные уже и так есть. По шкафам на винтах. Надо запихнуть их в БД.
...
Рейтинг: 0 / 0
13.09.2012, 14:07
    #37956057
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовУверен. Ибо данные уже и так есть. По шкафам на винтах. Надо
запихнуть их в БД.
Не, повторю вопрос: с чего ты уверен, что "слить в одну нельзя" если даже не пытался?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2012, 14:20
    #37956094
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Dimitry Sibiryakovесли даже не пытался?
Я как бы сильно не первый день замужем. И знаю характерные отличия устриц от г-на в контексте общения с теми, кто их ел либо не ел.
Основное написано выше:
БД - любая из "взрослых" РСУБД (скажем, из "большой пятёрки"), причём предполагается что уровень знаний в администрировании этой СУБД у пользователя не обязательно выше среднего (максимум - выделил память и место, привязал кэш и настроил рост девайсов). На особенности раскидывания по кэшам и всяким партициям закладываться нельзя.

То есть это не столько вопрос способности сервера поворочать ярдами записей в табличке при наличии нужного количества рук бесконечного радиуса кривизны, сколько выбор удобоваримого решения для администратора средней тупости, впрочем неспособного устроить себе слишком уж откровенный "хэдшот в ногу".

Вариант всё слить в одну таблу при наличии пряморукого DBA безусловно будет, но поскольку он совершенно тривиальный с точки зрения DML - рассматривать его на форуме глупо.

Кроме того, здесь приведена не вся информация о таблице и не все возможные запросы. Будет например select * по диапазону xy и order by id_ver desc. Полей ещё на 20 байт + image (в терминах MSSQL).
...
Рейтинг: 0 / 0
13.09.2012, 14:27
    #37956109
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовЯ как бы сильно не первый день замужем.
Дык именно поэтому должен бы знать, что стоимость индексного доступа не зависит от
прямизны рук DBA и довольно слабо - от числа записей в таблице.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2012, 14:31
    #37956117
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Дружище, она зависит даже от того, влезет ли индекс в кэш (здесь=оперативку), и если влезет - то сколько.
...
Рейтинг: 0 / 0
13.09.2012, 14:36
    #37956126
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовДружище, она зависит даже от того, влезет ли индекс в кэш
(здесь=оперативку), и если влезет - то сколько.

И опять же этот фактор не зависит от DBA, который не в состоянии память раздвинуть. И,
поскольку в память достаточно влезть только тем страницам индекса, на которые приходятся
данные result-set-а, от общего количества записей в таблице (тех, которые не попадают в
выборку) оно опять же не зависит. Нет разницы между чтением десяти страниц индекса из
двадцати или десяти из тысячи. Это те же десять чтений.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2012, 14:59
    #37956187
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Dimitry Sibiryakovэтот фактор не зависит от DBA, который не в состоянии память раздвинуть
Отнюдь. Привязать вот эту таблу к этому кэшу, а эту оставить болтаться по остаточному принципу - вполне доступно даже для двоешнегов.

Dimitry SibiryakovНет разницы между чтением десяти страниц индекса из двадцати или десяти из тысячи. Это те же десять чтений.
Это в идеальном мире. В реальном мире будут важны не 10 абстрактных чтений индекса, а скажем так, мат.ожидание IO (а ещё точнее - общего времени ответа на запросы, но тут всё будет упираться в IO). Несмотря на то что xy определены для SELECT как диапазон - "окно" это может располагаться во всём множестве определения xy совершенно произвольно. Понятно что вследствие ограниченности памяти возможно придётся решать, что пришпилить в кэш (скажем так, часто используемое), а что пусть подтягивается и сливается на общих основаниях. Кроме того я указал, что тащиться будет не только ПК, но и хвост (иногда с image, иногда - без), так что с точки зрения попадания всех запрошенных данных в кэш в памяти всё несколько более напряжно, чем хотелось бы.
...
Рейтинг: 0 / 0
13.09.2012, 19:10
    #37956690
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей Васкецовнапример select * по диапазону xy и order by id_ver desc.По тому же индексу будет прекрасно работать.Сергей ВаскецовПолей ещё на 20 байт + image (в терминах MSSQL).image обычно храниться не в том же адресном пространстве, что и остальные данные, дабы без надобности не увеличивать IO. Так что при включении image в результат, дополнительный IO будет однозначно. Можно явно вынести image в отдельную таблицу, если не вовсе в файловую систему. Но это зависит.
...
Рейтинг: 0 / 0
14.09.2012, 07:55
    #37956986
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
Сергей ВаскецовОднако в любом из этих запросов может быть условие на size=0 или size<>0, что конечно изгадит всю "красоту" и полезет в таблицу.
Ну не обязательно. Скажем

Код: plsql
1.
2.
create index my_table_pk_i on my_table(x, y, id_ver, size);
alter table my_table add constraint my_table_pk primary key(x, y, id_ver);



Сергей Васкецов2. Есть ли основания предполагать, что из-за замены x=20 на (x between 40 and 41) и (x between 20 and 30) на (x between 40 and 61) хоть сколько-нибудь что-нибудь "просядет"?
Если запросы будут именно такими (с константами), то я бы проблем не ожидал. А вот при использовании параметров оптимизатор вполне может недооценить селективность такого between.
...
Рейтинг: 0 / 0
14.09.2012, 11:01
    #37957237
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей
softwarer(с константами)
Я пока что предполагаю использовать для XY константы, а не параметры, диапазон окна будет порядка 10-20.

softwarer(x, y, id_ver, size)
Идея с покрывающим индексом понятна. Тем более что внезапно(!) обнаружилась ещё одна вещь, признак которой хотелось бы более или менее халявно подтягивать в запросе, и которая семантически неплохо "ложится" в size (в минус).
То есть сама задача именно к этому и подталкивает )))
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Таблица с ПК smallint+smallint+smallint на 20-60 млн. записей / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]