powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужно уменьшить темпы роста таблицы
20 сообщений из 20, страница 1 из 1
Нужно уменьшить темпы роста таблицы
    #35469773
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Имеется таблица связи (назовём A_B), в которой расчетное количество строк при нынешней структуре БД может достугнуть миллиарда - совершенно монстроидальный размер на общем фоне БД. При этом накладные расходы в разы превышают собственно данные.
Получается это примерно так: на одну запись в таблице B приходиться 9000 различных записей в таблице A. Пополнение, в основном, идёт в таблице B.

Структура A_B:
Код: plaintext
1.
2.
a_id     integer  --идентификатор записи таблицы A
b_id     integer  --идентификатор записи таблицы B
a_freq  smallint  --"вес" связи

Соответственно нужно каким-то образом изменить структуру A_B, так чтобы уменьшить приращение строк и при этом сохранить возможность более или менее нормально манипулировать данными.

Пока есть только одна идея - развернуть b_id в строку, закодировав значения - тогда количество строк будет соответствовать таблице А(~500K) и можно будет искать b_id с помощью LIKE, аналогично с a_freq. Однако перспективы такого способы очень сомнительны.

(СУБД PostgreSQL)
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35470679
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr Однако перспективы такого способы очень сомнительны Я бы даже сказал чрезвычайно сомнительны. Оператор LIKE не способствует скорости запросов. Не знаю как в Постгре, но в других БД это источник table scan.

Между таблицами А и В, я так понимаю, связь многие-ко-многим?
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35471177
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Senya_LМежду таблицами А и В, я так понимаю, связь многие-ко-многим?
Именно так.

За неимением лучших вариантов начал тестировать описанный способ.

Цифры на тестовом наборе данных такие:
записей в A_B 12000000 (размер 770 Мб)
записей в A_B_test 550000 (размер 210 Мб) (b_id и a_freq развернуты в varchar)
На обоих таблицах индесы по a_id.

Скорость выборки:
Код: plaintext
1.
2.
3.
select a_id from A_B where b_id= 10 
== 7  секунд
select a_id from A_B_test where b_id like '%@10@%'
== 2  секунды

Абсолютная победа %]
Похоже меньший объем по строкам компенсирует затраты на like.
Только обрабатывать это всё будет сложно.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35471484
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NtrНа обоих таблицах индесы по a_id.
А индекса по b_id нет? Ну тогда в обоих случаях фуллскан идет и то, что он по большей таблице идет медленнее вполне возможно. Попробуйте индекс по b_id создать.

NtrПохоже меньший объем по строкам компенсирует затраты на like.
А откуда взялся настолько меньший объем? Я, конечно, с Postres не знаком, но неужели он настолько неэффективно числа хранит? Ведь в вашем тестовом примере все те же числа записаны в строчку, да еще и куча разделителей добавлена.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35471863
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr wrote:
> Соответственно нужно каким-то образом изменить структуру A_B, так чтобы
> уменьшить приращение строк и при этом сохранить возможность более или
> менее нормально манипулировать данными.

Надо ли ? Чем вас собственно миллиардная таблица не устраивает ?

> Пока есть только одна идея - развернуть b_id в строку, закодировав
> значения - тогда количество строк будет соответствовать таблице А(~500K)
> и можно будет искать b_id с помощью LIKE, аналогично с a_freq. Однако
> перспективы такого способы очень сомнительны.

Идея однозначно плохая.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472032
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr
Код: plaintext
1.
select a_id from A_B_test where b_id like '%@10@%'
== 2  секунды
Абсолютная победа %]Если бы...
А если число 10 встретится вначале или в конце строки?

Кстати, а в PostgreSQL какое ограничение на длину varchar ?
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472116
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Bogdanov Andrey NtrНа обоих таблицах индесы по a_id.
А индекса по b_id нет? Ну тогда в обоих случаях фуллскан идет и то, что он по большей таблице идет медленнее вполне возможно. Попробуйте индекс по b_id создать.Индекс я привёл только для уточнения занимаемого дискового пространства. (индекс на A_B - ~150 Мб, A_B_test - ~12 Мб). Фуллскан, очевидно, будет иметь место в любом случае из-за like. У Postgres есть очень экзотичные типы индексов, но пока их не рассматривал.

Bogdanov AndreyА откуда взялся настолько меньший объем? Я, конечно, с Postres не знаком, но неужели он настолько неэффективно числа хранит? Ведь в вашем тестовом примере все те же числа записаны в строчку, да еще и куча разделителей добавлена.
www.postgresql.org/docs/faqs.FAQ_russian.html
24 байт: на каждый заголовок строки в таблице (приблизительно)
+ 4 байта: указатель на странице для всей табличной строки именно поэтому захотелось уменьшить количество строк.
Теперь получается, что накладных расходов - <3 байт на каждое значение b_id (оно вряд ли перевалит за 99999)

Кстати, Firebird на эту табличку понадобилось ~660мб без индекса.
Ещё есть подозрение, что они оба оставляют много места на каждой странице для версий.

MasterZiv
Надо ли ? Чем вас собственно миллиардная таблица не устраивает ?
...
Идея однозначно плохая.Ситуация самому не нравится, теряются преимущества реляционной модели и не известно как это будет себя вести на иных запросах. Таблица второстепенная, но полезная для аналитики. Объёмы заставляют изгаляться.
А работать это всё пока должно на персоналке, без всякого рэйда :)

