|
|
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
В БД имеется таблица, которая ежегодно будет пополняться 400 000-ми записей. И все эти записи должны быть всё время доступны для просмотра и выборок по сети. Подскажите, пожалуйста, насколько всё это будет тормозить, и что можно сделать? может, имеет смысл эту таблицу разбивать на несколько таблиц по какому-либо критерию с сохранением доступности информации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 03:59 |
|
||
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
А на SQL-сервер не думал перенести ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 09:01 |
|
||
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
Давай считать, причем ограничение наступит скорее из-за размера файла в 2Г. Предположим, что одна запись в таблице занимает 500 байт (2 поля с(254), 0.5 Кб), тогда 2 000 000Кб/(400 000 * 0.5) = 10 лет понадобится для достижения предельного размера файла. По аналогии посмотри сколько занимат одна запись. Теперь по кол-ву записей за наши 10 лет появится 4 млн записей, что < 1 млрд возможных записей в таблице. Про скорость выборки - если у тебя запросы будут использовать Rushmore оптимизацию (те построены грамотные индексы), то скорость выполнения будет быстрой, конечно если ты не собираешься вытягивать по млн записей за раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 09:36 |
|
||
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
Вообще-то, и партиционирование может быть в конкретном случае хорошим вариантом. Партиционировать надо по такому критерию, который позволит в дальнейшем: - работать с набором таблиц наиболее простым образом, - поможет оптимизации выполнения запросов на выборку данных в большинстве случаев. Пример реализации А. В многочисленных случаях в качестве критерия партиционирования подходит дата создания записи. В этом случае: 1. Запись всегда осуществляется в таблицу, соответствующую текущему периоду - что хорошо, потому что код заполнения таблицы получается ничуть не сложнее, чем в случае с одной таблицей. 2. Предусматривается процедура "закрытие старого / открытие нового периода", которая создает таблицу-часть, соответствующая новому периоду и устанавливает на нее хранящийся где-то контекст работы с периодами. Предыдущая таблица-часть объявляется недоступной для дальнейшего редактирования (закрытой). 3. Для выборок можно: - либо сделать допущение: выбираем только из одного периода за раз (тогда тот же select, который мы бы написали для единой таблицы, полностью подойдет, только придется как-то фразу "from" определять до выполнения этого запроса), - либо немного усложнить код, например, формировать составной select union select динамически (но период, интересующий пользователя, все равно надо запросить до того), или уже иметь параметризованный local view, в котором все объединения уже сделаны и осталось только подставить параметры, или обойтись без sql-операторов, обойдясь только командами xBase (или используя их комбинацию: несколько select-ов каждый раз из одной партиции в цикле с append-ами в общую выборку). Пример реализации Б. То же, что и A, но изначально мы пишем в "оперативную" часть таблицы, откуда потом (уже после того, как запись получит атрибут "закрыта окончательно" - т.е. дальнейшего редактирования записи уже не будет) разносим в части-партиции для архивного хранения. Соответственно, в запросах объединяем (по обстоятельствам) не только к части-партиции, но и оперативную часть. Лично мне милее вариант Б. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 13:13 |
|
||
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
Но вариант А лучше оптимизируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 13:14 |
|
||
|
распухание таблицы. работа в сети.
|
|||
|---|---|---|---|
|
#18+
Добавлю ещё (полу)вариант к предложенным Urri ;) Исходим из следующих фактов: 1) ограничение в 2GB на файл (не таблицу, а именно файл, т.к. это может быть fpt файл) наступит гораздо раньше достижения гипотетического миллиарда записей; 2) в сегрегировании нуждаются обычно только одна, две большие таблицы, остальные спокойно укладываются в допустимые пределы. В качестве решения можно в основной таблице, содержащей внешний ключ на сегрегированные данные, хранить помимо собственно ключа еще и ключ сегрегации, указывающий в какой физически таблице эти данные находятся. Доступ к данным немного усложняется, зато дробить можно как угодно, например автоматически при превышении какого-то размера (не обязательно дотягивать до 2GB, можно существенно меньше) (У меня сейчас более 10 млн записей в год - ничего, работаем. Смотрим не один год в сторону Оракл + Аппликейшн, но пока всё работаем :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2005, 15:03 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33393775&tid=1592951]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 457ms |

| 0 / 0 |
