5.12. СекÑиониÑование ÑÐ°Ð±Ð»Ð¸Ñ #
- 5.12.1. ÐбзоÑ
- 5.12.2. ÐеклаÑаÑивное ÑекÑиониÑование
- 5.12.3. СекÑиониÑование Ñ Ð¸ÑполÑзованием наÑледованиÑ
- 5.12.4. ÐÑÑеÑение ÑекÑий
- 5.12.5. СекÑиониÑование и иÑклÑÑение по огÑаниÑениÑ
- 5.12.6. РекомендаÑии по деклаÑаÑÐ¸Ð²Ð½Ð¾Ð¼Ñ ÑекÑиониÑованиÑ
- 5.12.2. ÐеклаÑаÑивное ÑекÑиониÑование
Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑÑое ÑекÑиониÑование ÑаблиÑ. Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ, как и поÑÐµÐ¼Ñ Ð±ÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑименÑÑÑ ÑекÑиониÑование пÑи пÑоекÑиÑовании баз даннÑÑ .
5.12.1. ÐÐ±Ð·Ð¾Ñ #
СекÑиониÑованием назÑваеÑÑÑ Ñазбиение даннÑÑ , логиÑеÑки ÑвлÑÑÑÐ¸Ñ ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ болÑÑой ÑаблиÑей, на более мелкие ÑизиÑеÑкие ÑаÑÑи (ÑекÑии). СекÑиониÑование Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинеÑÑи ÑледÑÑÑÑÑ Ð¿Ð¾Ð»ÑзÑ:
РопÑеделÑннÑÑ ÑиÑÑаÑиÑÑ Ð¾Ð½Ð¾ каÑдиналÑно ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð±ÑÑÑÑодейÑÑвие, оÑобенно когда болÑÑой пÑоÑÐµÐ½Ñ ÑаÑÑо запÑаÑиваемÑÑ ÑÑÑок ÑаблиÑÑ Ð¾ÑноÑиÑÑÑ Ðº одной или лиÑÑ Ð½ÐµÑколÑким ÑекÑиÑм. СекÑиониÑование по ÑÑÑи заменÑÐµÑ Ð²ÐµÑÑ Ð½Ð¸Ðµ ÑÑовни деÑевÑев индекÑов, ÑÑо ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð²ÐµÑоÑÑноÑÑÑ Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ воÑÑÑебованнÑÑ ÑаÑÑей индекÑов в памÑÑи.
Ðогда в вÑбоÑке или изменении даннÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвована болÑÑÐ°Ñ ÑаÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑии, пÑоизводиÑелÑноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·ÑаÑÑи, еÑли бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑное ÑканиÑование ÑÑой ÑекÑии, а не поиÑк по индекÑÑ, ÑопÑовождаемÑй пÑоизволÑнÑм ÑÑением даннÑÑ , ÑазбÑоÑаннÑÑ Ð¿Ð¾ вÑей ÑаблиÑе.
ÐаÑÑовÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸ Ñдаление даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑÑеÑÑвлÑÑÑ, добавлÑÑ Ð¸ ÑдалÑÑ ÑекÑии, еÑли Ñакой ваÑÐ¸Ð°Ð½Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ñл пÑедÑÑмоÑÑен пÑи пÑоекÑиÑовании ÑекÑий. Удаление оÑделÑной ÑекÑии командой
DROP TABLEи дейÑÑвиеALTER TABLE DETACH PARTITIONвÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем аналогиÑÐ½Ð°Ñ Ð¼Ð°ÑÑÐ¾Ð²Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ. ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¸ÑклÑÑаÑÑ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñе ÑаÑÑ Ð¾Ð´Ñ, ÑвÑзаннÑе Ñ Ð²ÑполнениемVACUUMпоÑле маÑÑовой опеÑаÑииDELETE.Редко иÑполÑзÑемÑе даннÑе можно пеÑенеÑÑи на более деÑÑвÑе и медленнÑе ноÑиÑели.
ÐÑÑ ÑÑо обÑÑно полезно ÑолÑко Ð´Ð»Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑаблиÑ. Ðакие именно ÑаблиÑÑ Ð²ÑигÑаÑÑ Ð¾Ñ ÑекÑиониÑованиÑ, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного пÑиложениÑ, Ñ Ð¾ÑÑ, как пÑавило, ÑÑо ÑледÑÐµÑ Ð¿ÑименÑÑÑ Ð´Ð»Ñ ÑаблиÑ, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ Ð¿ÑевÑÑÐ°ÐµÑ Ð¾Ð±ÑÑм ÐÐУ ÑеÑвеÑа.
Postgres Pro пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ ÑледÑÑÑÐ¸Ñ Ð²Ð¸Ð´Ð¾Ð² ÑекÑиониÑованиÑ:
- СекÑиониÑование по диапазонам #
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ð¿Ð¾ «диапазонам», опÑеделÑннÑм по клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ Ð¸Ð»Ð¸ набоÑÑ ÑÑолбÑов, и не пеÑеÑекаÑÑимÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом. ÐапÑимеÑ, можно ÑекÑиониÑоваÑÑ Ð´Ð°Ð½Ð½Ñе по диапазонам Ð´Ð°Ñ Ð¸Ð»Ð¸ по диапазонам иденÑиÑикаÑоÑов опÑеделÑннÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-обÑекÑов. ÐÑаниÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ диапазона ÑÑиÑаÑÑÑÑ Ð²ÐºÐ»ÑÑаÑÑими нижнее знаÑение и иÑклÑÑаÑÑими веÑÑ Ð½ÐµÐµ. ÐапÑимеÑ, еÑли Ð´Ð»Ñ Ð¿ÐµÑвой ÑекÑии задан диапазон знаÑений оÑ
1до10, а Ð´Ð»Ñ Ð²ÑоÑой â оÑ10до20, знаÑение10оÑноÑиÑÑÑ ÐºÐ¾ вÑоÑой ÑекÑии, а не к пеÑвой.- СекÑиониÑование по ÑпиÑÐºÑ #
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпиÑка, Ñвно ÑказÑваÑÑего, какие знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑноÑиÑÑÑÑ Ðº каждой ÑекÑии.
- СекÑиониÑование по Ñ ÐµÑÑ #
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ð¿Ð¾ опÑеделÑннÑм модÑлÑм и оÑÑаÑкам, коÑоÑÑе ÑказÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии. ÐÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ ÑодеÑÐ¶Ð¸Ñ ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ñ ÐµÑ-знаÑение клÑÑа ÑекÑиониÑованиÑ, делÑнное на модÑлÑ, ÑавнÑеÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¾ÑÑаÑкÑ.
ÐÑли ваÑÐµÐ¼Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑебÑÑÑÑÑ Ð´ÑÑгие ÑоÑÐ¼Ñ ÑекÑиониÑованиÑ, можно Ñакже пÑибегнÑÑÑ Ðº алÑÑеÑнаÑивнÑм ÑеализаÑиÑм, Ñ Ð¸ÑполÑзованием наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ пÑедÑÑавлений Ñ UNION ALL. Такие подÑ
Ð¾Ð´Ñ Ð´Ð°ÑÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ, но не даÑÑ Ñакого вÑигÑÑÑа в пÑоизводиÑелÑноÑÑи, как вÑÑÑоенное деклаÑаÑивное ÑекÑиониÑование.
5.12.2. ÐеклаÑаÑивное ÑекÑиониÑование #
Postgres Pro позволÑÐµÑ Ð´ÐµÐºÐ»Ð°ÑиÑоваÑÑ, ÑÑо некоÑоÑÐ°Ñ ÑаблиÑа ÑазделÑеÑÑÑ Ð½Ð° ÑекÑии. РазделÑÐ½Ð½Ð°Ñ Ð½Ð° ÑекÑии ÑаблиÑа назÑваеÑÑÑ ÑекÑиониÑованной ÑаблиÑей. ÐеклаÑаÑÐ¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· опиÑанного вÑÑе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑода ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑпиÑка ÑÑолбÑов или вÑÑажений, обÑазÑÑÑÐ¸Ñ ÐºÐ»ÑÑ ÑекÑиониÑованиÑ.
Сама ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа ÑвлÑеÑÑÑ Â«Ð²Ð¸ÑÑÑалÑной» и как ÑÐ°ÐºÐ¾Ð²Ð°Ñ Ð½Ðµ Ñ ÑаниÑÑÑ. Ð¥ÑанилиÑе иÑполÑзÑеÑÑÑ ÐµÑ ÑекÑиÑми, коÑоÑÑе ÑвлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми ÑаблиÑами, ÑвÑзаннÑми Ñ ÑекÑиониÑованной. Ркаждой ÑекÑии Ñ ÑаниÑÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво даннÑÑ ÑаблиÑÑ, опÑеделÑемое ÐµÑ Ð³ÑаниÑами ÑекÑии. ÐÑе ÑÑÑоки, вÑÑавлÑемÑе в ÑекÑиониÑованнÑÑ ÑаблиÑÑ, пеÑенапÑавлÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑие ÑекÑии в завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°Ñений ÑÑолбÑов клÑÑа ÑекÑиониÑованиÑ. ÐÑли пÑи изменении знаÑений клÑÑа ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑÑÑоке она пеÑеÑÑаÑÑ ÑдовлеÑвоÑÑÑÑ Ð¾Ð³ÑаниÑениÑм иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑии, ÑÑа ÑÑÑока пеÑемеÑаеÑÑÑ Ð² дÑÑгÑÑ ÑекÑиÑ.
Сами ÑекÑии могÑÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой ÑекÑиониÑованнÑе ÑаблиÑÑ, Ñаким обÑазом ÑеализÑеÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ðµ ÑекÑиониÑование. ХоÑÑ Ð²Ñе ÑекÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ñе же ÑÑолбÑÑ, ÑÑо и ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа, в каждой ÑекÑии незавиÑимо Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñвои индекÑÑ, огÑаниÑÐµÐ½Ð¸Ñ Ð¸ знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. ÐодÑобнее о Ñоздании ÑекÑиониÑованнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ ÑекÑий ÑаÑÑказÑваеÑÑÑ Ð² опиÑании CREATE TABLE.
ÐÑеобÑазоваÑÑ Ð¾Ð±ÑÑнÑÑ ÑаблиÑÑ Ð² ÑекÑиониÑованнÑÑ Ð¸ наобоÑÐ¾Ñ Ð½ÐµÐ»ÑзÑ. Ðднако в ÑекÑиониÑованнÑÑ ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð² каÑеÑÑве ÑекÑии ÑÑÑеÑÑвÑÑÑÑÑ Ð¾Ð±ÑÑнÑÑ Ð¸Ð»Ð¸ ÑекÑиониÑованнÑÑ ÑаблиÑÑ, а Ñакже можно ÑдалиÑÑ ÑекÑÐ¸Ñ Ð¸Ð· ÑекÑиониÑованной ÑаблиÑÑ Ð¸ пÑевÑаÑиÑÑ ÐµÑ Ð² оÑделÑнÑÑ ÑаблиÑÑ; ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑкоÑиÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ðµ пÑоÑеÑÑÑ Ð¾Ð±ÑлÑживаниÑ. ÐбÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ ALTER TABLE, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ Ð±Ð¾Ð»ÑÑе о подкомандаÑ
ATTACH PARTITION и DETACH PARTITION.
СекÑии Ñакже могÑÑ Ð±ÑÑÑ ÑÑоÑонними ÑаблиÑами, но ÑÑÑиÑе, ÑÑо именно полÑзоваÑÐµÐ»Ñ Ð¾ÑвеÑÑÑвенен за ÑооÑвеÑÑÑвие ÑодеÑжимого ÑÑоÑонней ÑаблиÑÑ Ð¿ÑÐ°Ð²Ð¸Ð»Ñ ÑекÑиониÑованиÑ, ÑÑо не конÑÑолиÑÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки. Также ÑÑÑеÑÑвÑÑÑ Ð¸ некоÑоÑÑе дÑÑгие огÑаниÑениÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ CREATE FOREIGN TABLE.
5.12.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);СоздайÑе ÑекÑии. РопÑеделении каждой ÑекÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð³ÑаниÑÑ, ÑооÑвеÑÑÑвÑÑÑие меÑÐ¾Ð´Ñ Ð¸ клÑÑÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑодиÑелÑÑкой ÑаблиÑÑ. ÐамеÑÑÑе, ÑÑо Ñказание гÑаниÑ, пÑи коÑоÑом множеÑÑво знаÑений новой ÑекÑии пеÑеÑекаеÑÑÑ Ñо множеÑÑвом знаÑений в одной или неÑколÑÐºÐ¸Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑекÑиÑÑ , бÑÐ´ÐµÑ Ð¾ÑибоÑнÑм.
СекÑии, ÑоздаваемÑе Ñаким обÑазом, во вÑÐµÑ Ð¾ÑноÑениÑÑ ÑвлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми ÑаблиÑами Postgres Pro (или, возможно, ÑÑоÑонними ÑаблиÑами). Ð ÑаÑÑноÑÑи, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии можно незавиÑимо задаÑÑ ÑаблиÑное пÑоÑÑÑанÑÑво и паÑамеÑÑÑ Ñ ÑанениÑ.
РнаÑем пÑимеÑе ÐºÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе за один меÑÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð°Ð½Ð½Ñе можно бÑло ÑдалÑÑÑ Ð¿Ð¾ меÑÑÑам ÑоглаÑно ÑÑебованиÑм. Таким обÑазом, нÑжнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÑдÑÑ Ð²ÑглÑдеÑÑ Ñак:
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 (logdate);
УбедиÑеÑÑ Ð² Ñом, ÑÑо паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии enable_partition_pruning не вÑклÑÑен в
postgresql.conf. ÐнаÑе запÑоÑÑ Ð½Ðµ бÑдÑÑ Ð¾Ð¿ÑимизиÑоваÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.
Рданном пÑимеÑе нам поÑÑебÑеÑÑÑ ÑоздаваÑÑ ÑекÑÐ¸Ñ ÐºÐ°Ð¶Ð´Ñй меÑÑÑ, Ñак ÑÑо бÑло Ð±Ñ ÑазÑмно напиÑаÑÑ ÑкÑипÑ, коÑоÑÑй Ð±Ñ ÑоÑмиÑовал ÑÑебÑемÑй код DDL авÑомаÑиÑеÑки.
5.12.2.2. ÐбÑлÑживание ÑекÑий #
ÐбÑÑно Ð½Ð°Ð±Ð¾Ñ ÑекÑий, обÑазованнÑй изнаÑалÑно пÑи Ñоздании ÑаблиÑ, не пÑедполагаеÑÑÑ ÑÐ¾Ñ ÑанÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм. ЧаÑе наобоÑоÑ, планиÑÑеÑÑÑ ÑдалÑÑÑ ÑекÑии Ñо ÑÑаÑÑми даннÑми и пеÑиодиÑеÑки добавлÑÑÑ ÑекÑии Ñ Ð½Ð¾Ð²Ñми. Ðдно из наиболее важнÑÑ Ð¿ÑеимÑÑеÑÑв ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в Ñом, ÑÑо оно позволÑÐµÑ Ð¿ÑакÑиÑеÑки моменÑалÑно вÑполнÑÑÑ ÑÑÑдоÑмкие опеÑаÑии, изменÑÑ ÑÑÑÑкÑÑÑÑ ÑекÑий, а не ÑизиÑеÑки пеÑемеÑÐ°Ñ Ð±Ð¾Ð»ÑÑие обÑÑÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ .
СамÑй лÑгкий ÑпоÑоб ÑдалиÑÑ ÑÑаÑÑе даннÑе â пÑоÑÑо ÑдалиÑÑ ÑекÑиÑ, ÑÑавÑÑÑ Ð½ÐµÐ½Ñжной:
DROP TABLE measurement_y2006m02;
Так можно ÑдалиÑÑ Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ñ Ð·Ð°Ð¿Ð¸Ñей гоÑаздо бÑÑÑÑее, Ñем ÑдалÑÑÑ Ð¸Ñ
по одной. ÐамеÑÑÑе, однако, ÑÑо пÑиведÑÐ½Ð½Ð°Ñ Ð²ÑÑе команда ÑÑебÑÐµÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки ACCESS EXCLUSIVE.
ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑаÑÑо более пÑедпоÑÑиÑелÑнÑй ваÑÐ¸Ð°Ð½Ñ â ÑбÑаÑÑ ÑекÑÐ¸Ñ Ð¸Ð· главной ÑаблиÑÑ, но ÑÐ¾Ñ ÑаниÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ней как к ÑамоÑÑоÑÑелÑной ÑаблиÑе:
ALTER TABLE measurement DETACH PARTITION measurement_y2006m02; ALTER TABLE measurement DETACH PARTITION measurement_y2006m02 CONCURRENTLY;
ÐÑи ÑÑом можно бÑÐ´ÐµÑ Ð¿ÑодолжаÑÑ ÑабоÑаÑÑ Ñ Ð´Ð°Ð½Ð½Ñми, пока ÑаблиÑа не бÑÐ´ÐµÑ Ñдалена. ÐапÑимеÑ, в ÑÑом ÑоÑÑоÑнии оÑÐµÐ½Ñ ÐºÑÑаÑи бÑÐ´ÐµÑ ÑделаÑÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, иÑполÑзÑÑ COPY, pg_dump или подобнÑе ÑÑедÑÑва. Ðозможно, ÑÑи даннÑе Ñакже можно бÑÐ´ÐµÑ Ð°Ð³ÑегиÑоваÑÑ, пеÑевеÑÑи в компакÑнÑй ÑоÑмаÑ, вÑполниÑÑ Ð´ÑÑгÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¸Ð»Ð¸ поÑÑÑоиÑÑ Ð¾ÑÑÑÑÑ. ÐеÑÐ²Ð°Ñ ÑоÑма ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑÑебÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки ACCESS EXCLUSIVE ÑодиÑелÑÑкой ÑаблиÑÑ. ÐлагодаÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ CONCURRENTLY, как во вÑоÑой ÑоÑме, Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑии оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ ÑÑебоваÑÑÑÑ ÑолÑко блокиÑовка SHARE UPDATE EXCLUSIVE ÑодиÑелÑÑкой ÑаблиÑÑ, но пÑи ÑÑом дейÑÑвÑÑÑ Ð¾Ð³ÑаниÑениÑ, опиÑаннÑе в ALTER TABLE ... DETACH PARTITION.
ÐналогиÑнÑм обÑазом можно добавлÑÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ñ Ð´Ð°Ð½Ð½Ñми. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð¿ÑÑÑÑÑ ÑекÑÐ¸Ñ Ð² главной ÑаблиÑе Ñак же, как Ð¼Ñ Ñоздавали ÑекÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ ÑоÑÑоÑнии до ÑÑого:
CREATE TABLE measurement_y2008m02 PARTITION OF measurement
FOR VALUES FROM ('2008-02-01') TO ('2008-03-01')
TABLESPACE fasttablespace; Риногда Ñдобнее ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑаблиÑÑ Ð²Ð½Ðµ ÑÑÑÑкÑÑÑÑ ÑекÑий и пÑиÑоединиÑÑ ÐµÑ Ð² виде ÑекÑии позже. ÐÑи Ñаком подÑ
оде новÑе даннÑе можно бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑзиÑÑ, пÑовеÑиÑÑ Ð¸ пÑеобÑазоваÑÑ Ð´Ð¾ Ñого, как они поÑвÑÑÑÑ Ð² ÑекÑиониÑованной ÑаблиÑе. ÐÑоме Ñого, опеÑаÑÐ¸Ñ ATTACH PARTITION ÑÑебÑÐµÑ Ð´Ð»Ñ ÑекÑиониÑованной ÑаблиÑÑ ÑолÑко блокиÑовки SHARE UPDATE EXCLUSIVE, в оÑлиÑие Ð¾Ñ Ð¾Ð¿ÐµÑаÑии CREATE TABLE ... PARTITION OF, ÑÑебÑÑÑей блокиÑовки ACCESS EXCLUSIVE, поÑÑÐ¾Ð¼Ñ ÐµÑ Ñдобнее иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ
опеÑаÑий Ñ ÑекÑиониÑованной ÑаблиÑей. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ ALTER TABLE ... ATTACH PARTITION. ÐбойÑиÑÑ Ð±ÐµÐ· кÑопоÑливого воÑпÑÐ¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑодиÑелÑÑкой ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾, воÑполÑзовавÑиÑÑ ÑÑнкÑионалÑноÑÑÑÑ CREATE TABLE ... LIKE:
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 ÑаблиÑа бÑÐ´ÐµÑ ÑканиÑоваÑÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки огÑаниÑÐµÐ½Ð¸Ñ ÑекÑии Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовкой ACCESS EXCLUSIVE ÑÑой ÑекÑии. Ðак показано вÑÑе, ÑекомендÑеÑÑÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ Ñакого ÑканиÑованиÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð² пÑиÑоединÑемой ÑаблиÑе огÑаниÑение CHECK, ÑооÑвеÑÑÑвÑÑÑее пÑÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑекÑии, до пÑиÑоединениÑ. ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ATTACH PARTITION ÑекомендÑеÑÑÑ ÑдалиÑÑ Ð¾Ð³ÑаниÑение CHECK, поÑколÑÐºÑ Ð¾Ð½Ð¾ болÑÑе не нÑжно. ÐÑли пÑиÑоединÑÐµÐ¼Ð°Ñ ÑаблиÑа Ñакже ÑвлÑеÑÑÑ ÑекÑиониÑованной ÑаблиÑей, Ñо ÐºÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· ÐµÑ ÑекÑий бÑÐ´ÐµÑ ÑекÑÑÑивно блокиÑоваÑÑÑÑ Ð¸ ÑканиÑоваÑÑÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока не вÑÑÑеÑиÑÑÑ Ð¿Ð¾Ð´Ñ
одÑÑее огÑаниÑение CHECK или не бÑдÑÑ Ð´Ð¾ÑÑигнÑÑÑ ÐºÐ¾Ð½ÐµÑнÑе ÑазделÑ.
ТоÑно Ñак же, еÑли в ÑекÑиониÑованной ÑаблиÑе еÑÑÑ ÑекÑÐ¸Ñ DEFAULT, ÑекомендÑеÑÑÑ ÑоздаÑÑ Ð¾Ð³ÑаниÑение CHECK, коÑоÑое иÑклÑÑÐ°ÐµÑ Ð¾Ð³ÑаниÑение ÑекÑии, подлежаÑей пÑиÑоединениÑ. ÐÑли ÑÑого не ÑделаÑÑ, Ñо ÑекÑÐ¸Ñ DEFAULT бÑÐ´ÐµÑ Ð¿ÑоÑканиÑована, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо она не ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð² пÑиÑоединÑемой ÑекÑии. ÐÑа опеÑаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи ÑдеÑжании блокиÑовки ACCESS EXCLUSIVE на ÑекÑии DEFAULT. ÐÑли ÑекÑÐ¸Ñ DEFAULT Ñама ÑвлÑеÑÑÑ ÑекÑиониÑованной ÑаблиÑей, Ñо ÐºÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· ÐµÑ ÑекÑий бÑÐ´ÐµÑ ÑекÑÑÑивно пÑовеÑÑÑÑÑÑ Ñаким же обÑазом, как и пÑиÑоединÑÐµÐ¼Ð°Ñ ÑаблиÑа, как ÑпоминалоÑÑ Ð²ÑÑе.
Ðак ÑпоминалоÑÑ Ð²ÑÑе, в ÑекÑиониÑованнÑÑ
ÑаблиÑаÑ
можно ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ пÑименÑлиÑÑ Ð°Ð²ÑомаÑиÑеÑки ко вÑей иеÑаÑÑ
ии. ÐÑо оÑÐµÐ½Ñ Ñдобно, Ñак как индекÑиÑоваÑÑÑÑ Ð±ÑдÑÑ Ð½Ðµ ÑолÑко вÑе ÑÑÑеÑÑвÑÑÑие ÑекÑии, но и лÑбÑе ÑекÑии, ÑоздаваемÑе в бÑдÑÑем. Ðднако еÑÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение: Ñакой ÑекÑиониÑованнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð½ÐµÐ»ÑÐ·Ñ ÑоздаÑÑ Ð² неблокиÑÑÑÑем Ñежиме (Ñ Ñказанием CONCURRENTLY), ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ðº длиÑелÑнÑм блокиÑовкам. ЧÑÐ¾Ð±Ñ Ð¸Ñ
избежаÑÑ, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа в Ñамой ÑекÑиониÑованной ÑаблиÑе можно иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX ON ONLY, Ñогда ÑозданнÑй Ð¸Ð½Ð´ÐµÐºÑ ÑÑÐ°Ð·Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑен как неÑабоÑий и не бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑименÑн к ÑÑÑеÑÑвÑÑÑим ÑекÑиÑм. ÐндекÑÑ ÑобÑÑвенно в ÑекÑиÑÑ
можно ÑоздаÑÑ Ð² индивидÑалÑном поÑÑдке Ñ Ñказанием CONCURRENTLY, а заÑем пÑиÑоединиÑÑ Ð¸Ñ
к индекÑÑ-ÑодиÑелÑ, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER INDEX .. ATTACH PARTITION. ÐоÑле Ñого как индекÑÑ Ð²ÑеÑ
ÑекÑий бÑдÑÑ Ð¿ÑиÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ñ Ðº ÑодиÑелÑÑкомÑ, поÑледний авÑомаÑиÑеÑки пеÑейдÑÑ Ð² ÑабоÑее ÑоÑÑоÑние. ÐапÑимеÑ:
CREATE INDEX measurement_usls_idx ON ONLY measurement (unitsales);
CREATE INDEX CONCURRENTLY measurement_usls_200602_idx
ON measurement_y2006m02 (unitsales);
ALTER INDEX measurement_usls_idx
ATTACH PARTITION measurement_usls_200602_idx;
... ÐÑÐ¾Ñ Ð¿ÑиÑм можно пÑименÑÑÑ Ð¸ Ñ Ð¾Ð³ÑаниÑениÑми UNIQUE и PRIMARY KEY, Ð´Ð»Ñ Ð½Ð¸Ñ
индекÑÑ ÑоздаÑÑÑÑ Ð½ÐµÑвно пÑи Ñоздании огÑаниÑениÑ. ÐапÑимеÑ:
ALTER TABLE ONLY measurement ADD UNIQUE (city_id, logdate);
ALTER TABLE measurement_y2006m02 ADD UNIQUE (city_id, logdate);
ALTER INDEX measurement_city_id_logdate_key
ATTACH PARTITION measurement_y2006m02_city_id_logdate_key;
...Также еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±ÑединиÑÑ Ð½ÐµÑколÑко ÑекÑий ÑÐ°Ð±Ð»Ð¸Ñ Ð² Ð¾Ð´Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TABLE ... MERGE PARTITIONS. Ðна ÑпÑоÑÐ°ÐµÑ ÑпÑавление ÑекÑиониÑованнÑми ÑаблиÑами, позволÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм обÑединÑÑÑ ÑекÑии, коÑоÑÑе болÑÑе не нÑÐ¶Ð½Ñ Ð¿Ð¾ оÑделÑноÑÑи. Ðажно оÑмеÑиÑÑ, ÑÑо ÑÑа опеÑаÑÐ¸Ñ Ð½Ðµ поддеÑживаеÑÑÑ Ð´Ð»Ñ ÑаблиÑ, ÑекÑиониÑованнÑÑ
по Ñ
еÑÑ, и запÑаÑÐ¸Ð²Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ACCESS EXCLUSIVE, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑ
ÑдÑаÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð²ÑÑоконагÑÑженнÑÑ
ÑиÑÑем. ÐапÑимеÑ, можно обÑединиÑÑ ÑÑи ежемеÑÑÑнÑÑ
ÑекÑии в Ð¾Ð´Ð½Ñ ÐºÐ²Ð°ÑÑалÑнÑÑ:
ALTER TABLE measurement
MERGE PARTITIONS (measurement_y2006m01,
measurement_y2006m02,
measurement_y2006m03) INTO measurement_y2006q1;ÐÑоме Ñого, еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑазбиÑÑ Ð¾Ð´Ð½Ñ ÑекÑÐ¸Ñ Ð½Ð° неÑколÑко Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TABLE ... SPLIT PARTITION. Ðна пÑигодиÑÑÑ Ð² ÑлÑÑаÑÑ
, когда одна ÑекÑÐ¸Ñ ÑÑановиÑÑÑ ÑлиÑком болÑÑой и ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимо ÑазбиÑÑ Ð½Ð° неÑколÑко. Ðажно оÑмеÑиÑÑ, ÑÑо ÑÑа опеÑаÑÐ¸Ñ Ð½Ðµ поддеÑживаеÑÑÑ Ð´Ð»Ñ ÑаблиÑ, ÑекÑиониÑованнÑÑ
по Ñ
еÑÑ, и запÑаÑÐ¸Ð²Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ACCESS EXCLUSIVE, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑ
ÑдÑаÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð²ÑÑоконагÑÑженнÑÑ
ÑиÑÑем. ÐапÑимеÑ, можно ÑазбиÑÑ ÐºÐ²Ð°ÑÑалÑнÑÑ ÑекÑÐ¸Ñ Ð¾Ð±ÑаÑно на ежемеÑÑÑнÑе:
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO
(PARTITION measurement_y2006m01 FOR VALUES FROM ('2006-01-01') TO ('2006-02-01'),
PARTITION measurement_y2006m02 FOR VALUES FROM ('2006-02-01') TO ('2006-03-01'),
PARTITION measurement_y2006m03 FOR VALUES FROM ('2006-03-01') TO ('2006-04-01'));5.12.2.3. ÐгÑаниÑÐµÐ½Ð¸Ñ #
С ÑекÑиониÑованнÑми ÑаблиÑами ÑвÑÐ·Ð°Ð½Ñ ÑледÑÑÑие огÑаниÑениÑ:
СоздаÑÑ Ð¾Ð³ÑаниÑение ÑникалÑноÑÑи или пеÑвиÑного клÑÑа Ð´Ð»Ñ ÑекÑиониÑованной ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾, ÑолÑко еÑли клÑÑи ÑекÑий не вклÑÑаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ вÑÐ·Ð¾Ð²Ñ ÑÑнкÑий и в огÑаниÑение Ð²Ñ Ð¾Ð´ÑÑ Ð²Ñе ÑÑолбÑÑ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ. ÐÑо ÑÑловие обÑÑÑнÑеÑÑÑ Ñем, ÑÑо оÑделÑнÑе индекÑÑ, обÑазÑÑÑие огÑаниÑение, могÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно обеÑпеÑиваÑÑ ÑникалÑноÑÑÑ ÑолÑко в ÑÐ²Ð¾Ð¸Ñ ÑекÑиÑÑ . ÐоÑÑÐ¾Ð¼Ñ Ñама ÑÑÑÑкÑÑÑа ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° гаÑанÑиÑоваÑÑ Ð¾ÑÑÑÑÑÑвие дÑбликаÑов в ÑазнÑÑ ÑекÑиÑÑ .
ÐодобнÑм обÑазом огÑаниÑение-иÑклÑÑение должно вклÑÑаÑÑ Ð²Ñе ÑÑолбÑÑ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ. ÐÑоме Ñого, огÑаниÑение должно ÑÑавниваÑÑ ÑÑи ÑÑолбÑÑ Ð½Ð° пÑÐµÐ´Ð¼ÐµÑ ÑавенÑÑва (не
&&, напÑимеÑ). ÐÑо обÑзаÑелÑное ÑÑловие Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¸Ð·-за Ñого, ÑÑо нелÑÐ·Ñ Ð¿ÑинÑдиÑелÑно пÑименÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑекÑиÑми. ÐгÑаниÑение Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑолбÑÑ, коÑоÑÑе не ÑвлÑÑÑÑÑ ÑаÑÑÑÑ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ, и ÑÑавниваÑÑ Ð¸Ñ Ñ Ð»ÑбÑми опеÑаÑоÑами.ТÑиггеÑÑ
BEFORE ROWдлÑINSERTне могÑÑ Ð¼ÐµÐ½ÑÑÑ ÑекÑиÑ, в коÑоÑÑÑ Ð² иÑоге попадÑÑ Ð½Ð¾Ð²Ð°Ñ ÑÑÑока.СмеÑивание вÑеменнÑÑ Ð¸ поÑÑоÑннÑÑ Ð¾ÑноÑений в одном деÑеве ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ допÑÑкаеÑÑÑ. Таким обÑазом, еÑли ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа поÑÑоÑннаÑ, Ñакими же Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÐµÑ ÑекÑии; Ñ Ð²ÑеменнÑми ÑаблиÑами аналогиÑно. Ð ÑлÑÑае Ñ Ð²ÑеменнÑми оÑноÑениÑми вÑе ÑаблиÑÑ Ð´ÐµÑева ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð· одного ÑеанÑа.
Ðа ÑÑовне ÑеализаÑии оÑделÑнÑе ÑекÑии ÑвÑзÑваÑÑÑÑ Ñ ÑекÑиониÑованной ÑаблиÑей ÑÑедÑÑвами наÑледованиÑ. Ðднако Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивно ÑекÑиониÑованнÑми ÑаблиÑами или Ð¸Ñ ÑекÑиÑми нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¾Ð±ÑÑÑ ÑÑнкÑионалÑноÑÑÑ Ð½Ð°ÑледованиÑ, как опиÑано ниже. Рименно, ÑекÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´ÑÑÐ³Ð¸Ñ ÑодиÑелей, кÑоме ÑекÑиониÑованной ÑаблиÑÑ, к коÑоÑой она оÑноÑиÑÑÑ, Ñавно как и лÑÐ±Ð°Ñ ÑаблиÑа не Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑледоваÑÑÑÑ Ð¸ Ð¾Ñ ÑекÑиониÑованной, и Ð¾Ñ Ð¾Ð±ÑÑной ÑаблиÑÑ. ÐÑо ознаÑаеÑ, ÑÑо ÑекÑиониÑованнÑе ÑаблиÑÑ Ð¸ Ð¸Ñ ÑекÑии не ÑовмеÑаÑÑÑÑ Ð² иеÑаÑÑ Ð¸Ð¸ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑми ÑаблиÑами.
Так как иеÑаÑÑ
Ð¸Ñ ÑекÑиониÑованиÑ, обÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑекÑиониÑованной ÑаблиÑей и ÐµÑ ÑекÑиÑми, ÑвлÑеÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно и иеÑаÑÑ
ией наÑледованиÑ, она ÑодеÑÐ¶Ð¸Ñ tableoid и на Ð½ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð²Ñе обÑÑнÑе пÑавила наÑледованиÑ, опиÑаннÑе в Разделе 5.11, Ñ Ð½ÐµÐºÐ¾ÑоÑÑми иÑклÑÑениÑми:
Ð ÑекÑиÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑолбÑов, оÑÑÑÑÑÑвÑÑÑÐ¸Ñ Ð² ÑодиÑелÑÑкой ÑаблиÑе. Такие ÑÑолбÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделиÑÑ Ð½Ð¸ пÑи Ñоздании ÑекÑий командой
CREATE TABLE, ни пÑÑÑм поÑледÑÑÑего Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑекÑии командойALTER TABLE. ТаблиÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ñ Ð² каÑеÑÑве ÑекÑий командойALTER TABLE ... ATTACH PARTITION, ÑолÑко еÑли Ð¸Ñ ÑÑолбÑÑ Ð² ÑоÑноÑÑи ÑооÑвеÑÑÑвÑÑÑ ÑодиÑелÑÑкой ÑаблиÑе.ÐгÑаниÑениÑ
CHECKвмеÑÑе ÑNOT NULL, опÑеделÑннÑе в ÑекÑиониÑованной ÑаблиÑе, вÑегда наÑледÑÑÑÑÑ Ð²Ñеми ÐµÑ ÑекÑиÑми. ÐгÑаниÑениÑCHECKÑ Ñ Ð°ÑакÑеÑиÑÑикойNO INHERITв ÑекÑиониÑованнÑÑ ÑаблиÑÐ°Ñ ÑоздаваÑÑ Ð½ÐµÐ»ÑзÑ. Также нелÑÐ·Ñ ÑдалиÑÑ Ð¾Ð³ÑаниÑениеNOT NULL, заданное Ð´Ð»Ñ ÑÑолбÑа ÑекÑии, еÑли Ñакое же огÑаниÑение ÑÑÑеÑÑвÑÐµÑ Ð² ÑодиÑелÑÑкой ÑаблиÑе.ÐÑполÑзование ÑказаниÑ
ONLYпÑи добавлении или Ñдалении огÑаниÑÐµÐ½Ð¸Ñ ÑолÑко в ÑекÑиониÑованной ÑаблиÑе поддеÑживаеÑÑÑ, лиÑÑ ÐºÐ¾Ð³Ð´Ð° в ней Ð½ÐµÑ ÑекÑий. ÐÑи налиÑии ÑекÑий попÑÑка иÑполÑзованиÑONLYвÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð´Ð»Ñ Ð»ÑбÑÑ Ð¾Ð³ÑаниÑений, кÑомеUNIQUEиPRIMARY KEY. С дÑÑгой ÑÑоÑонÑ, огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ добавлÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑекÑиÑÑ (еÑли они оÑÑÑÑÑÑвÑÑÑ Ð² ÑодиÑелÑÑкой ÑаблиÑе).Так как ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа Ñама по Ñебе не ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе, иÑполÑзование
TRUNCATEONLYÐ´Ð»Ñ ÑекÑиониÑованной ÑаблиÑÑ Ð²Ñегда бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð¾Ñибкой.
5.12.3. СекÑиониÑование Ñ Ð¸ÑполÑзованием наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ #
ХоÑÑ Ð²ÑÑÑоенное деклаÑаÑивное ÑекÑиониÑование полезно во Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑаÑÑо возникаÑÑÐ¸Ñ ÑиÑÑаÑиÑÑ , бÑваÑÑ Ð¾Ð±ÑÑоÑÑелÑÑÑва, ÑÑебÑÑÑие более гибкого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð°. Ð ÑÑом ÑлÑÑае ÑекÑиониÑование можно ÑеализоваÑÑ, пÑименив Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑ, ÑÑо даÑÑ ÑÑд возможноÑÑей, неподдеÑживаемÑÑ Ð¿Ñи деклаÑаÑивном ÑекÑиониÑовании, напÑимеÑ:
ÐÑи деклаÑаÑивном ÑекÑиониÑовании вÑе ÑекÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð² ÑоÑноÑÑи ÑÐ¾Ñ Ð¶Ðµ Ð½Ð°Ð±Ð¾Ñ ÑÑолбÑов, ÑÑо и ÑекÑиониÑÑÐµÐ¼Ð°Ñ ÑаблиÑа, Ñогда как обÑÑное наÑледование ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð¾Ð¿ÑÑÐºÐ°ÐµÑ Ð½Ð°Ð»Ð¸Ñие в доÑеÑÐ½Ð¸Ñ ÑаблиÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑолбÑов, оÑÑÑÑÑÑвÑÑÑÐ¸Ñ Ð² ÑодиÑеле.
ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑвенное наÑледование.
С деклаÑаÑивнÑм ÑекÑиониÑованием поддеÑживаеÑÑÑ ÑолÑко ÑекÑиониÑование по ÑпиÑкам, по диапазонам и по Ñ ÐµÑÑ, Ñогда как Ñ Ð½Ð°Ñледованием ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð°Ð½Ð½Ñе можно ÑазделÑÑÑ Ð¿Ð¾ лÑÐ±Ð¾Ð¼Ñ ÐºÑиÑеÑиÑ, вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелем. (Ðднако замеÑÑÑе, ÑÑо еÑли иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ позволÑÐµÑ ÑÑÑекÑивно ÑÑÑÑанÑÑÑ Ð´Ð¾ÑеÑние ÑаблиÑÑ Ð¸Ð· планов запÑоÑов, пÑоизводиÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов бÑÐ´ÐµÑ Ð¾ÑÐµÐ½Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹.)
5.12.3.1. ÐÑÐ¸Ð¼ÐµÑ #
Ð ÑÑом пÑимеÑе бÑÐ´ÐµÑ Ñоздана ÑÑÑÑкÑÑÑа ÑекÑиониÑованиÑ, ÑавнознаÑÐ½Ð°Ñ ÑÑÑÑкÑÑÑе из пÑимеÑа Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивнÑм ÑекÑиониÑованием. ÐÑполниÑе ÑледÑÑÑие дейÑÑвиÑ:
СоздайÑе «главнÑÑ» ÑаблиÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑой бÑдÑÑ Ð½Ð°ÑледоваÑÑÑÑ Ð²Ñе «доÑеÑние» ÑаблиÑÑ. ÐÐ»Ð°Ð²Ð½Ð°Ñ ÑаблиÑа не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе. Ðе опÑеделÑйÑе в ней никакие огÑаниÑениÑ-пÑовеÑки, еÑли ÑолÑко Ð²Ñ Ð½Ðµ намеÑÐµÐ½Ñ Ð¿ÑимениÑÑ Ð¸Ñ Ð²Ð¾ вÑÐµÑ Ð´Ð¾ÑеÑÐ½Ð¸Ñ ÑаблиÑÐ°Ñ . Также не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла опÑеделÑÑÑ Ð² ней какие-либо индекÑÑ Ð¸Ð»Ð¸ огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи. РнаÑем пÑимеÑе главной ÑаблиÑей бÑдеÑ
measurementÑо Ñвоим изнаÑалÑнÑм опÑеделением:CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int );СоздайÑе неÑколÑко «доÑеÑÐ½Ð¸Ñ Â» ÑаблиÑ, ÑнаÑледовав Ð¸Ñ Ð²Ñе Ð¾Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹. ÐбÑÑно в ÑÐ°ÐºÐ¸Ñ ÑаблиÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑолбÑов, кÑоме ÑнаÑледованнÑÑ . Ðак и Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивнÑм ÑекÑиониÑованием, ÑÑи ÑаблиÑÑ Ð²Ð¾ вÑÐµÑ Ð¾ÑноÑениÑÑ Ð±ÑдÑÑ Ð¾Ð±ÑÑнÑми ÑаблиÑами Postgres Pro (или ÑÑоÑонними ÑаблиÑами).
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 FUNCTION 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.12.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.12.3.3. ÐгÑаниÑÐµÐ½Ð¸Ñ #
С ÑеализаÑией ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑез наÑледование ÑвÑÐ·Ð°Ð½Ñ ÑледÑÑÑие огÑаниÑениÑ:
СиÑÑема не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑиÑÑ Ð°Ð²ÑомаÑиÑеÑки, ÑвлÑÑÑÑÑ Ð»Ð¸ вÑе огÑаниÑениÑ
CHECKвзаимно иÑклÑÑаÑÑими. ÐоÑÑÐ¾Ð¼Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñнее бÑÐ´ÐµÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð¸ оÑладиÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ÑеÑÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸/или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвÑзаннÑÑ Ð¾Ð±ÑекÑов, Ñем делаÑÑ ÑÑо вÑÑÑнÑÑ.ÐндекÑÑ Ð¸ внеÑние клÑÑи оÑноÑÑÑÑÑ Ðº опÑеделÑнной ÑаблиÑе, но не к ÐµÑ Ð¸ÐµÑаÑÑ Ð¸Ð¸ наÑледованиÑ, поÑÑÐ¾Ð¼Ñ Ñ Ð½Ð¸Ð¼Ð¸ ÑвÑÐ·Ð°Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе огÑаниÑениÑ.
ÐоказаннÑе здеÑÑ ÑÑ ÐµÐ¼Ñ Ð¿Ð¾Ð´ÑазÑмеваÑÑ, ÑÑо клÑÑевой ÑÑÐ¾Ð»Ð±ÐµÑ (или ÑÑолбÑÑ) в ÑÑÑоке никогда не менÑеÑÑÑ, или менÑеÑÑÑ Ð½Ðµ наÑÑолÑко, ÑÑÐ¾Ð±Ñ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ÑÑебовалоÑÑ Ð¿ÐµÑенеÑÑи в дÑÑгÑÑ ÑекÑиÑ. ÐÑли же попÑÑаÑÑÑÑ Ð²ÑполниÑÑ Ñакой опеÑаÑоÑ
UPDATE, пÑоизойдÑÑ Ð¾Ñибка из-за наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑениÑCHECK. ÐÑли вам нÑжно обÑабоÑаÑÑ Ð¸ Ñакие ÑлÑÑаи, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑÑиггеÑÑ Ð½Ð° обновление в доÑеÑÐ½Ð¸Ñ ÑаблиÑÐ°Ñ , но ÑÑо еÑÑ Ð±Ð¾Ð»ÑÑе ÑÑÐ»Ð¾Ð¶Ð½Ð¸Ñ ÑпÑавление вÑей конÑÑÑÑкÑией.ÐÑли Ð²Ñ Ð²ÑполнÑеÑе командÑ
VACUUMилиANALYZEвÑÑÑнÑÑ, не забÑвайÑе, ÑÑо Ð¸Ñ Ð½Ñжно запÑÑкаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ доÑеÑней ÑаблиÑÑ Ð² оÑделÑноÑÑи. ÐомандаANALYZE measurement;
обÑабоÑÐ°ÐµÑ ÑолÑко главнÑÑ ÑаблиÑÑ.
ÐпеÑаÑоÑÑ
INSERTÑ Ð¿ÑедложениÑмиON CONFLICTÑкоÑее вÑего не бÑдÑÑ ÑабоÑаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм обÑазом, Ñак как дейÑÑвиеON CONFLICTпÑедпÑинимаеÑÑÑ ÑолÑко в ÑлÑÑае наÑÑÑений ÑникалÑноÑÑи в Ñказанном Ñелевом оÑноÑении, а не его доÑеÑÐ½Ð¸Ñ Ð¾ÑноÑениÑÑ .ÐÐ»Ñ Ð½Ð°Ð¿ÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑок в нÑжнÑе доÑеÑние ÑаблиÑÑ Ð¿Ð¾ÑÑебÑÑÑÑÑ ÑÑиггеÑÑ Ð¸Ð»Ð¸ пÑавила, еÑли ÑолÑко пÑиложение не Ð·Ð½Ð°ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно о ÑÑ ÐµÐ¼Ðµ ÑекÑиониÑованиÑ. РазÑабоÑаÑÑ ÑÑиггеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñложно, и они бÑдÑÑ ÑабоÑаÑÑ Ð³Ð¾Ñаздо медленнее, Ñем внÑÑÑеннее ÑаÑпÑеделение коÑÑежей пÑи деклаÑаÑивном ÑекÑиониÑовании.
5.12.4. ÐÑÑеÑение ÑекÑий #
ÐÑÑеÑение ÑекÑий â ÑÑо пÑиÑм опÑимизаÑии запÑоÑов, коÑоÑÑй ÑÑкоÑÑÐµÑ ÑабоÑÑ Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивно ÑекÑиониÑованнÑми ÑаблиÑами. ÐапÑимеÑ:
SET enable_partition_pruning = on; -- по ÑмолÑÐ°Ð½Ð¸Ñ SELECT count(*) FROM measurement WHERE logdate >= DATE '2008-01-01';
Ðез оÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий показаннÑй запÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÐ´ÐµÑ Ð¿ÑоÑканиÑоваÑÑ Ð²Ñе ÑекÑии ÑаблиÑÑ measurement. Ðогда оÑÑеÑение ÑекÑий вклÑÑено, планиÑовÑик ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð¿Ñеделение каждой ÑекÑии и Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÐ»ÑÑиÑÑ, ÑÑо какÑÑ-либо ÑекÑÐ¸Ñ ÑканиÑоваÑÑ Ð½Ðµ нÑжно, Ñак как в ней не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑок, ÑдовлеÑвоÑÑÑÑиÑ
пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE в запÑоÑе. Ðогда планиÑовÑик Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ Ñакой вÑвод, он иÑклÑÑÐ°ÐµÑ (оÑÑекаеÑ) ÑекÑÐ¸Ñ Ð¸Ð· плана запÑоÑа.
ÐÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN и паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии enable_partition_pruning, можно ÑвидеÑÑ Ð¾ÑлиÑие плана, в коÑоÑом бÑли оÑÑеÑÐµÐ½Ñ ÑекÑии, Ð¾Ñ Ð¿Ð»Ð°Ð½Ð° без оÑÑеÑениÑ. ТипиÑнÑй неопÑимизиÑованнÑй план Ð´Ð»Ñ Ñакой конÑигÑÑаÑии ÑаблиÑÑ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
SET enable_partition_pruning = off;
EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE '2008-01-01';
QUERY PLAN
-------------------------------------------------------------------â----------------
Aggregate (cost=188.76..188.77 rows=1 width=8)
-> Append (cost=0.00..181.05 rows=3085 width=0)
-> Seq Scan on measurement_y2006m02 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2006m03 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)
...
-> Seq Scan on measurement_y2007m11 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2007m12 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)
-> Seq Scan on measurement_y2008m01 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)РнекоÑоÑÑÑ Ð¸Ð»Ð¸ вÑÐµÑ ÑекÑиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð½Ðµ полное поÑледоваÑелÑное ÑканиÑование, а ÑканиÑование по индекÑÑ, но оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¸Ð´ÐµÑ Ð¿ÑимеÑа в Ñом, ÑÑо Ð´Ð»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа не нÑжно ÑканиÑоваÑÑ ÑÑаÑÑе ÑекÑии. Ркогда Ð¼Ñ Ð²ÐºÐ»ÑÑаем оÑÑеÑение ÑекÑий, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем знаÑиÑелÑно более ÑÑÑекÑивнÑй план, даÑÑий ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ:
SET enable_partition_pruning = on;
EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE '2008-01-01';
QUERY PLAN
-------------------------------------------------------------------â----------------
Aggregate (cost=37.75..37.76 rows=1 width=8)
-> Seq Scan on measurement_y2008m01 (cost=0.00..33.12 rows=617 width=0)
Filter: (logdate >= '2008-01-01'::date)ÐамеÑÑÑе, ÑÑо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ оÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий ÑÑиÑÑÐ²Ð°ÐµÑ ÑолÑко огÑаниÑениÑ, опÑеделÑннÑе неÑвно клÑÑами ÑекÑиониÑованиÑ, но не налиÑие индекÑов. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð¿ÑеделÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð´Ð»Ñ ÑÑолбÑов клÑÑа не обÑзаÑелÑно. ÐÑжно ли ÑоздаваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнной ÑекÑии, завиÑÐ¸Ñ Ð¾Ñ Ñого, какÑÑ ÑаÑÑÑ ÑекÑии (менÑÑÑÑ Ð¸Ð»Ð¸ болÑÑÑÑ), по ваÑим пÑедÑÑавлениÑм, бÑдÑÑ ÑканиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº ÑÑой ÑекÑии. ÐÐ½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в пеÑвом ÑлÑÑае, но не во вÑоÑом.
ÐÑÑеÑение ÑекÑий Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизводиÑÑÑÑ Ð½Ðµ ÑолÑко пÑи планиÑовании конкÑеÑного запÑоÑа, но и в пÑоÑеÑÑе его вÑполнениÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÑеÑено болÑÑе ÑекÑий, когда ÑÑловнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑодеÑÐ¶Ð°Ñ Ð·Ð½Ð°ÑениÑ, неизвеÑÑнÑе во вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, напÑÐ¸Ð¼ÐµÑ Ð¿Ð°ÑамеÑÑÑ, опÑеделÑннÑе опеÑаÑоÑом PREPARE, знаÑениÑ, полÑÑаемÑе из подзапÑоÑов, или паÑамеÑÑизованнÑе знаÑÐµÐ½Ð¸Ñ Ð²Ð¾ внÑÑÑенней ÑÑоÑоне ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñм Ñиклом. ÐÑÑеÑение ÑекÑий в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа возможно в ÑледÑÑÑие моменÑÑ Ð²Ñемени:
Ðо вÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки плана запÑоÑа. Ð ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑеÑÑ ÑекÑии, ÑÑиÑÑÐ²Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов, извеÑÑнÑе пÑи подгоÑовке вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. СекÑии, оÑÑеÑÑннÑе на ÑÑом ÑÑапе, не бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð² вÑводе
EXPLAINилиEXPLAIN ANALYZE. ÐÑ Ð¾Ð±Ñее колиÑеÑÑво можно опÑеделиÑÑ Ð¿Ð¾ ÑвойÑÑÐ²Ñ Â«Subplans Removed» в вÑводеEXPLAIN. Ðажно оÑмеÑиÑÑ, ÑÑо ÑекÑии, оÑÑеÑÑннÑе на ÑÑом ÑÑапе, оÑÑаÑÑÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑованнÑми на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.РпÑоÑеÑÑе ÑобÑÑвенно вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð° запÑоÑа. ÐÑÑеÑение ÑекÑий Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð½Ð° ÑÑом ÑÑапе и позволÑÐµÑ Ð¾ÑÑилÑÑÑоваÑÑ ÑекÑии, иÑполÑзÑÑ Ð·Ð½Ð°ÑениÑ, коÑоÑÑе ÑÑановÑÑÑÑ Ð¸Ð·Ð²ÐµÑÑнÑ, когда запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ ÑакÑиÑеÑки. Ð ÑаÑÑноÑÑи ÑÑо могÑÑ Ð±ÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸Ð· подзапÑоÑов и знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов вÑемени вÑполнениÑ, напÑÐ¸Ð¼ÐµÑ Ð¸Ð· паÑамеÑÑизованнÑÑ Ñоединений Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми Ñиклами. Так как знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно пÑи вÑполнении запÑоÑа, оÑÑеÑение ÑекÑий вÑполнÑеÑÑÑ Ð¿Ñи изменении лÑбого из паÑамеÑÑов, анализиÑÑемÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ оÑÑеÑениÑ. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, бÑли ли ÑекÑии оÑÑеÑÐµÐ½Ñ Ð½Ð° данном ÑÑапе, нÑжно внимаÑелÑно изÑÑиÑÑ ÑвойÑÑво
loopsв вÑводеEXPLAIN ANALYZE. ÐодпланÑ, ÑооÑвеÑÑÑвÑÑÑие ÑазнÑм ÑекÑиÑм, могÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе знаÑениÑ, в завиÑимоÑÑи Ð¾Ñ Ñого, ÑколÑко Ñаз они оÑÑекалиÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐекоÑоÑÑе из Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð´Ð°Ð¶Ðµ имеÑÑ Ð·Ð½Ð°Ñение(never executed)(никогда не вÑполнÑлиÑÑ), еÑли они оÑÑекалиÑÑ Ð²Ñегда.
ÐÑÑеÑение ÑекÑий можно оÑклÑÑиÑÑ, воÑполÑзовавÑиÑÑ Ð¿Ð°ÑамеÑÑом enable_partition_pruning.
5.12.5. СекÑиониÑование и иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ #
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ â пÑиÑм опÑимизаÑии запÑоÑов, подобнÑй оÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий. ÐÑежде вÑего он пÑименÑеÑÑÑ, когда ÑекÑиониÑование оÑÑÑеÑÑвлÑеÑÑÑ Ñ Ð¸ÑполÑзованием ÑÑаÑого меÑода наÑледованиÑ, но он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ и Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ñелей, вклÑÑÐ°Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивное ÑекÑиониÑование.
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ ÑабоÑÐ°ÐµÑ Ð²Ð¾ многом Ñак же, как и оÑÑеÑение ÑекÑий; оÑлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо оно иÑполÑзÑÐµÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK вÑеÑ
ÑÐ°Ð±Ð»Ð¸Ñ (поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ Ñак и назÑваеÑÑÑ), Ñогда как Ð´Ð»Ñ Ð¾ÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий иÑполÑзÑÑÑÑÑ Ð³ÑаниÑÑ ÑекÑии, коÑоÑÑе ÑÑÑеÑÑвÑÑÑ ÑолÑко в ÑлÑÑае деклаÑаÑивного ÑекÑиониÑованиÑ. ÐÑÑ Ð¾Ð´Ð½Ð¾ ÑазлиÑие ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð¿ÑименÑеÑÑÑ ÑолÑко во вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ; во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑии из плана ÑдалÑÑÑÑÑ Ð½Ðµ бÑдÑÑ.
То, ÑÑо иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÐµÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK (вÑледÑÑвие Ñего оно ÑабоÑÐ°ÐµÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ оÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий), иногда Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ пÑеимÑÑеÑÑвом. ÐгÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´Ð°Ð¶Ðµ Ð´Ð»Ñ Ð´ÐµÐºÐ»Ð°ÑаÑивно ÑекÑиониÑованнÑÑ
ÑаблиÑ, в дополнение к внÑÑÑенним гÑаниÑам ÑекÑий, и Ñогда иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ ÑÐ¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно ÑбÑаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑекÑии из плана запÑоÑа.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑ constraint_exclusion Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение не on и не off, а пÑомежÑÑоÑное (и ÑекомендÑемое) знаÑение partition, пÑи коÑоÑом ÑÑÐ¾Ñ Ð¿ÑиÑм бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑолÑко к запÑоÑам, где пÑедположиÑелÑно бÑдÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ ÑаблиÑÑ, ÑекÑиониÑованнÑе Ñ Ð¸ÑполÑзованием наÑледованиÑ. ÐнаÑение on обÑзÑÐ²Ð°ÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик пÑоÑмаÑÑиваÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ CHECK во вÑеÑ
запÑоÑаÑ
, даже в ÑамÑÑ
пÑоÑÑÑÑ
, где вÑигÑÑÑ Ð¾Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð°Ð»Ð¾Ð²ÐµÑоÑÑен.
ÐÑименÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑениÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑиÑÑваÑÑ ÑледÑÑÑее:
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð¿ÑименÑеÑÑÑ ÑолÑко пÑи планиÑовании запÑоÑа, в оÑлиÑие Ð¾Ñ Ð¾ÑÑеÑÐµÐ½Ð¸Ñ ÑекÑий, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑÑÑ Ð¸ пÑи вÑполнении запÑоÑа.
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ ÑабоÑÐ°ÐµÑ ÑолÑко когда пÑедложение
WHEREв запÑоÑе ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð½ÑÑанÑÑ (или полÑÑаемÑе извне паÑамеÑÑÑ). ÐапÑимеÑ, ÑÑавнение Ñ Ð½ÐµÐ¿Ð¾ÑÑоÑнной ÑÑнкÑией, Ñакой какCURRENT_TIMESTAMP, нелÑÐ·Ñ Ð¾Ð¿ÑимизиÑоваÑÑ, Ñак как планиÑовÑик не Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑÑ, в какÑÑ Ð´Ð¾ÑеÑнÑÑ ÑаблиÑÑ Ð¿Ð¾Ð¿Ð°Ð´ÑÑ Ð·Ð½Ð°Ñение ÑÑнкÑии во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.ÐгÑаниÑÐµÐ½Ð¸Ñ ÑекÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑоÑÑÑми, инаÑе планиÑовÑик не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑÑиÑлиÑÑ, какие доÑеÑние ÑаблиÑÑ Ð½Ðµ нÑжно обÑабаÑÑваÑÑ. ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ ÑпиÑкам иÑполÑзÑйÑе пÑоÑÑÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° ÑавенÑÑва, а Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам â пÑоÑÑÑе пÑовеÑки диапазонов, подобнÑе показаннÑм в пÑимеÑÐ°Ñ . РекомендÑеÑÑÑ ÑоздаваÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑекÑий, ÑодеÑжаÑие ÑолÑко Ñакие ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÑекÑиониÑÑÑÑÐ¸Ñ ÑÑолбÑов Ñ ÐºÐ¾Ð½ÑÑанÑами, в коÑоÑÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ, поддеÑживаÑÑие B-деÑевÑÑ. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо в клÑÑе ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ ÑолÑко Ñакие ÑÑолбÑÑ, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¿ÑоиндекÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² B-деÑеве.
ÐÑи анализе Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑÑледÑÑÑÑÑ Ð²Ñе огÑаниÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð´Ð¾ÑеÑÐ½Ð¸Ñ ÑаблиÑ, оÑноÑÑÑÐ¸Ñ ÑÑ Ðº главной, Ñак ÑÑо пÑи болÑÑом Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑве вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ ÑÑÑаÑевÑий ваÑÐ¸Ð°Ð½Ñ ÑекÑиониÑованиÑ, оÑнованнÑй на наÑледовании, бÑÐ´ÐµÑ ÑабоÑаÑÑ Ñ Ð¾ÑоÑо, пока колиÑеÑÑво доÑеÑÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð½Ðµ пÑевÑÑÐ°ÐµÑ Ð¿ÑимеÑно ÑÑа; не пÑÑайÑеÑÑ Ð¿ÑименÑÑÑ ÐµÐ³Ð¾ Ñ ÑÑÑÑÑами доÑеÑÐ½Ð¸Ñ ÑаблиÑ.
5.12.6. РекомендаÑии по деклаÑаÑÐ¸Ð²Ð½Ð¾Ð¼Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ #
Ð ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ ÑледÑÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸ÑÑ Ð¿ÑодÑманно, Ñак как неÑдаÑное ÑеÑение Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑиÑаÑелÑно повлиÑÑÑ Ð½Ð° ÑкоÑоÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
Ðдним из ÑамÑÑ
важнÑÑ
ÑакÑоÑов ÑвлÑеÑÑÑ Ð²ÑÐ±Ð¾Ñ ÑÑолбÑа или ÑÑолбÑов, по коÑоÑÑм бÑдÑÑ ÑекÑиониÑоваÑÑÑÑ Ð²Ð°Ñи даннÑе. ЧаÑÑо опÑималÑнÑм бÑÐ´ÐµÑ ÑекÑиониÑование по ÑÑолбÑÑ Ð¸Ð»Ð¸ набоÑÑ ÑÑолбÑов, коÑоÑÑе пÑакÑиÑеÑки вÑегда пÑиÑÑÑÑÑвÑÑÑ Ð² пÑедложении WHERE в запÑоÑаÑ
, обÑаÑаÑÑиÑ
ÑÑ Ðº ÑекÑиониÑÑемой ÑаблиÑе. ÐÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, ÑовмеÑÑимÑе Ñ Ð¾Ð³ÑаниÑениÑми гÑÐ°Ð½Ð¸Ñ ÑекÑии, могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ ÑÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ½ÑжнÑÑ
Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа ÑекÑий. Ðднако налиÑие огÑаниÑений PRIMARY KEY или UNIQUE Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´ÑолкнÑÑÑ Ðº вÑбоÑÑ Ð¸ дÑÑгиÑ
ÑÑолбÑов в каÑеÑÑве ÑекÑиониÑÑÑÑиÑ
. Также пÑи планиÑовании ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑледÑÐµÑ Ð¿ÑодÑмаÑÑ, как бÑдÑÑ ÑдалÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе. СекÑÐ¸Ñ Ñеликом можно оÑÑоединиÑÑ Ð¾ÑÐµÐ½Ñ Ð±ÑÑÑÑо, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл ÑазÑабоÑаÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð¼Ð°ÑÑово ÑдалÑемÑе даннÑе оказÑвалиÑÑ Ð² одной ÑекÑии.
Также важно пÑавилÑно вÑбÑаÑÑ ÑиÑло ÑекÑий, на коÑоÑÑе бÑÐ´ÐµÑ ÑазбиваÑÑÑÑ ÑаблиÑа. ÐÑли иÑ
бÑÐ´ÐµÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно много, индекÑÑ Ð¾ÑÑанÑÑÑÑ Ð±Ð¾Ð»ÑÑими, не ÑлÑÑÑиÑÑÑ Ð¸ локалÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
, вÑледÑÑвие Ñего пÑоÑÐµÐ½Ñ Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ð¹ в ÐºÐµÑ Ð¾ÐºÐ°Ð¶ÐµÑÑÑ Ð½Ð¸Ð·ÐºÐ¸Ð¼. Ðднако и пÑи ÑлиÑком болÑÑом колиÑеÑÑве ÑекÑий Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿ÑоблемÑ. С болÑÑим колиÑеÑÑвом ÑекÑий ÑвелиÑиваеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ поÑÑебление памÑÑи как пÑи планиÑовании, Ñак и пÑи вÑполнении запÑоÑов, о ÑÑм ÑаÑÑказÑваеÑÑÑ Ð´Ð°Ð»ÐµÐµ. ÐÑбиÑÐ°Ñ ÑÑÑаÑÐµÐ³Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, Ñакже важно ÑÑиÑÑваÑÑ, какие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑоизойÑи в бÑдÑÑем. ÐапÑÐ¸Ð¼ÐµÑ ÐµÑли Ð²Ñ ÑеÑиÑе ÑоздаваÑÑ Ð¾ÑделÑнÑе ÑекÑии Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиенÑа, и в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ Ð²Ð°Ñ Ð²Ñего неÑколÑко болÑÑиÑ
клиенÑов, подÑмайÑе, ÑÑо бÑдеÑ, еÑли ÑеÑез неÑколÑко Ð»ÐµÑ Ñ Ð²Ð°Ñ Ð±ÑÐ´ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ мелкиÑ
клиенÑов. Ð ÑÑом ÑлÑÑае Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÑÑе пÑоизвеÑÑи ÑекÑиониÑование по Ñ
еÑÑ (HASH) и вÑбÑаÑÑ ÑазÑмное колиÑеÑÑво ÑекÑий, но не ÑоздаваÑÑ ÑекÑии по ÑпиÑÐºÑ (LIST) в надежде, ÑÑо колиÑеÑÑво клиенÑов не ÑвелиÑиÑÑÑ Ð´Ð¾ Ñакой ÑÑепени, ÑÑо ÑекÑиониÑование даннÑÑ
окажеÑÑÑ Ð½ÐµÐ¿ÑакÑиÑнÑм.
Ðложенное ÑекÑиониÑование позволÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑно ÑазделиÑÑ Ñе ÑекÑии, коÑоÑÑе пÑедположиÑелÑно окажÑÑÑÑ Ð±Ð¾Ð»ÑÑе дÑÑÐ³Ð¸Ñ . Также можно иÑполÑзоваÑÑ ÑекÑиониÑование по диапазонам Ñ ÐºÐ»ÑÑом, ÑоÑÑоÑÑим из неÑколÑÐºÐ¸Ñ ÑÑолбÑов. Ðо пÑи лÑбом из Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð² легко Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑÑÑ ÑлиÑком много ÑекÑий, Ñак ÑÑо ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¸Ñ Ð¾ÑмоÑÑиÑелÑно.
Ðажно ÑÑиÑÑваÑÑ Ð¸Ð·Ð´ÐµÑжки ÑекÑиониÑованиÑ, коÑоÑÑе оÑÑажаÑÑÑÑ Ð½Ð° планиÑовании и вÑполнении запÑоÑов. ÐланиÑовÑик запÑоÑов обÑÑно доволÑно Ð½ÐµÐ¿Ð»Ð¾Ñ Ð¾ ÑпÑавлÑеÑÑÑ Ñ Ð¸ÐµÑаÑÑ Ð¸Ñми, вклÑÑаÑÑими до неÑколÑÐºÐ¸Ñ ÑÑÑÑÑ ÑекÑий, еÑли пÑи вÑполнении ÑипиÑнÑÑ Ð·Ð°Ð¿ÑоÑов ÐµÐ¼Ñ ÑдаÑÑÑÑ Ð¾ÑÑеÑÑ Ð¿Ð¾ÑÑи вÑе ÑекÑии. Ðднако когда поÑле оÑÑеÑÐµÐ½Ð¸Ñ Ð¾ÑÑаÑÑÑÑ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво ÑекÑий, возÑаÑÑÐ°ÐµÑ Ð¸ вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, и обÑÑм поÑÑеблÑемой памÑÑи. ÐалиÑие болÑÑого колиÑеÑÑва ÑекÑий нежелаÑелÑно еÑÑ Ð¸ поÑомÑ, ÑÑо поÑÑебление памÑÑи ÑеÑвеÑом Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно возÑаÑÑаÑÑ Ñо вÑеменем, оÑобенно когда множеÑÑво ÑеанÑов обÑаÑаÑÑÑÑ ÐºÐ¾ множеÑÑÐ²Ñ ÑекÑий. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо в локалÑнÑÑ Ð¿Ð°Ð¼ÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑеанÑа, коÑоÑÑй обÑаÑаеÑÑÑ Ðº ÑекÑиÑм, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ð¼ÐµÑаданнÑе вÑÐµÑ ÑÑÐ¸Ñ ÑекÑий.
С нагÑÑзкой, пÑиÑÑÑей инÑоÑмаÑионнÑм Ñ ÑанилиÑам, Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл ÑоздаваÑÑ Ð±Ð¾Ð»ÑÑе ÑекÑий, Ñем Ñ Ð½Ð°Ð³ÑÑзкой OLTP. Ðак пÑавило, в инÑоÑмаÑионнÑÑ Ñ ÑанилиÑÐ°Ñ Ð²ÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа вÑоÑоÑÑепенно, Ñак как гоÑаздо болÑÑе вÑемени ÑÑаÑиÑÑÑ Ð½Ð° вÑполнение запÑоÑа. Ðднако пÑи лÑбом Ñипе нагÑÑзки важно пÑинимаÑÑ Ð¿ÑавилÑнÑе ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° Ñанней ÑÑадии ÑеализаÑии, Ñак как пÑоÑеÑÑ Ð¿ÐµÑеÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð±Ð¾Ð»ÑÑого обÑÑма Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑезвÑÑайно длиÑелÑнÑм. ÐÐ»Ñ Ð¾Ð¿ÑимизаÑии ÑÑÑаÑегии ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑедваÑиÑелÑно ÑмÑлиÑоваÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼ÑÑ Ð½Ð°Ð³ÑÑзкÑ. Ðо ни в коем ÑлÑÑае нелÑÐ·Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑ, ÑÑо Ñем болÑÑе ÑекÑий, Ñем лÑÑÑе, Ñавно как и наобоÑоÑ.