5.10. СекÑиониÑование ÑаблиÑ
- 5.10.1. ÐбзоÑ
- 5.10.2. ÐеклаÑаÑивное ÑекÑиониÑование
- 5.10.3. РеализаÑÐ¸Ñ Ñ Ð¸ÑполÑзованием наÑледованиÑ
- 5.10.4. СекÑиониÑование и иÑклÑÑение по огÑаниÑениÑ
- 5.10.5. РекомендаÑии по деклаÑаÑÐ¸Ð²Ð½Ð¾Ð¼Ñ ÑекÑиониÑованиÑ
- 5.10.2. ÐеклаÑаÑивное ÑекÑиониÑование
PostgreSQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑÑое ÑекÑиониÑование ÑаблиÑ. Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ, как и поÑÐµÐ¼Ñ Ð±ÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑименÑÑÑ ÑекÑиониÑование пÑи пÑоекÑиÑовании баз даннÑÑ .
5.10.1. ÐбзоÑ
СекÑиониÑованием даннÑÑ Ð½Ð°Ð·ÑваеÑÑÑ Ñазбиение одной болÑÑой логиÑеÑкой ÑаблиÑÑ Ð½Ð° неÑколÑко менÑÑÐ¸Ñ ÑизиÑеÑÐºÐ¸Ñ ÑекÑий. СекÑиониÑование Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинеÑÑи ÑледÑÑÑÑÑ Ð¿Ð¾Ð»ÑзÑ:
РопÑеделÑннÑÑ ÑиÑÑаÑиÑÑ Ð¾Ð½Ð¾ каÑдиналÑно ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð±ÑÑÑÑодейÑÑвие, оÑобенно когда болÑÑой пÑоÑÐµÐ½Ñ ÑаÑÑо запÑаÑиваемÑÑ ÑÑÑок ÑаблиÑÑ Ð¾ÑноÑиÑÑÑ Ðº одной или лиÑÑ Ð½ÐµÑколÑким ÑекÑиÑм. СекÑиониÑование Ð¼Ð¾Ð¶ÐµÑ ÑÑгÑаÑÑ ÑÐ¾Ð»Ñ Ð²ÐµÐ´ÑÑÐ¸Ñ ÑÑолбÑов в индекÑÐ°Ñ , ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑменÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа и ÑвелиÑÐ¸Ñ Ð²ÐµÑоÑÑноÑÑÑ Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ воÑÑÑебованнÑÑ ÑаÑÑей индекÑов в памÑÑи.
Ðогда в вÑбоÑке или изменении даннÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвована болÑÑÐ°Ñ ÑаÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑии, поÑледоваÑелÑное ÑканиÑование ÑÑой ÑекÑии Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем ÑлÑÑайнÑй доÑÑÑп по индекÑÑ Ðº даннÑм, ÑазбÑоÑаннÑм по вÑей ÑаблиÑе.
ÐаÑÑовÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸ Ñдаление даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑÑеÑÑвлÑÑÑ, добавлÑÑ Ð¸ ÑдалÑÑ ÑекÑии, еÑли ÑÑо бÑло пÑедÑÑмоÑÑено пÑи пÑоекÑиÑовании ÑекÑиониÑованнÑÑ ÑаблиÑ. ÐпеÑаÑиÑ
ALTER TABLE DETACH PARTITIONили Ñдаление оÑделÑной ÑекÑии Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑDROP TABLEвÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем маÑÑÐ¾Ð²Ð°Ñ Ð¾Ð±ÑабоÑка. ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñакже полноÑÑÑÑ Ð¸ÑклÑÑаÑÑ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñе ÑаÑÑ Ð¾Ð´Ñ, ÑвÑзаннÑе Ñ Ð²ÑполнениемVACUUMпоÑлеDELETE.Редко иÑполÑзÑемÑе даннÑе можно пеÑенеÑÑи на более деÑÑвÑе и медленнÑе ноÑиÑели.
ÐÑÑ ÑÑо обÑÑно полезно ÑолÑко Ð´Ð»Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑаблиÑ. Ðакие именно ÑаблиÑÑ Ð²ÑигÑаÑÑ Ð¾Ñ ÑекÑиониÑованиÑ, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного пÑиложениÑ, Ñ Ð¾ÑÑ, как пÑавило, ÑÑо ÑледÑÐµÑ Ð¿ÑименÑÑÑ Ð´Ð»Ñ ÑаблиÑ, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ Ð¿ÑевÑÑÐ°ÐµÑ Ð¾Ð±ÑÑм ÐÐУ ÑеÑвеÑа.
PostgreSQL пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ ÑледÑÑÑÐ¸Ñ Ð²Ð¸Ð´Ð¾Ð² ÑекÑиониÑованиÑ:
- СекÑиониÑование по диапазонам
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ð¿Ð¾ «диапазонам», опÑеделÑннÑм по клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ Ð¸Ð»Ð¸ набоÑÑ ÑÑолбÑов, и не пеÑеÑекаÑÑимÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом. ÐапÑимеÑ, можно ÑекÑиониÑоваÑÑ Ð´Ð°Ð½Ð½Ñе по диапазонам Ð´Ð°Ñ Ð¸Ð»Ð¸ по диапазонам иденÑиÑикаÑоÑов опÑеделÑннÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-обÑекÑов.
- СекÑиониÑование по ÑпиÑкÑ
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпиÑка, Ñвно ÑказÑваÑÑего, какие знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑноÑиÑÑÑÑ Ðº каждой ÑекÑии.
ÐÑли ваÑÐµÐ¼Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑебÑÑÑÑÑ Ð´ÑÑгие ÑоÑÐ¼Ñ ÑекÑиониÑованиÑ, можно Ñакже пÑибегнÑÑÑ Ðº алÑÑеÑнаÑивнÑм ÑеализаÑиÑм, Ñ Ð¸ÑполÑзованием наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ пÑедÑÑавлений Ñ UNION ALL. Такие подÑ
Ð¾Ð´Ñ Ð´Ð°ÑÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ, но не даÑÑ Ñакого вÑигÑÑÑа в пÑоизводиÑелÑноÑÑи, как вÑÑÑоенное деклаÑаÑивное ÑекÑиониÑование.
5.10.2. ÐеклаÑаÑивное ÑекÑиониÑование
PostgreSQL пÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑказаÑÑ, как ÑазбиÑÑ ÑаблиÑÑ Ð½Ð° ÑаÑÑи, назÑваемÑе ÑекÑиÑми. РазделÑÐ½Ð½Ð°Ñ Ñаким ÑпоÑобом ÑаблиÑа назÑваеÑÑÑ ÑекÑиониÑованной ÑаблиÑей. Указание ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑода ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑпиÑка ÑÑолбÑов или вÑÑажений, коÑоÑÑе бÑдÑÑ ÑоÑÑавлÑÑÑ ÐºÐ»ÑÑ ÑазбиениÑ.
ÐÑе ÑÑÑоки, вÑÑавлÑемÑе в ÑекÑиониÑованнÑÑ ÑаблиÑÑ, бÑдÑÑ ÑаÑпÑеделÑÑÑÑÑ Ð¿Ð¾ ÑекÑиÑм в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа ÑазбиениÑ. ÐÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво даннÑÑ , огÑаниÑенное гÑаниÑами ÑекÑии. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² каÑеÑÑве меÑодов ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ Ñазбиение по диапазонам и по ÑпиÑкам, когда каждой ÑекÑии назнаÑаеÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ клÑÑей или ÑпиÑок клÑÑей, ÑооÑвеÑÑÑвенно.
Сами ÑекÑии могÑÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой ÑекÑиониÑÑемÑе ÑаблиÑÑ, благодаÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñак назÑваемого вложенного ÑекÑиониÑованиÑ. Ð ÑекÑиÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñвои индекÑÑ, огÑаниÑÐµÐ½Ð¸Ñ Ð¸ знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, оÑлиÑнÑе Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ ÑекÑий. ÐндекÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоздаваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии незавиÑимо. ÐодÑобнее о ÑекÑиониÑованнÑÑ ÑаблиÑÐ°Ñ Ð¸ ÑекÑиÑÑ ÑаÑÑказÑваеÑÑÑ Ð² опиÑании CREATE TABLE.
ÐÑеобÑазоваÑÑ Ð¾Ð±ÑÑнÑÑ ÑаблиÑÑ Ð² ÑекÑиониÑованнÑÑ Ð¸ наобоÑÐ¾Ñ Ð½ÐµÐ»ÑзÑ. Ðднако в ÑекÑиониÑованнÑÑ ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð² каÑеÑÑве ÑекÑии обÑÑнÑÑ Ð¸Ð»Ð¸ ÑекÑиониÑованнÑÑ ÑаблиÑÑ Ñ Ð´Ð°Ð½Ð½Ñми, а Ñакже можно ÑдалиÑÑ ÑекÑÐ¸Ñ Ð¸Ð· ÑекÑиониÑованной ÑаблиÑÑ Ð¸ пÑевÑаÑиÑÑ ÐµÑ Ð² оÑделÑнÑÑ ÑаблиÑÑ; обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ ALTER TABLE, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ Ð±Ð¾Ð»ÑÑе о подкомандаÑ
ATTACH PARTITION и DETACH PARTITION.
Ðа кÑлиÑами оÑделÑнÑе ÑекÑии ÑвÑзÑваÑÑÑÑ Ñ ÑекÑиониÑÑемой ÑаблиÑей ÑÑедÑÑвами наÑледованиÑ; однако Ñ ÑекÑиониÑованнÑми ÑаблиÑами и ÑекÑиÑми нелÑÐ·Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñенно иÑполÑзоваÑÑ ÑÑнкÑионалÑноÑÑÑ Ð½Ð°ÑледованиÑ, ÑаÑÑмаÑÑиваемÑÑ Ð² пÑедÑдÑÑем Ñазделе. ÐапÑимеÑ, ÑекÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´ÑÑÐ³Ð¸Ñ ÑодиÑелей, кÑоме ÑекÑиониÑованной ÑаблиÑÑ, к коÑоÑой она пÑиÑоединена, Ñак же как обÑÑÐ½Ð°Ñ ÑаблиÑа не Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑледоваÑÑÑÑ Ð¾Ñ ÑекÑиониÑованной ÑаблиÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑледнÑÑ ÑÑала ÐµÑ ÑодиÑелем. ÐÑо знаÑиÑ, ÑÑо ÑекÑиониÑованнÑе ÑаблиÑÑ Ð¸ ÑекÑии не ÑÑаÑÑвÑÑÑ Ð² наÑледовании наÑÑÐ´Ñ Ñ Ð¾Ð±ÑÑнÑми ÑаблиÑами. Так как иеÑаÑÑ Ð¸Ñ Ð½Ð°ÑледованиÑ, вклÑÑаÑÑÐ°Ñ ÑекÑиониÑованнÑÑ ÑаблиÑÑ Ð¸ ÐµÑ ÑекÑии, оÑÑаÑÑÑÑ Ð¸ÐµÑаÑÑ Ð¸ÐµÐ¹ наÑледованиÑ, на Ð½ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð²Ñе обÑÑнÑе пÑавила наÑледованиÑ, опиÑаннÑе в Раздел 5.9 Ñ Ð½ÐµÐºÐ¾ÑоÑÑми иÑклÑÑениÑми, а именно:
ÐгÑаниÑениÑ
CHECKвмеÑÑе ÑNOT NULL, опÑеделÑннÑе в ÑекÑиониÑованной ÑаблиÑе, вÑегда наÑледÑÑÑÑÑ Ð²Ñеми ÐµÑ ÑекÑиÑми. ÐгÑаниÑениÑCHECKÑ Ñ Ð°ÑакÑеÑиÑÑикойNO INHERITв ÑекÑиониÑованнÑÑ ÑаблиÑÐ°Ñ ÑоздаваÑÑ Ð½ÐµÐ»ÑзÑ.ÐÑполÑзование ÑказаниÑ
ONLYпÑи добавлении или Ñдалении огÑаниÑÐµÐ½Ð¸Ñ ÑолÑко в ÑекÑиониÑованной ÑаблиÑе поддеÑживаеÑÑÑ Ð»Ð¸ÑÑ ÐºÐ¾Ð³Ð´Ð° в ней Ð½ÐµÑ ÑекÑий. ÐÑли ÑекÑии ÑÑÑеÑÑвÑÑÑ, пÑи попÑÑке иÑполÑзованиÑONLYÐ²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка, Ñак как добавление или Ñдаление огÑаниÑений ÑолÑко в ÑекÑиониÑованной ÑаблиÑе пÑи налиÑии ÑекÑий не поддеÑживаеÑÑÑ. С дÑÑгой ÑÑоÑонÑ, огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ добавлÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑекÑиÑÑ , еÑли они оÑÑÑÑÑÑвÑÑÑ Ð² ÑодиÑелÑÑкой ÑаблиÑе. Так как ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа непоÑÑедÑÑвенно не ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе, пÑи попÑÑке иÑполÑзоваÑÑTRUNCATEONLYв ÑекÑиониÑованной ÑаблиÑе вÑегда возвÑаÑаеÑÑÑ Ð¾Ñибка.Ð ÑекÑиÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑолбÑов, оÑÑÑÑÑÑвÑÑÑÐ¸Ñ Ð² ÑодиÑелÑÑкой ÑаблиÑе. Такие ÑÑолбÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделиÑÑ Ð½Ð¸ пÑи Ñоздании ÑекÑий командой
CREATE TABLE, ни пÑÑÑм Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑÑÑеÑÑвÑÑÑие ÑекÑии Ñ Ð¸ÑполÑзованиемALTER TABLE. ТаблиÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ñ Ð² каÑеÑÑве ÑекÑий командойALTER TABLE ... ATTACH PARTITION, ÑолÑко еÑли Ð¸Ñ ÑÑолбÑÑ Ð² ÑоÑноÑÑи ÑооÑвеÑÑÑвÑÑÑ ÑодиÑелÑÑкой ÑаблиÑе, вклÑÑÐ°Ñ ÑÑолбÑÑoid.ÐгÑаниÑение
NOT NULLÐ´Ð»Ñ ÑÑолбÑа в ÑекÑии нелÑÐ·Ñ ÑдалиÑÑ, еÑли ÑÑо огÑаниÑение ÑÑÑеÑÑвÑÐµÑ Ð² ÑодиÑелÑÑкой ÑаблиÑе.
СекÑии Ñакже могÑÑ Ð±ÑÑÑ ÑÑоÑонними ÑаблиÑами (Ñм. CREATE FOREIGN TABLE), Ñ Ð¾ÑÑ Ð¿Ñи ÑÑом дейÑÑвÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑми ÑаблиÑами. ÐапÑимеÑ, даннÑе, вÑÑавлÑемÑе в ÑекÑиониÑованнÑÑ ÑаблиÑÑ, не пеÑенапÑавлÑÑÑÑÑ Ð² ÑекÑиÑ, пÑедÑÑавлÑÑÑÑÑ Ñобой ÑÑоÑоннÑÑ ÑаблиÑÑ.
5.10.2.1. ÐÑимеÑ
ÐÑедположим, ÑÑо Ð¼Ñ ÑоздаÑм Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑой компании, ÑоÑгÑÑÑей моÑоженÑм. ÐÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ ÑÑиÑÑÐ²Ð°ÐµÑ Ð¼Ð°ÐºÑималÑнÑÑ ÑемпеÑаÑÑÑÑ Ð¸ пÑодажи моÑоженого каждÑй Ð´ÐµÐ½Ñ Ð² ÑазÑезе Ñегионов. Ðо ÑÑÑи нам нÑжна ÑледÑÑÑÐ°Ñ ÑаблиÑа:
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
);ÐÑ Ð·Ð½Ð°ÐµÐ¼, ÑÑо болÑÑинÑÑво запÑоÑов бÑдÑÑ ÑабоÑаÑÑ ÑолÑко Ñ Ð´Ð°Ð½Ð½Ñми за поÑледнÑÑ Ð½ÐµÐ´ÐµÐ»Ñ, меÑÑÑ Ð¸Ð»Ð¸ кваÑÑал, Ñак как в оÑновном ÑÑа ÑаблиÑа нÑжна Ð´Ð»Ñ ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑекÑÑÐ¸Ñ Ð¾ÑÑÑÑов Ð´Ð»Ñ ÑÑководÑÑва. ЧÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ Ð¾Ð±ÑÑм Ñ ÑанÑÑÐ¸Ñ ÑÑ ÑÑаÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , Ð¼Ñ ÑеÑили оÑÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе ÑолÑко за 3 поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð³Ð¾Ð´Ð°. ÐенÑжнÑе даннÑе Ð¼Ñ Ð±Ñдем ÑдалÑÑÑ Ð² наÑале каждого меÑÑÑа. Ð ÑÑой ÑиÑÑаÑии Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑекÑиониÑование Ð´Ð»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð½Ð°ÑÐ¸Ñ ÑÑебований к ÑаблиÑе показаÑелей.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð´ÐµÐºÐ»Ð°ÑаÑивное ÑекÑиониÑование в ÑÑом ÑлÑÑае, вÑполниÑе ÑледÑÑÑее:
СоздайÑе ÑаблиÑÑ
measurementкак ÑекÑиониÑованнÑÑ ÑаблиÑÑ Ñ Ð¿ÑедложениемPARTITION BY, Ñказав меÑод ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ (в наÑем ÑлÑÑаеRANGE) и ÑпиÑок ÑÑолбÑов, коÑоÑÑе бÑдÑÑ Ð¾Ð±ÑазовÑваÑÑ ÐºÐ»ÑÑ ÑазбиениÑ.CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate);ÐÑи Ñазбиении по диапазонам в каÑеÑÑве клÑÑа ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¿Ñи желании можно иÑполÑзоваÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¸Ð· неÑколÑÐºÐ¸Ñ ÑÑолбÑов. ÐонеÑно, пÑи ÑÑом ÑкоÑее вÑего ÑвелиÑиÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑекÑий, и ÐºÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑе. РнапÑоÑив, иÑполÑзование менÑÑего ÑиÑла ÑÑолбÑов Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к менее дÑÐ¾Ð±Ð½Ð¾Ð¼Ñ ÐºÑиÑеÑÐ¸Ñ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñ Ð¼ÐµÐ½ÑÑим ÑиÑлом ÑекÑий. ÐапÑоÑ, обÑаÑаÑÑийÑÑ Ðº ÑекÑиониÑованной ÑаблиÑе, бÑÐ´ÐµÑ ÑканиÑоваÑÑ Ð¼ÐµÐ½ÑÑе ÑекÑий, еÑли в ÑÑловии поиÑка ÑигÑÑиÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе или вÑе ÑÑи ÑÑолбÑÑ. ÐапÑимеÑ, в ÑаблиÑе, ÑекÑиониÑÑемой по диапазонам, в каÑеÑÑве клÑÑа ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑбÑаÑÑ ÑÑолбÑÑ
lastnameиfirstname(в Ñаком поÑÑдке).СоздайÑе ÑекÑии. РопÑеделении каждой ÑекÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð³ÑаниÑÑ, ÑооÑвеÑÑÑвÑÑÑие меÑÐ¾Ð´Ñ Ð¸ клÑÑÑ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ ÑодиÑелÑÑкой ÑаблиÑÑ. ÐамеÑÑÑе, ÑÑо Ñказание гÑаниÑ, пÑи коÑоÑом множеÑÑво знаÑений новой ÑекÑии пеÑеÑекаеÑÑÑ Ñо множеÑÑвом знаÑений в одной или неÑколÑÐºÐ¸Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑекÑиÑÑ , бÑÐ´ÐµÑ Ð¾ÑибоÑнÑм. ÐÑи попÑÑке Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе не ÑооÑвеÑÑÑвÑÑÑ Ð½Ð¸ одной из ÑÑÑеÑÑвÑÑÑей ÑекÑий, пÑоизойдÑÑ Ð¾Ñибка; ÑооÑвеÑÑÑвÑÑÑий Ñаздел нÑжно добавлÑÑÑ Ð²ÑÑÑнÑÑ.
СекÑии, ÑоздаваемÑе Ñаким обÑазом, во вÑÐµÑ Ð¾ÑноÑениÑÑ ÑвлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми ÑаблиÑами PostgreSQL (или, возможно, ÑÑоÑонними ÑаблиÑами). Ð ÑаÑÑноÑÑи, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии можно незавиÑимо задаÑÑ ÑаблиÑное пÑоÑÑÑанÑÑво и паÑамеÑÑÑ Ñ ÑанениÑ.
ÐÐ»Ñ ÑаблиÑ-ÑекÑий Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи опÑеделÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ñ ÑÑловиÑми, задаÑÑими гÑаниÑÑ Ð·Ð½Ð°Ñений. ÐÑжнÑе огÑаниÑÐµÐ½Ð¸Ñ ÑекÑий вÑводÑÑÑÑ Ð½ÐµÑвно из опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð³ÑÐ°Ð½Ð¸Ñ ÑекÑии, когда ÑÑебÑеÑÑÑ Ðº ним обÑаÑиÑÑÑÑ.
CREATE TABLE measurement_y2006m02 PARTITION OF measurement FOR VALUES FROM ('2006-02-01') TO ('2006-03-01'); CREATE TABLE measurement_y2006m03 PARTITION OF measurement FOR VALUES FROM ('2006-03-01') TO ('2006-04-01'); ... CREATE TABLE measurement_y2007m11 PARTITION OF measurement FOR VALUES FROM ('2007-11-01') TO ('2007-12-01'); CREATE TABLE measurement_y2007m12 PARTITION OF measurement FOR VALUES FROM ('2007-12-01') TO ('2008-01-01') TABLESPACE fasttablespace; CREATE TABLE measurement_y2008m01 PARTITION OF measurement FOR VALUES FROM ('2008-01-01') TO ('2008-02-01') WITH (parallel_workers = 4) TABLESPACE fasttablespace;ÐÐ»Ñ ÑеализаÑии вложенного ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑкажиÑе пÑедложение
PARTITION BYв ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ , ÑоздаÑÑÐ¸Ñ Ð¾ÑделÑнÑе ÑекÑии, напÑимеÑ:CREATE TABLE measurement_y2006m02 PARTITION OF measurement FOR VALUES FROM ('2006-02-01') TO ('2006-03-01') PARTITION BY RANGE (peaktemp);Ðогда бÑдÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÑекÑии
measurement_y2006m02, даннÑе, добавлÑемÑе вmeasurementи попадаÑÑие вmeasurement_y2006m02(или даннÑе, непоÑÑедÑÑвенно добавлÑемÑе вmeasurement_y2006m02, Ñ ÑÑÑÑом ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑекÑии) бÑдÑÑ Ð·Ð°Ñем пеÑенапÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² Ð¾Ð´Ð½Ñ Ð¸Ð· вложеннÑÑ ÑекÑий в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑолбÑаpeaktemp. УказаннÑй клÑÑ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеÑекаÑÑÑÑ Ñ ÐºÐ»ÑÑом ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ ÑодиÑелÑ, Ñ Ð¾ÑÑ Ð¾Ð¿ÑеделÑÑÑ Ð³ÑаниÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¹ ÑекÑии нÑжно оÑмоÑÑиÑелÑно, ÑÑÐ¾Ð±Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво даннÑÑ , коÑоÑое она пÑинимаеÑ, Ð²Ñ Ð¾Ð´Ð¸Ð»Ð¾ во множеÑÑво, допÑÑкаемое ÑобÑÑвеннÑми гÑаниÑами ÑекÑии; ÑиÑÑема не пÑÑаеÑÑÑ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ ÑÑо Ñама.СоздайÑе Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ(ам), а Ñакже лÑбÑе дÑÑгие индекÑÑ, коÑоÑÑе Ð²Ñ Ñ Ð¾Ñели Ð±Ñ Ð¸Ð¼ÐµÑÑ Ð² каждой ÑекÑии. (ÐÐ½Ð´ÐµÐºÑ Ð¿Ð¾ клÑÑÑ, ÑÑÑого говоÑÑ, не Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼, но в болÑÑинÑÑве ÑлÑÑаев он бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½. ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа бÑли ÑникалÑнÑ, вам ÑледÑÐµÑ Ñакже ÑоздаÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи или пеÑвиÑного клÑÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии.)
CREATE INDEX ON measurement_y2006m02 (logdate); CREATE INDEX ON measurement_y2006m03 (logdate); ... CREATE INDEX ON measurement_y2007m11 (logdate); CREATE INDEX ON measurement_y2007m12 (logdate); CREATE INDEX ON measurement_y2008m01 (logdate);
УбедиÑеÑÑ Ð² Ñом, ÑÑо паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии constraint_exclusion не вÑклÑÑен в
postgresql.conf. ÐнаÑе запÑоÑÑ Ð½Ðµ бÑдÑÑ Ð¾Ð¿ÑимизиÑоваÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.
Рданном пÑимеÑе нам поÑÑебÑеÑÑÑ ÑоздаваÑÑ ÑекÑÐ¸Ñ ÐºÐ°Ð¶Ð´Ñй меÑÑÑ, Ñак ÑÑо бÑло Ð±Ñ ÑазÑмно напиÑаÑÑ ÑкÑипÑ, коÑоÑÑй Ð±Ñ ÑоÑмиÑовал ÑÑебÑемÑй код DDL авÑомаÑиÑеÑки.
5.10.2.2. ÐбÑлÑживание ÑекÑий
ÐбÑÑно Ð½Ð°Ð±Ð¾Ñ ÑекÑий, обÑазованнÑй изнаÑалÑно пÑи Ñоздании ÑаблиÑ, не пÑедполагаеÑÑÑ ÑÐ¾Ñ ÑанÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм. ЧаÑе наобоÑоÑ, планиÑÑеÑÑÑ ÑдалÑÑÑ ÑÑаÑÑе ÑекÑии даннÑÑ Ð¸ пеÑиодиÑеÑки добавлÑÑÑ Ð½Ð¾Ð²Ñе. Ðдно из наиболее важнÑÑ Ð¿ÑеимÑÑеÑÑв ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в Ñом, ÑÑо оно позволÑÐµÑ Ð¿ÑакÑиÑеÑки моменÑалÑно вÑполнÑÑÑ ÑÑÑдоÑмкие опеÑаÑии, изменÑÑ ÑÑÑÑкÑÑÑÑ ÑекÑий, а не ÑизиÑеÑки пеÑемеÑÐ°Ñ Ð±Ð¾Ð»ÑÑие обÑÑÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ .
СамÑй лÑгкий ÑпоÑоб ÑдалиÑÑ ÑÑаÑÑе даннÑе â пÑоÑÑо ÑдалиÑÑ ÑекÑиÑ, ÑÑавÑÑÑ Ð½ÐµÐ½Ñжной:
DROP TABLE measurement_y2006m02;
Так можно ÑдалиÑÑ Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ñ Ð·Ð°Ð¿Ð¸Ñей гоÑаздо бÑÑÑÑее, Ñем ÑдалÑÑÑ Ð¸Ñ
по одной. ÐамеÑÑÑе, однако, ÑÑо пÑиведÑÐ½Ð½Ð°Ñ Ð²ÑÑе команда ÑÑебÑÐµÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки ACCESS EXCLUSIVE.
ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑаÑÑо более пÑедпоÑÑиÑелÑнÑй ваÑÐ¸Ð°Ð½Ñ â ÑбÑаÑÑ ÑекÑÐ¸Ñ Ð¸Ð· главной ÑаблиÑÑ, но ÑÐ¾Ñ ÑаниÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ней как к ÑамоÑÑоÑÑелÑной ÑаблиÑе:
ALTER TABLE measurement DETACH PARTITION measurement_y2006m02;
ÐÑи ÑÑом можно бÑÐ´ÐµÑ Ð¿ÑодолжаÑÑ ÑабоÑаÑÑ Ñ Ð´Ð°Ð½Ð½Ñми, пока ÑаблиÑа не бÑÐ´ÐµÑ Ñдалена. ÐапÑимеÑ, в ÑÑом ÑоÑÑоÑнии оÑÐµÐ½Ñ ÐºÑÑаÑи бÑÐ´ÐµÑ ÑделаÑÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, иÑполÑзÑÑ COPY, pg_dump или подобнÑе ÑÑедÑÑва. Ðозможно, ÑÑи даннÑе Ñакже можно бÑÐ´ÐµÑ Ð°Ð³ÑегиÑоваÑÑ, пеÑевеÑÑи в компакÑнÑй ÑоÑмаÑ, вÑполниÑÑ Ð´ÑÑгÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¸Ð»Ð¸ поÑÑÑоиÑÑ Ð¾ÑÑÑÑÑ.
ÐналогиÑнÑм обÑазом можно добавлÑÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ñ Ð´Ð°Ð½Ð½Ñми. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð¿ÑÑÑÑÑ ÑекÑÐ¸Ñ Ð² главной ÑаблиÑе Ñак же, как Ð¼Ñ Ñоздавали ÑекÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ ÑоÑÑоÑнии до ÑÑого:
CREATE TABLE measurement_y2008m02 PARTITION OF measurement
FOR VALUES FROM ('2008-02-01') TO ('2008-03-01')
TABLESPACE fasttablespace;Риногда Ñдобнее ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑаблиÑÑ Ð²Ð½Ðµ ÑÑÑÑкÑÑÑÑ ÑекÑий и ÑделаÑÑ ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ñенной ÑекÑией позже. ÐÑи Ñаком Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ даннÑе можно бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑзиÑÑ, пÑовеÑиÑÑ Ð¸ пÑеобÑазоваÑÑ Ð´Ð¾ Ñого, как они поÑвÑÑÑÑ Ð² ÑекÑиониÑованной ÑаблиÑе:
CREATE TABLE measurement_y2008m02
(LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS)
TABLESPACE fasttablespace;
ALTER TABLE measurement_y2008m02 ADD CONSTRAINT y2008m02
CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' );
\copy measurement_y2008m02 from 'measurement_y2008m02'
-- possibly some other data preparation work
ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02
FOR VALUES FROM ('2008-02-01') TO ('2008-03-01' );ÐÑежде Ñем вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ATTACH PARTITION, ÑекомендÑеÑÑÑ ÑоздаÑÑ Ð¾Ð³ÑаниÑение CHECK в пÑиÑоединÑемой ÑаблиÑе, ÑооÑвеÑÑÑвÑÑÑее Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑекÑии. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ ÑиÑÑема ÑÐ¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑканиÑоваÑÑ ÑаблиÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки неÑвного огÑаниÑÐµÐ½Ð¸Ñ ÑекÑии. Ðез ÑÑого огÑаниÑÐµÐ½Ð¸Ñ CHECK ÑаблиÑÑ Ð½Ñжно бÑÐ´ÐµÑ Ð¿ÑоÑканиÑоваÑÑ Ð¸ ÑбедиÑÑÑÑ Ð² вÑполнении огÑаниÑÐµÐ½Ð¸Ñ ÑекÑии, ÑдеÑÐ¶Ð¸Ð²Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ACCESS EXCLUSIVE в ÑодиÑелÑÑкой ÑаблиÑе. ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ATTACH PARTITION ÑÑо ÑÑавÑее ненÑжнÑм огÑаниÑение CHECK пÑи желании можно ÑдалиÑÑ.
5.10.2.3. ÐгÑаниÑениÑ
С ÑекÑиониÑованнÑми ÑаблиÑами ÑвÑÐ·Ð°Ð½Ñ ÑледÑÑÑие огÑаниÑениÑ:
ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ авÑомаÑиÑеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑов во вÑÐµÑ ÑекÑиÑÑ Ð¾ÑÑÑÑÑÑвÑеÑ, поÑÑÐ¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ð½Ñжно добавлÑÑÑ Ð² каждÑÑ ÑекÑÐ¸Ñ Ð¾ÑделÑно. ÐÑо Ñакже ознаÑаеÑ, ÑÑо невозможно ÑоздаÑÑ Ð¿ÐµÑвиÑнÑй клÑÑ, огÑаниÑение ÑникалÑноÑÑи или огÑаниÑение иÑклÑÑениÑ, Ð¾Ñ Ð²Ð°ÑÑваÑÑие вÑе ÑекÑии; Ñакие огÑаниÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑолÑко в оÑделÑнÑÑ ÑекÑиÑÑ .
Так как в ÑекÑиониÑованнÑÑ ÑаблиÑÐ°Ñ Ð¿ÐµÑвиÑнÑе клÑÑи не поддеÑживаÑÑÑÑ, на ÑекÑиониÑованнÑе ÑаблиÑÑ Ð½Ðµ могÑÑ ÑÑÑлаÑÑÑÑ Ð²Ð½ÐµÑние клÑÑи, Ñак же как и внеÑние клÑÑи в ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑÐ°Ñ Ð½Ðµ могÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð° какие-либо дÑÑгие ÑаблиÑÑ.
ÐÑполÑзование пÑедложениÑ
ON CONFLICTÑ ÑекÑиониÑованнÑми ÑаблиÑами вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ, Ñак как огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи и огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑоздаваÑÑÑÑ ÑолÑко в оÑделÑнÑÑ ÑекÑиÑÑ . ÐбеÑпеÑение ÑникалÑноÑÑи (или огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑклÑÑениÑ) во вÑей иеÑаÑÑ Ð¸Ð¸ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ поддеÑживаеÑÑÑ.ÐеÑенеÑÑи ÑÑÑÐ¾ÐºÑ Ð¸Ð· одной ÑекÑии в дÑÑгÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
UPDATEнелÑзÑ, Ñак как новое знаÑение ÑÑÑоки не бÑÐ´ÐµÑ ÑдовлеÑвоÑÑÑÑ Ð½ÐµÑÐ²Ð½Ð¾Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑии.ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð² оÑделÑнÑÑ ÑекÑиÑÑ , а не в ÑекÑиониÑованной ÑаблиÑе.
СмеÑивание вÑеменнÑÑ Ð¸ поÑÑоÑннÑÑ Ð¾ÑноÑений в одном деÑеве ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ допÑÑкаеÑÑÑ. Таким обÑазом, еÑли ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа поÑÑоÑннаÑ, Ñакими же Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÐµÑ ÑекÑии; Ñ Ð²ÑеменнÑми ÑаблиÑами аналогиÑно. Ð ÑлÑÑае Ñ Ð²ÑеменнÑми оÑноÑениÑми вÑе ÑаблиÑÑ Ð´ÐµÑева ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð· одного ÑеанÑа.
5.10.3. РеализаÑÐ¸Ñ Ñ Ð¸ÑполÑзованием наÑледованиÑ
ХоÑÑ Ð²ÑÑÑоеннÑе ÑÑедÑÑва деклаÑаÑивного ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð²Ð¾ Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑаÑÑо возникаÑÑÐ¸Ñ ÑиÑÑаÑиÑÑ , бÑваÑÑ Ð¾Ð±ÑÑоÑÑелÑÑÑва, ÑÑебÑÑÑие более гибкого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð°. Ð ÑÑом ÑлÑÑае ÑекÑиониÑование можно ÑеализоваÑÑ, пÑименив Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑ, ÑÑо даÑÑ ÑÑд возможноÑÑей, неподдеÑживаемÑÑ Ð¿Ñи деклаÑаÑивном ÑекÑиониÑовании, напÑимеÑ:
С ÑекÑиониÑованием дейÑÑвÑÐµÑ Ð¿Ñавило, ÑÑо вÑе ÑекÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð² ÑоÑноÑÑи ÑÐ¾Ñ Ð¶Ðµ Ð½Ð°Ð±Ð¾Ñ ÑÑолбÑов, ÑÑо и ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа, но ÑобÑÑвенно наÑледование ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð¾Ð¿ÑÑÐºÐ°ÐµÑ Ð½Ð°Ð»Ð¸Ñие в доÑеÑÐ½Ð¸Ñ ÑаблиÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑолбÑов, оÑÑÑÑÑÑвÑÑÑÐ¸Ñ Ð² ÑодиÑеле.
ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑвенное наÑледование.
С деклаÑаÑивнÑм ÑекÑиониÑованием поддеÑживаеÑÑÑ ÑолÑко Ñазбиение по ÑпиÑкам и по диапазонам, Ñогда как Ñ Ð½Ð°Ñледованием ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð°Ð½Ð½Ñе можно ÑазделÑÑÑ Ð¿Ð¾ лÑÐ±Ð¾Ð¼Ñ ÐºÑиÑеÑиÑ, вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелем. (Ðднако замеÑÑÑе, ÑÑо еÑли иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ позволÑÐµÑ ÑÑÑекÑивно оÑÑилÑÑÑовÑваÑÑ ÑекÑии, пÑоизводиÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов бÑÐ´ÐµÑ Ð¾ÑÐµÐ½Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹.)
ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÐµÑаÑий Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивнÑм ÑекÑиониÑованием ÑÑебÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑилÑÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка, Ñем Ñ Ð¸ÑполÑзованием наÑледованиÑ. ÐапÑимеÑ, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑекÑий из ÑекÑиониÑованной ÑаблиÑÑ ÑÑебÑеÑÑÑ ÑÑÑановиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ
ACCESS EXCLUSIVEв ÑодиÑелÑÑкой ÑаблиÑе, Ñогда как в ÑлÑÑае Ñ Ð¾Ð±ÑÑнÑм наÑледованием доÑÑаÑоÑно блокиÑовкиSHARE UPDATE EXCLUSIVE.
5.10.3.1. ÐÑимеÑ
ÐоÑполÑзÑемÑÑ Ð¾Ð¿Ð¸Ñанной Ñанее неÑекÑиониÑованной ÑаблиÑей measurement. ЧÑÐ¾Ð±Ñ ÑеализоваÑÑ ÑекÑиониÑование Ñ Ð¸ÑполÑзованием наÑледованиÑ, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ:
СоздайÑе «главнÑÑ» ÑаблиÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑой бÑдÑÑ Ð½Ð°ÑледоваÑÑÑÑ Ð²Ñе ÑекÑии. ÐÑа ÑаблиÑа не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе. Ðе опÑеделÑйÑе в ней Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¾Ð³ÑаниÑений, еÑли ÑолÑко Ð²Ñ Ð½Ðµ намеÑÐµÐ½Ñ ÑоздаваÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑе во вÑÐµÑ ÑекÑиÑÑ . Также не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла опÑеделÑÑÑ Ð² ней какие-либо индекÑÑ Ð¸Ð»Ð¸ огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи. РнаÑем пÑимеÑе главной ÑаблиÑей бÑдеÑ
measurementÑо Ñвоим изнаÑалÑнÑм опÑеделением.СоздайÑе неÑколÑко «доÑеÑÐ½Ð¸Ñ Â» ÑаблиÑ, ÑнаÑледовав Ð¸Ñ Ð²Ñе Ð¾Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹. ÐбÑÑно в ÑÐ°ÐºÐ¸Ñ ÑаблиÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑолбÑов, кÑоме ÑнаÑледованнÑÑ . Ðак и Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивнÑм ÑекÑиониÑованием, ÑÑи ÑекÑии во вÑÐµÑ Ð¾ÑноÑениÑÑ Ð±ÑдÑÑ Ð¾Ð±ÑÑнÑми ÑаблиÑами PostgreSQL (или ÑÑоÑонними ÑаблиÑами).
CREATE TABLE measurement_y2006m02 () INHERITS (measurement); CREATE TABLE measurement_y2006m03 () INHERITS (measurement); ... CREATE TABLE measurement_y2007m11 () INHERITS (measurement); CREATE TABLE measurement_y2007m12 () INHERITS (measurement); CREATE TABLE measurement_y2008m01 () INHERITS (measurement);
ÐобавÑÑе в ÑаблиÑÑ-ÑекÑии непеÑекÑÑваÑÑиеÑÑ Ð¾Ð³ÑаниÑениÑ, опÑеделÑÑÑие допÑÑÑимÑе знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии.
ТипиÑнÑе пÑимеÑÑ ÑÐ°ÐºÐ¸Ñ Ð¾Ð³ÑаниÑений:
CHECK ( x = 1 ) CHECK ( county IN ( 'Oxfordshire', 'Buckinghamshire', 'Warwickshire' )) CHECK ( outletID >= 100 AND outletID < 200 )
УбедиÑеÑÑ Ð² Ñом, ÑÑо огÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ пеÑеÑекаÑÑÑÑ, Ñо еÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа не оÑноÑÑÑÑÑ ÑÑÐ°Ð·Ñ Ðº неÑколÑким ÑекÑиÑм. ÐапÑимеÑ, ÑаÑÑо допÑÑкаÑÑ ÑакÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð² опÑеделении диапазонов:
CHECK ( outletID BETWEEN 100 AND 200 ) CHECK ( outletID BETWEEN 200 AND 300 )
ÐÑо не бÑÐ´ÐµÑ ÑабоÑаÑÑ, Ñак как неÑÑно, к какой ÑекÑии должно оÑноÑиÑÑÑÑ Ð·Ð½Ð°Ñение 200.
СекÑии лÑÑÑе бÑÐ´ÐµÑ ÑоздаÑÑ ÑледÑÑÑим обÑазом:
CREATE TABLE measurement_y2006m02 ( CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2006m03 ( CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) ) INHERITS (measurement); ... CREATE TABLE measurement_y2007m11 ( CHECK ( logdate >= DATE '2007-11-01' AND logdate < DATE '2007-12-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2007m12 ( CHECK ( logdate >= DATE '2007-12-01' AND logdate < DATE '2008-01-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2008m01 ( CHECK ( logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' ) ) INHERITS (measurement);ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии ÑоздайÑе Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ(ам), а Ñакже лÑбÑе дÑÑгие индекÑÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ ÑÑмоÑÑениÑ.
CREATE INDEX measurement_y2006m02_logdate ON measurement_y2006m02 (logdate); CREATE INDEX measurement_y2006m03_logdate ON measurement_y2006m03 (logdate); CREATE INDEX measurement_y2007m11_logdate ON measurement_y2007m11 (logdate); CREATE INDEX measurement_y2007m12_logdate ON measurement_y2007m12 (logdate); CREATE INDEX measurement_y2008m01_logdate ON measurement_y2008m01 (logdate);
ÐÑ Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ Ð½Ð°Ñе пÑиложение могло ÑказаÑÑ
INSERT INTO measurement ...и даннÑе оказалиÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑей ÑаблиÑе-ÑекÑии. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ добиÑÑÑÑ ÑÑого, добавив Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÑÑ ÑÑиггеÑнÑÑ ÑÑнкÑÐ¸Ñ Ð² главнÑÑ ÑаблиÑÑ. ÐÑли даннÑе вÑегда бÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ ÑолÑко в поÑледнÑÑ ÑекÑиÑ, нам бÑÐ´ÐµÑ Ð´Ð¾ÑÑаÑоÑно оÑÐµÐ½Ñ Ð¿ÑоÑÑой ÑÑнкÑии:CREATE OR REPLACE FUNCTION measurement_insert_trigger() RETURNS TRIGGER AS $$ BEGIN INSERT INTO measurement_y2008m01 VALUES (NEW.*); RETURN NULL; END; $$ LANGUAGE plpgsql;Создав ÑÑÑ ÑÑнкÑиÑ, Ð¼Ñ Ñоздадим вÑзÑваÑÑий ÐµÑ ÑÑиггеÑ:
CREATE TRIGGER insert_measurement_trigger BEFORE INSERT ON measurement FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¼ÐµÐ½ÑÑÑ Ð¾Ð¿Ñеделение ÑÑиггеÑной ÑÑнкÑии каждÑй меÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° вÑегда ÑказÑвала на ÑекÑÑÑÑ ÑекÑиÑ. ÐпÑеделение Ñамого ÑÑиггеÑа, однако, менÑÑÑ Ð½Ðµ ÑÑебÑеÑÑÑ.
Ðо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ Ñакже ÑделаÑÑ, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð°Ð²ÑомаÑиÑеÑки Ð½Ð°Ñ Ð¾Ð´Ð¸Ð» ÑекÑиÑ, в коÑоÑÑÑ Ð½Ñжно напÑавиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ ÑÑÑокÑ. ÐÐ»Ñ ÑÑого нам поÑÑебÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÐ»Ð¾Ð¶Ð½Ð°Ñ ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑиÑ:
CREATE OR REPLACE FUNCTION measurement_insert_trigger() RETURNS TRIGGER AS $$ BEGIN IF ( NEW.logdate >= DATE '2006-02-01' AND NEW.logdate < DATE '2006-03-01' ) THEN INSERT INTO measurement_y2006m02 VALUES (NEW.*); ELSIF ( NEW.logdate >= DATE '2006-03-01' AND NEW.logdate < DATE '2006-04-01' ) THEN INSERT INTO measurement_y2006m03 VALUES (NEW.*); ... ELSIF ( NEW.logdate >= DATE '2008-01-01' AND NEW.logdate < DATE '2008-02-01' ) THEN INSERT INTO measurement_y2008m01 VALUES (NEW.*); ELSE RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql;ÐпÑеделение ÑÑиггеÑа оÑÑаÑÑÑÑ Ð¿Ñежним. ÐамеÑÑÑе, ÑÑо вÑе ÑÑловиÑ
IFÐ´Ð¾Ð»Ð¶Ð½Ñ Ð² ÑоÑноÑÑи оÑÑажаÑÑ Ð¾Ð³ÑаниÑениÑCHECKÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑекÑий.ХоÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ñложнее, Ñем ваÑÐ¸Ð°Ð½Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑекÑÑим меÑÑÑем, ÐµÑ Ð½Ðµ пÑидÑÑÑÑ Ñак ÑаÑÑо модиÑиÑиÑоваÑÑ, Ñак как веÑви ÑÑловий можно добавиÑÑ Ð·Ð°Ñанее.
ÐÑимеÑание
Ðа пÑакÑике бÑÐ´ÐµÑ Ð»ÑÑÑе ÑнаÑала пÑовеÑÑÑÑ ÑÑловие Ð´Ð»Ñ Ð¿Ð¾Ñледней ÑекÑии, еÑли ÑÑÑоки ÑаÑе добавлÑÑÑÑÑ Ð² ÑÑÑ ÑекÑиÑ. ÐÐ»Ñ Ð¿ÑоÑÑоÑÑ Ð¶Ðµ Ð¼Ñ ÑаÑположили пÑовеÑки ÑÑиггеÑа в Ñом же поÑÑдке, ÑÑо и в дÑÑÐ³Ð¸Ñ ÑÑагменÑÐ°Ñ ÐºÐ¾Ð´Ð° Ð´Ð»Ñ ÑÑого пÑимеÑа.
ÐÑÑгой ÑпоÑоб пеÑенапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ ÑÑÑок в ÑооÑвеÑÑÑвÑÑÑÑÑ ÑекÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеализоваÑÑ, опÑеделив Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑаблиÑÑ Ð½Ðµ ÑÑиггеÑ, а пÑавила. ÐапÑимеÑ:
CREATE RULE measurement_insert_y2006m02 AS ON INSERT TO measurement WHERE ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) DO INSTEAD INSERT INTO measurement_y2006m02 VALUES (NEW.*); ... CREATE RULE measurement_insert_y2008m01 AS ON INSERT TO measurement WHERE ( logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' ) DO INSTEAD INSERT INTO measurement_y2008m01 VALUES (NEW.*);С пÑавилами ÑвÑзано гоÑаздо болÑÑе накладнÑÑ ÑаÑÑ Ð¾Ð´Ð¾Ð², Ñем Ñ ÑÑиггеÑом, но они оÑноÑÑÑÑÑ Ðº запÑоÑÑ Ð² Ñелом, а не к каждой ÑÑÑоке. ÐоÑÑÐ¾Ð¼Ñ ÑÑÐ¾Ñ ÑпоÑоб Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÐµÐµ вÑигÑÑÑнÑм пÑи маÑÑовом добавлении даннÑÑ . Ðднако в болÑÑинÑÑве ÑлÑÑаев ÑÑиггеÑÑ Ð±ÑдÑÑ ÑабоÑаÑÑ Ð±ÑÑÑÑее.
УÑÑиÑе, ÑÑо команда
COPYигноÑиÑÑÐµÑ Ð¿Ñавила. ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе вÑÑавиÑÑ Ð´Ð°Ð½Ð½Ñе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑCOPY, вам пÑидÑÑÑÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð¸Ñ ÑÑÐ°Ð·Ñ Ð² нÑжнÑÑ ÑекÑиÑ, а не в главнÑÑ ÑаблиÑÑ. С дÑÑгой ÑÑоÑонÑ,COPYне оÑменÑÐµÑ ÑÑиггеÑÑ, Ñак ÑÑо Ñ ÑÑиггеÑами Ð²Ñ ÑможеÑе иÑполÑзоваÑÑ ÐµÑ Ð¾Ð±ÑÑнÑм обÑазом.ÐÑÑ Ð¾Ð´Ð¸Ð½ недоÑÑаÑок Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° Ñ Ð¿Ñавилами ÑвÑзан Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли добавлÑÐµÐ¼Ð°Ñ ÑÑÑока не Ð¿Ð¾Ð´Ð¿Ð°Ð´Ð°ÐµÑ Ð½Ð¸ под одно из пÑавил; в ÑÑом ÑлÑÑае даннÑе пÑоÑÑо попадÑÑ Ð² главнÑÑ ÑаблиÑÑ.
УбедиÑеÑÑ Ð² Ñом, ÑÑо паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии constraint_exclusion не вÑклÑÑен в
postgresql.conf. ÐнаÑе запÑоÑÑ Ð½Ðµ бÑдÑÑ Ð¾Ð¿ÑимизиÑоваÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.
Ðак Ñже можно понÑÑÑ, Ð´Ð»Ñ ÑеализаÑии Ñложной ÑÑ ÐµÐ¼Ñ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ DDL-код знаÑиÑелÑного обÑÑма. Рданном пÑимеÑе нам поÑÑебÑеÑÑÑ ÑоздаваÑÑ ÑекÑÐ¸Ñ ÐºÐ°Ð¶Ð´Ñй меÑÑÑ, Ñак ÑÑо бÑло Ð±Ñ ÑазÑмно напиÑаÑÑ ÑкÑипÑ, коÑоÑÑй Ð±Ñ ÑоÑмиÑовал ÑÑебÑемÑй код DDL авÑомаÑиÑеÑки.
5.10.3.2. ÐбÑлÑживание ÑекÑий
ЧÑÐ¾Ð±Ñ Ð±ÑÑÑÑо ÑдалиÑÑ ÑÑаÑÑе даннÑе, пÑоÑÑо ÑдалиÑе ÑÑавÑÑÑ Ð½ÐµÐ½Ñжной ÑекÑиÑ:
DROP TABLE measurement_y2006m02;
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ ÑекÑÐ¸Ñ Ð¸Ð· ÑекÑиониÑованной ÑаблиÑÑ, но ÑÐ¾Ñ ÑаниÑÑ Ðº ней доÑÑÑп как к ÑамоÑÑоÑÑелÑной ÑаблиÑе:
ALTER TABLE measurement_y2006m02 NO INHERIT measurement;
ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð´Ð°Ð½Ð½ÑÑ , ÑоздайÑе пÑÑÑÑÑ ÑекÑÐ¸Ñ Ñак же, как до ÑÑого Ñоздавали наÑалÑнÑе ÑекÑии:
CREATE TABLE measurement_y2008m02 (
CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' )
) INHERITS (measurement);Ðожно Ñакже ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑаблиÑÑ Ð²Ð½Ðµ ÑÑÑÑкÑÑÑÑ ÑекÑий и ÑделаÑÑ ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ñенной ÑекÑией поÑле Ñого, как даннÑе бÑдÑÑ Ð² Ð½ÐµÑ Ð·Ð°Ð³ÑÑженÑ, пÑовеÑÐµÐ½Ñ Ð¸ пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пÑеобÑазованÑ.
CREATE TABLE measurement_y2008m02 (LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS); ALTER TABLE measurement_y2008m02 ADD CONSTRAINT y2008m02 CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' ); \copy measurement_y2008m02 from 'measurement_y2008m02' -- возможна дополниÑелÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовка даннÑÑ ALTER TABLE measurement_y2008m02 INHERIT measurement;
5.10.3.3. ÐгÑаниÑениÑ
С ÑекÑиониÑованнÑми ÑаблиÑами, ÑеализованнÑми ÑеÑез наÑледование, ÑвÑÐ·Ð°Ð½Ñ ÑледÑÑÑие огÑаниÑениÑ:
СиÑÑема не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑиÑÑ Ð°Ð²ÑомаÑиÑеÑки, ÑвлÑÑÑÑÑ Ð»Ð¸ вÑе огÑаниÑениÑ
CHECKвзаимно иÑклÑÑаÑÑими. ÐоÑÑÐ¾Ð¼Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñнее бÑÐ´ÐµÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð¸ оÑладиÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑекÑий и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸/или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвÑзаннÑÑ Ð¾Ð±ÑекÑов, Ñем делаÑÑ ÑÑо вÑÑÑнÑÑ.ÐоказаннÑе здеÑÑ ÑÑ ÐµÐ¼Ñ Ð¿Ð¾Ð´ÑазÑмеваÑÑ, ÑÑо клÑÑевой ÑÑолбеÑ(Ñ) ÑекÑии в ÑÑÑоке никогда не менÑеÑÑÑ, или менÑеÑÑÑ Ð½Ðµ наÑÑолÑко, ÑÑÐ¾Ð±Ñ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ÑÑебовалоÑÑ Ð¿ÐµÑенеÑÑи в дÑÑгÑÑ ÑекÑиÑ. ÐÑли же попÑÑаÑÑÑÑ Ð²ÑполниÑÑ Ñакой опеÑаÑоÑ
UPDATE, пÑоизойдÑÑ Ð¾Ñибка из-за наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑениÑCHECK. ÐÑли вам нÑжно обÑабоÑаÑÑ Ð¸ Ñакие ÑлÑÑаи, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑÑиггеÑÑ Ð½Ð° обновление в ÑаблиÑÑ-ÑекÑии, но ÑÑо еÑÑ Ð±Ð¾Ð»ÑÑе ÑÑÐ»Ð¾Ð¶Ð½Ð¸Ñ ÑпÑавление вÑей конÑÑÑÑкÑией.ÐÑли Ð²Ñ Ð²ÑполнÑеÑе командÑ
VACUUMилиANALYZEвÑÑÑнÑÑ, не забÑвайÑе, ÑÑо Ð¸Ñ Ð½Ñжно запÑÑкаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии в оÑделÑноÑÑи. ÐомандаANALYZE measurement;
обÑабоÑÐ°ÐµÑ ÑолÑко главнÑÑ ÑаблиÑÑ.
ÐпеÑаÑоÑÑ
INSERTÑ Ð¿ÑедложениÑмиON CONFLICTÑкоÑее вÑего не бÑдÑÑ ÑабоÑаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм обÑазом, Ñак как дейÑÑвиеON CONFLICTпÑедпÑинимаеÑÑÑ ÑолÑко в ÑлÑÑае наÑÑÑений ÑникалÑноÑÑи в Ñказанном Ñелевом оÑноÑении, а не его доÑеÑÐ½Ð¸Ñ Ð¾ÑноÑениÑÑ .ÐÐ»Ñ Ð½Ð°Ð¿ÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑок в нÑжнÑе ÑекÑии поÑÑебÑÑÑÑÑ ÑÑиггеÑÑ Ð¸Ð»Ð¸ пÑавила, еÑли ÑолÑко пÑиложение не Ð·Ð½Ð°ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно о ÑÑ ÐµÐ¼Ðµ ÑекÑиониÑованиÑ. РазÑабоÑаÑÑ ÑÑиггеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñложно, и они бÑдÑÑ ÑабоÑаÑÑ Ð³Ð¾Ñаздо медленнее, Ñем внÑÑÑеннее ÑаÑпÑеделение коÑÑежей пÑи деклаÑаÑивном ÑекÑиониÑовании.
5.10.4. СекÑиониÑование и иÑклÑÑение по огÑаниÑениÑ
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ â ÑÑо пÑиÑм опÑимизаÑии запÑоÑов, коÑоÑÑй ÑÑкоÑÑÐµÑ ÑабоÑÑ Ñ ÑекÑиониÑованнÑми ÑаблиÑами, опÑеделÑннÑми по вÑÑеопиÑанной ÑÑ ÐµÐ¼Ðµ (и Ð´Ð»Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивного ÑекÑиониÑованиÑ, и Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¸ÑполÑзованием наÑледованиÑ). ÐапÑимеÑ:
SET constraint_exclusion = on; SELECT count(*) FROM measurement WHERE logdate >= DATE '2008-01-01';
Ðез иÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ запÑоÑа пÑиÑлоÑÑ Ð±Ñ Ð¿ÑоÑканиÑоваÑÑ Ð²Ñе ÑекÑии ÑаблиÑÑ measurement. ÐÑли же иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑено, планиÑовÑик ÑаÑÑмоÑÑÐ¸Ñ Ð¾Ð³ÑаниÑение каждой ÑекÑии Ñ ÑелÑÑ Ð¾Ð¿ÑеделиÑÑ, ÑÑо Ð´Ð°Ð½Ð½Ð°Ñ ÑекÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑÑÑоки, ÑдовлеÑвоÑÑÑÑие ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа WHERE. ÐÑли планиÑовÑик пÑидÑÑ Ðº ÑÐ°ÐºÐ¾Ð¼Ñ Ð²ÑводÑ, он иÑклÑÑÐ¸Ñ ÑÑÑ ÑекÑÐ¸Ñ Ð¸Ð· плана запÑоÑа.
ЧÑÐ¾Ð±Ñ ÑвидеÑÑ, как менÑеÑÑÑ Ð¿Ð»Ð°Ð½ пÑи изменении паÑамеÑÑа constraint_exclusion, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ EXPLAIN. ТипиÑнÑй неопÑимизиÑованнÑй план Ð´Ð»Ñ Ñакой конÑигÑÑаÑии ÑаблиÑÑ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
SET constraint_exclusion = off;
EXPLAIN SELECT count(*) FROM measurement
WHERE logdate >= DATE '2008-01-01';
QUERY PLAN
---------------------------------------------------------------------------
Aggregate (cost=158.66..158.68 rows=1 width=0)
-> Append (cost=0.00..151.88 rows=2715 width=0)
-> Seq Scan on measurement (cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2006m02 measurement
(cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2006m03 measurement
(cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)
...
-> Seq Scan on measurement_y2007m12 measurement
(cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2008m01 measurement
(cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)РнекоÑоÑÑÑ Ð¸Ð»Ð¸ вÑÐµÑ ÑекÑиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð½Ðµ полное поÑледоваÑелÑное ÑканиÑование, а ÑканиÑование по индекÑÑ, но оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¸Ð´ÐµÑ Ð¿ÑимеÑа в Ñом, ÑÑо Ð´Ð»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа не нÑжно ÑканиÑоваÑÑ ÑÑаÑÑе ÑекÑии. Ркогда Ð¼Ñ Ð²ÐºÐ»ÑÑаем иÑклÑÑение по огÑаниÑениÑ, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем знаÑиÑелÑно более ÑÑÑекÑивнÑй план, даÑÑий ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ:
SET constraint_exclusion = on;
EXPLAIN SELECT count(*) FROM measurement
WHERE logdate >= DATE '2008-01-01';
QUERY PLAN
--------------------------------------------------------------------------
Aggregate (cost=63.47..63.48 rows=1 width=0)
-> Append (cost=0.00..60.75 rows=1086 width=0)
-> Seq Scan on measurement (cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2008m01 measurement
(cost=0.00..30.38 rows=543 width=0)
Filter: (logdate >= '2008-01-01'::date)ÐамеÑÑÑе, ÑÑо меÑ
анизм иÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ ÑÑиÑÑÐ²Ð°ÐµÑ ÑолÑко огÑаниÑÐµÐ½Ð¸Ñ CHECK, но не налиÑие индекÑов. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð¿ÑеделÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð´Ð»Ñ ÑÑолбÑов клÑÑа не обÑзаÑелÑно. ÐÑжно ли ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑекÑии, завиÑÐ¸Ñ Ð¾Ñ Ñого, ÐºÐ°ÐºÐ°Ñ ÑаÑÑÑ ÑекÑии бÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð¿Ñи вÑполнении болÑÑинÑÑва запÑоÑов. ÐÑли ÑÑо неболÑÑÐ°Ñ ÑаÑÑÑ, Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, в пÑоÑивном ÑлÑÑае он не нÑжен.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑ constraint_exclusion Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение не on и не off, а пÑомежÑÑоÑное (и ÑекомендÑемое) знаÑение partition, пÑи коÑоÑом ÑÑÐ¾Ñ Ð¿ÑиÑм бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑолÑко к запÑоÑам, где пÑедположиÑелÑно бÑдÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ ÑекÑиониÑованнÑе ÑаблиÑÑ. ÐнаÑение on обÑзÑÐ²Ð°ÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик пÑоÑмаÑÑиваÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK во вÑеÑ
запÑоÑаÑ
, даже в ÑамÑÑ
пÑоÑÑÑÑ
, где иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑла.
ÐÑноÑиÑелÑно иÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑениÑ, пÑименÑемого и пÑи наÑледовании, и пÑи ÑекÑиониÑовании ÑаблиÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑиÑÑваÑÑ ÑледÑÑÑее:
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ ÑабоÑÐ°ÐµÑ ÑолÑко когда пÑедложение
WHEREв запÑоÑе ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð½ÑÑанÑÑ (или полÑÑаемÑе извне паÑамеÑÑÑ). ÐапÑимеÑ, ÑÑавнение Ñ ÑÑнкÑией пеÑеменной пÑиÑодÑ, Ñакой какCURRENT_TIMESTAMP, нелÑÐ·Ñ Ð¾Ð¿ÑимизиÑоваÑÑ, Ñак как планиÑовÑик не Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑÑ, в какÑÑ ÑекÑÐ¸Ñ Ð¿Ð¾Ð¿Ð°Ð´ÑÑ Ð·Ð½Ð°Ñение ÑÑнкÑии во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.ÐгÑаниÑÐµÐ½Ð¸Ñ ÑекÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑоÑÑÑми, инаÑе планиÑовÑик не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑÑиÑлиÑÑ, какие ÑекÑии не нÑжно обÑабаÑÑваÑÑ. ÐÑполÑзÑйÑе пÑоÑÑÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° ÑавенÑÑво пÑи ÑекÑиониÑовании по ÑпиÑÐºÑ Ð¸Ð»Ð¸ пÑоÑÑÑе пÑовеÑки инÑеÑвала пÑи ÑекÑиониÑовании по диапазонам, как показано в пÑедÑдÑÑÐ¸Ñ Ð¿ÑимеÑÐ°Ñ . РекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð² ÑекÑиониÑÑÑÑÐ¸Ñ Ð¾Ð³ÑаниÑениÑÑ ÑолÑко ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÑÑолбÑов ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñ ÐºÐ¾Ð½ÑÑанÑами Ñ Ð¸ÑполÑзованием опеÑаÑоÑов, индекÑиÑÑемÑÑ Ð² B-деÑеве (ÑÑо пÑименимо и к ÑекÑиониÑованнÑм ÑаблиÑам, Ñак как в клÑÑ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²Ñ Ð¾Ð´Ð¸ÑÑ ÑолÑко ÑÑолбÑÑ, индекÑиÑÑемÑе в B-деÑеве). (ÐÑо не пÑоблема пÑи деклаÑаÑивном ÑекÑиониÑовании, Ñак как авÑомаÑиÑеÑки генеÑиÑÑемÑе огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика.)
ÐÑи анализе Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑÑледÑÑÑÑÑ Ð²Ñе огÑаниÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ ÑекÑий главной ÑаблиÑÑ, поÑÑÐ¾Ð¼Ñ Ð¿Ñи болÑÑом колиÑеÑÑве ÑекÑий вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑÑÑ. ÐпиÑаннÑе вÑÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ ÑабоÑаÑÑ Ñ Ð¾ÑоÑо, пока колиÑеÑÑво ÑекÑий не пÑевÑÑÐ°ÐµÑ Ð¿ÑимеÑно ÑÑа, но не пÑÑайÑеÑÑ Ð¿ÑименÑÑÑ Ð¸Ñ Ñ ÑÑÑÑÑами ÑекÑий.
5.10.5. РекомендаÑии по деклаÑаÑÐ¸Ð²Ð½Ð¾Ð¼Ñ ÑекÑиониÑованиÑ
Ð ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ ÑледÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸ÑÑ Ð¿ÑодÑманно, Ñак как неÑдаÑное ÑеÑение Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑиÑаÑелÑно повлиÑÑÑ Ð½Ð° ÑкоÑоÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
Ðдним из ÑамÑÑ
важнÑÑ
ÑакÑоÑов ÑвлÑеÑÑÑ Ð²ÑÐ±Ð¾Ñ ÑÑолбÑа или ÑÑолбÑов, по коÑоÑÑм бÑдÑÑ ÑекÑиониÑоваÑÑÑÑ Ð²Ð°Ñи даннÑе. ЧаÑÑо опÑималÑнÑм бÑÐ´ÐµÑ ÑекÑиониÑование по ÑÑолбÑÑ Ð¸Ð»Ð¸ набоÑÑ ÑÑолбÑов, коÑоÑÑе пÑакÑиÑеÑки вÑегда пÑиÑÑÑÑÑвÑÑÑ Ð² пÑедложении WHERE в запÑоÑаÑ
, обÑаÑаÑÑиÑ
ÑÑ Ðº ÑекÑиониÑÑемой ÑаблиÑе. ÐлеменÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, ÑовмеÑÑимÑе Ñ ÐºÐ»ÑÑом ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑооÑвеÑÑÑвÑÑÑие емÑ, могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ ÑÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ½ÑжнÑÑ
Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа ÑекÑий. Также пÑи планиÑовании ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑледÑÐµÑ ÑÑиÑÑваÑÑ, как бÑдÑÑ ÑдалÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе. СекÑÐ¸Ñ Ñеликом можно оÑÑоединиÑÑ Ð¾ÑÐµÐ½Ñ Ð±ÑÑÑÑо, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл ÑазÑабоÑаÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð¼Ð°ÑÑово ÑдалÑемÑе даннÑе оказÑвалиÑÑ Ð² одной ÑекÑии.
Также важно пÑавилÑно вÑбÑаÑÑ ÑиÑло ÑекÑий, на коÑоÑÑе бÑÐ´ÐµÑ ÑазбиваÑÑÑÑ ÑаблиÑа. ÐÑли иÑ
бÑÐ´ÐµÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно много, индекÑÑ Ð¾ÑÑанÑÑÑÑ Ð±Ð¾Ð»ÑÑими, не ÑлÑÑÑиÑÑÑ Ð¸ локалÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
, вÑледÑÑвие Ñего пÑоÑÐµÐ½Ñ Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ð¹ в ÐºÐµÑ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð½Ð¸Ð·ÐºÐ¸Ð¼. Ðднако и пÑи ÑлиÑком болÑÑом колиÑеÑÑве ÑекÑий Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿ÑоблемÑ. С болÑÑим колиÑеÑÑвом ÑекÑий ÑвелиÑиваеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ поÑÑебление памÑÑи как пÑи планиÑовании, Ñак и пÑи вÑполнении запÑоÑов. ÐÑбиÑÐ°Ñ ÑÑÑаÑÐµÐ³Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, Ñакже важно ÑÑиÑÑваÑÑ, какие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑоизойÑи в бÑдÑÑем. ÐапÑимеÑ, еÑли Ð²Ñ ÑеÑиÑе ÑоздаваÑÑ Ð¾ÑделÑнÑе ÑекÑии Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиенÑа, и в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ Ð²Ð°Ñ Ð²Ñего неÑколÑко болÑÑиÑ
клиенÑов, подÑмайÑе, ÑÑо бÑдеÑ, еÑли ÑеÑез неÑколÑко Ð»ÐµÑ Ñ Ð²Ð°Ñ Ð±ÑÐ´ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ мелкиÑ
клиенÑов. Ð ÑÑом ÑлÑÑае Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÑÑе пÑоизвеÑÑи ÑекÑиониÑование по Ñ
еÑÑ (HASH) и вÑбÑаÑÑ ÑазÑмное колиÑеÑÑво ÑекÑий, по коÑоÑÑм ÑавномеÑно ÑаÑпÑеделÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ, но не ÑоздаваÑÑ ÑекÑии по диапазонам (RANGE) в надежде, ÑÑо колиÑеÑÑво клиенÑов не ÑвелиÑиÑÑÑ Ð´Ð¾ Ñакой ÑÑепени, ÑÑо ÑекÑиониÑование даннÑÑ
окажеÑÑÑ Ð½ÐµÐ¿ÑакÑиÑнÑм.
Ðложенное ÑекÑиониÑование позволÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно ÑазделиÑÑ Ñе ÑекÑии, коÑоÑÑе пÑедположиÑелÑно окажÑÑÑÑ Ð±Ð¾Ð»ÑÑе дÑÑÐ³Ð¸Ñ ÑекÑий. Ðднако еÑли ÑÑой возможноÑÑÑÑ Ð·Ð»Ð¾ÑпоÑÑеблÑÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑазоваÑÑÑÑ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво ÑекÑий, поÑождаÑÑее Ñе же пÑоблемÑ, ÑÑо опиÑÐ°Ð½Ñ Ð² пÑедÑдÑÑем абзаÑе.
Также важно ÑÑиÑÑваÑÑ Ð¸Ð·Ð´ÐµÑжки ÑекÑиониÑованиÑ, коÑоÑÑе оÑÑажаÑÑÑÑ Ð½Ð° планиÑовании и вÑполнении запÑоÑов. ÐланиÑовÑик запÑоÑов обÑÑно доволÑно неплоÑ
о ÑпÑавлÑеÑÑÑ Ñ Ð¸ÐµÑаÑÑ
иÑми, вклÑÑаÑÑими до неÑколÑкиÑ
ÑоÑен ÑекÑий. Ðднако по меÑе ÑвелиÑÐµÐ½Ð¸Ñ ÑиÑла ÑекÑий бÑÐ´ÐµÑ ÑвелиÑиваÑÑÑÑ Ð¸ вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, и обÑÑм поÑÑеблÑемой памÑÑи. РнаиболÑÑей ÑÑепени ÑÑо каÑаеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ UPDATE и DELETE. ÐалиÑие болÑÑого колиÑеÑÑва ÑекÑий нежелаÑелÑно еÑÑ Ð¸ поÑомÑ, ÑÑо поÑÑебление памÑÑи ÑеÑвеÑом Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно возÑаÑÑаÑÑ Ñ ÑеÑением вÑемени, оÑобенно когда множеÑÑво ÑеанÑов обÑаÑаÑÑÑÑ Ðº множеÑÑÐ²Ñ ÑекÑий. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо в локалÑнÑÑ Ð¿Ð°Ð¼ÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑеанÑа, коÑоÑÑй обÑаÑаеÑÑÑ Ðº ÑекÑиÑм, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ð¼ÐµÑаданнÑе вÑеÑ
ÑÑиÑ
ÑекÑий.
С нагÑÑзкой, пÑиÑÑÑей инÑоÑмаÑионнÑм Ñ ÑанилиÑам, Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл ÑоздаваÑÑ Ð±Ð¾Ð»ÑÑе ÑекÑий, Ñем Ñ Ð½Ð°Ð³ÑÑзкой OLTP. Ðак пÑавило, в инÑоÑмаÑионнÑÑ Ñ ÑанилиÑÐ°Ñ Ð²ÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа вÑоÑоÑÑепенно, Ñак как гоÑаздо болÑÑе вÑемени ÑÑаÑиÑÑÑ Ð½Ð° вÑполнение запÑоÑа. Ðднако пÑи лÑбом Ñипе нагÑÑзки важно пÑинимаÑÑ Ð¿ÑавилÑнÑе ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° Ñанней ÑÑадии ÑеализаÑии, Ñак как пÑоÑеÑÑ Ð¿ÐµÑеÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð±Ð¾Ð»ÑÑого обÑÑма Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑезвÑÑайно длиÑелÑнÑм. ÐÐ»Ñ Ð¾Ð¿ÑимизаÑии ÑÑÑаÑегии ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑедваÑиÑелÑно ÑмÑлиÑоваÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼ÑÑ Ð½Ð°Ð³ÑÑзкÑ. Ðо ни в коем ÑлÑÑае нелÑÐ·Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑ, ÑÑо Ñем болÑÑе ÑекÑий, Ñем лÑÑÑе, Ñавно как и наобоÑоÑ.