операций SELECT, UPDATE и DEEETE оптимизатор запросов Oracle должен быть способен выполнять абсолютно то же самое. Однако в бета-версии ПО, с которым мы работаем, он делает это лишь в определенных случаях. Пути решения данной проблемы рассматриваются в следующем разделе.
Определение ключа секционирования
В идеальном мире стратегия секционирования предполагала бы определение ключа секционирования каким-то простым способом, однако в мире компьютеров все не так просто. Вновь возвращаясь к примеру с телефонными кодами США, мы видим, что поместить Аляску (код 907) в одну секцию с Невадой (код 702) невозможно, если только данная секция не содержит также и город Хьюстон (код 713). Вероятно, это в точности совпало бы с нашими планами, но Хьюстон — четвертый по величине город в США, поэтому мы, быть может, захотим создать для него отдельную секцию. Как заставить все это работать? Добавьте в строку таблицы еще одно поле (как будто таблица и без того недостаточно велика!) и с помощью таблицы преобразования установите соответствие между нашими логическим и физическим ключами секционирования. Вот пример соответствия:
Area Code
212
702
713
907
Partition_Key
1
30
30
Потребность в дополнительном пространстве и нагрузка на центральный процессор при выполнении этого преобразования и обработке еще одного столбца таблицы не настолько высоки, чтобы полностью отказаться от секционирования, но все же влекут за собой нежелательные затраты и повышают сложность приложения. Наша книга посвящена OracleS, а не общим принципам проектирования, однако мы чувствуем себя обязанными сделать общее замечание: каждое очередное усложнение структуры данных увеличивает вероятность ошибок, допускаемых людьми, которые пишут код для обработки этой структуры. В Oracle есть триггеры, призванные помочь вам скрыть дополнительный столбец при выполнении операции INSERT, но, к несчастью, при высокоскоростной загрузке данных они не срабатывают.
А как насчет того, чтобы равносекционировать таблицу и индекс первичного ключа? К сожалению, этот путь использовать нельзя, потому что ключ секционирования не входит в первичный ключ. Если мы хотим секционировать индекс первичного ключа, то лучше всего использовать в качестве ключа секционирования код зоны и просто смириться с тем неудобством,
60	OraclcS