miksoft Ntr
Код: plaintext
1.
select a_id from A_B_test where b_id like '%@10@%'
== 2  секунды
Абсолютная победа %]Если бы...
А если число 10 встретится вначале или в конце строки?там собаки в качестве терм. символов написаны
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472159
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Bogdanov AndreyПопробуйте индекс по b_id создать. С индексом по b_id на A_B чуть быстрее, но все равно дольше: 4-5 сек. Вполне закономерно - различных значений по этому полю всего 1300 - на 12 млн. строк.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472172
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr miksoft Ntr
Код: plaintext
1.
select a_id from A_B_test where b_id like '%@10@%'
== 2  секунды
Абсолютная победа %]Если бы...
А если число 10 встретится вначале или в конце строки?там собаки в качестве терм. символов написаныЯ так понял, что знак "@" вы использовали просто как разделитель. Это не так?
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472177
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NtrПопробуйте индексы (a_id, b_id, a_freq) и (b_id, a_id, a_freq)
Каждый может быть полезен для своего вида запросов.

Еще вопросы:
В PostgreSQL бывают индексно-организованные таблицы?
В PostgreSQL бывают компрессированные индексы?
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472231
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
miksoftЯ так понял, что знак "@" вы использовали просто как разделитель. Это не так?Так, этот же символ стоит и в начале и конце строки, поэтому "like '%@10@%'" работает корректно независимо от позиции искомого.

miksoftЕще вопросы:
В PostgreSQL бывают индексно-организованные таблицы?
В PostgreSQL бывают компрессированные индексы?Хорошие вопросы. Похоже я попытался изобразить как раз "индексно-организованные таблицы". С PostgreSQL разбираюсь всего полтора дня; быстрый поиск нечего ценного не дал, видимо их всё-таки там нет. Спасибо за намёк, теперь ясно что искать.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472469
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr[ Похоже я попытался изобразить как раз "индексно-организованные таблицы". С PostgreSQL разбираюсь всего полтора дня; быстрый поиск нечего ценного не дал, видимо их всё-таки там нет. Спасибо за намёк, теперь ясно что искать.

http://www.postgresql.org/docs/8.1/interactive/sql-cluster.html]CLUSTER tablename
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472472
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: вообще таблица и индех сравнительно небольшие, все долно влезать в кэш. На чем все это у вас бегает и что делает постгрес бакенд во время исполнения данного запроса? Статус можно посмотреть в pgAdmin или утилитой ptop.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35472606
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А поинтересоваться можно (если это не коммерческая тайна, конечно ;)), что за информация в этих трех таблицах? Иногда правильнее перепроектировать, чем играться индексами
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35474014
student2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И правда, скажите по секрету, что за прикладная область? Что хотите получить?
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35474928
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Konstantin~ http://www.postgresql.org/docs/8.1/interactive/sql-cluster.html]CLUSTER tablename Спасибо, нужно попробовать.
Нашел хорошее описание того, что требуется здесь :
Исключительно индексная таблица является индексом типа B-Tree базы данных, который одновременно исполняет роль таблицы. Все данные такой таблицы хранятся в индексе. Преимуществом создания полностью индексированных таблиц состоит в экономии места хранения на диске и сокращения объема ввода/вывода , поскольку ключевые колонки нет необходимости сохранять еще раз в таблице.Гугл сказал, что в явном виде это умеет делать (только) Oracle. В InnoDB и Sybase то же самое получается с помощью кластерного индекса, с PostgreSQL пока не ясно.

Senya_LА поинтересоваться можно (если это не коммерческая тайна, конечно ;)), что за информация в этих трех таблицах? Иногда правильнее перепроектировать, чем играться индексамиЗадача общего характера, подробности описывать не стану, но примерно так: есть множество составных объектов (таблица B) и множество элементов (таблица A), которые объект может использовать, т.е. включать в себя. Соответственно каждый элемент может принадлежать нескольким объектам. Связь позволяет охарактеризовать и объект и элемент.
Схема по сути стандартная, ничего не выкинешь.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35475032
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю что гугл говорит, зато официальная дока по постгрес говорит что можно реорганизовать таблицу в соотвествии с определенным индексом комадной CLUSTER. Функция существует помойму с 8.0 . Попробуйте организовать A_B по индексу для b_id.

Но вообще помойму тут какая-то проблема с настройкой/конфигураций. Мысли такие отого что размер таблицы А_B и ее индекса в вашем тесте небольшие и время исполнения подобных запросов должно исчислятся милисекундами.

Для выяснения того что происходит надо понять что делает посгрес эти 7 секунд пока выполняется запрос:
Код: plaintext
1.
select a_id from A_B where b_id= 10 
== 7  секунд
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35476175
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа - посмотрите план запроса...
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35476582
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ntr В InnoDB и Sybase то же самое получается с помощью кластерного индексаВ MSSQL это получается точно таким же путем :)
Все данные такой таблицы хранятся в индексе. Преимуществом создания полностью индексированных таблиц состоит в экономии места хранения на диске и сокращения объема ввода/вывода, поскольку ключевые колонки нет необходимости сохранять еще раз в таблице.Это преимущество легко превращается в недостаток. Кластерные индексы - не самый лучший способ для "вытаскивания" ограниченного кол-ва строк, особенно если таблица "широкая", т.е. много столбцов, большой размер типов столбцов и т.п.
...
Рейтинг: 0 / 0
Нужно уменьшить темпы роста таблицы
    #35477271
Ntr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ntr
Гость
Попробовал cluster table. Таблица занимает ровно столько же места. В общем, это обычный кластерный индекс.
Ключевым словом в описании было "b-tree", т.е. данные хранятся в виде дерева - таким образом исключается дублирование по заданным полям и получаются прочие прелести.

Решил остановиться на том, что наваял. Всем спасибо.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужно уменьшить темпы роста таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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