Будет ли использование разделов хорошей идеей в такой ситуации? - PullRequest
5 голосов
/ 29 ноября 2010

Контекст: база данных Oracle 10.

В довольно большой таблице (несколько миллионов записей) мы недавно начали видеть некоторые проблемы с производительностью. Таблица имеет некоторые особые поведения / условия.

  • в основном пишут один раз, а потом никогда не меняются
  • в течение первого дня или около того записи классифицируются от 0..N (давайте назовем этот класс столбца). записи могут быть переклассифицированы несколько раз в течение первого дня
  • добавлены новые записи с классом 0, означающим "еще не классифицирован"
  • каждый час или около того процесс классифицирует новые reocrds и дает им новый класс с 1..N
  • все читатели заинтересованы только в классе 1
  • все записи старше одного дня почти не меняют свой класс,> 1 очищается через несколько дней

Теперь, поскольку большая часть доступа осуществляется к классу 1, этот столбец часто участвует в запросах (класс = 1) вместе с другими условиями. У нас есть индекс для столбца класса, а затем снова для некоторых других столбцов.

На мой вопрос: сейчас мы думаем разбить эту таблицу по классам. Насколько я понял, это ускорило бы индексацию / работу с данными, поскольку класс = 1 уже отделен от остальной части данных и, следовательно, доступ к ним неявно более эффективен. Это правильно?

Если вы согласны с тем, что это хорошая идея, я продолжу читать эту тему!

Спасибо Приветствия

Обновление 2010.11.30

Большое спасибо за ввод. Я не знал, что это дополнительный вариант :) спасибо за указание на это (прежде чем я потратил слишком много времени на это). Но помимо проблемы с лицензией, мне кажется, что раздел не обязательно является хорошим решением в этом контексте.

Ответы [ 3 ]

4 голосов
/ 29 ноября 2010

Какие операции испытывают медлительность, и вы смогли определить, почему эти операции медленные?

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

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

CREATE INDEX idx_new_entries
    ON your_table( (CASE WHEN class = 0 THEN primary_key ELSE null END) );

CREATE INDEX idx_class1_entries
    ON your_table( (CASE WHEN class = 1 THEN primary_key ELSE null END) );

вместе с парой просмотров

CREATE VIEW vw_new_entries
AS
SELECT (CASE WHEN class = 0 THEN primary_key ELSE null END) primary_key,
       <<list of columns>>
  FROM your_table
 WHERE class = 0

CREATE VIEW vw_class1_entries
AS
SELECT (CASE WHEN class = 1 THEN primary_key ELSE null END) primary_key,
       <<list of columns>>
  FROM your_table
 WHERE class = 1

тогда любые запросы к новым представлениям, отфильтрованным по PRIMARY_KEY, будут использовать индексы на основе функций, которые, в свою очередь, будут индексировать только соответствующие строки в базовой таблице. Это может позволить вам улучшить производительность поиска, не прибегая к разбиению.

3 голосов
/ 29 ноября 2010

Насколько велика таблица в МБ?Какова скорость роста?Вы очищаете данные или планируете очистить данные?Какие индексы сейчас на столе?Можете ли вы дать нам определение таблицы образцов?Разделение - это дополнительная лицензия.Вы проверили, что кто-то действительно заплатит за это?

и, самое главное, предоставьте примеры запросов

Предоставленных вами данных недостаточно для обоснования решения.

0 голосов
/ 29 ноября 2010

Да, звучит как хорошая идея.

Хотя есть и лучшие альтернативы, но простое решение - это раздел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...