Re[4]: Вертикальное партицирование - есть ли смысл?
От: MozgC США http://nightcoder.livejournal.com
Дата: 02.11.09 21:50
Оценка: +1
Поговорил тут с одним специалистом, очень хорошо на мой взгляд разбирающимся в БД.

Он говорит что всегда в таких случаях, когда определенные столбцы используются редко, выносит эти столбцы в отдельную таблицу.

Основные причины:

1) Уменьшение размера базы данных. Так как в большинстве случаев используется фиксированный размер строк, поэтому если в таблице с миллионом строк указано только 10% комментариев (varchar(250)), то экономия размера базы будет — сотни мегабайт (примерно от 235 Мб до более полугигабайта в зависимости от используемой кодировки).

2) Ускорение чтения (и записи) с жесткого диска. Допустим чтение происходит блоками по 8К и размер записи — N, тогда в 1 блоке уместится 8К/N записей в случае если комментарий у нас в общей таблице и 8K/(N-250) если комментарий в отдельной таблице. С одной стороны зачастую практически вся БД может находиться в кеше, с другой стороны даже в таком случае время от времени происходит сохранение из кеша на жесткий диск, т.е. некоторая разница все равно будет.

3) Ускорение выполнения некоторых запросов, иногда многократное ускорение. И речь идет не только о случае с SELECT * FROM order_lines когда комментарии не нужны в выборке.
Допустим заполнен малый процент комментариев. И нужно выбрать все комментарии за сегодня. В случае когда комментарии находятся в той же таблице запрос будет такой:
SELECT ... FROM order_lines WHERE Comment IS NOT NULL AND CAST(TSComment AS DATE) = '2009-11-02'

Будет перебрана куча записей, чтобы найти требуемые записи с комментариями.
Такая выборка будет заметно менее быстрой чем в случае когда комментарии хранятся в отдельной таблице:
SELECT ... FROM order_line_comments INNER JOIN order_lines ON (...) WHERE CAST(TSComment AS DATE) = '2009-11-02'

Разница в скорости в таких запросах скорее всего будет в разы.

4) Разносим индексы по разным таблицам. Во-первых, теперь индексы будут обновляться реже: к примеру при вставке записи без комментария индексы в таблице комментариев не трогаются. Во-вторых, в некоторых СУБД будет и сокращение размеров индексов (к примеру в SQL Server индексы включают указатели на строки с null-значением индексируемого столбца, соответственно индекс по Comment в таблице order_lines будет намного больше, чем индекс по Comment в таблице order_line_comments).

Ну вот такие вот мысли.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.