5.10. СекÑиониÑование
- 5.10.1. ÐбзоÑ
- 5.10.2. РеализаÑÐ¸Ñ ÑекÑиониÑованиÑ
- 5.10.3. УпÑавление ÑекÑиÑми
- 5.10.4. СекÑиониÑование и иÑклÑÑение по огÑаниÑениÑ
- 5.10.5. ÐлÑÑеÑнаÑивнÑе ваÑианÑÑ ÑекÑиониÑованиÑ
- 5.10.6. ÐгÑаниÑениÑ
- 5.10.2. РеализаÑÐ¸Ñ ÑекÑиониÑованиÑ
PostgreSQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑоÑÑое ÑекÑиониÑование ÑаблиÑ. Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ, как и поÑÐµÐ¼Ñ Ð±ÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑименÑÑÑ ÑекÑиониÑование пÑи пÑоекÑиÑовании баз даннÑÑ .
5.10.1. ÐбзоÑ
СекÑиониÑованием даннÑÑ Ð½Ð°Ð·ÑваеÑÑÑ Ñазбиение одной болÑÑой логиÑеÑкой ÑаблиÑÑ Ð½Ð° неÑколÑко менÑÑÐ¸Ñ ÑизиÑеÑÐºÐ¸Ñ ÑекÑий. СекÑиониÑование Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинеÑÑи ÑледÑÑÑÑÑ Ð¿Ð¾Ð»ÑзÑ:
РопÑеделÑннÑÑ ÑиÑÑаÑиÑÑ Ð¾Ð½Ð¾ каÑдиналÑно ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð±ÑÑÑÑодейÑÑвие, оÑобенно когда болÑÑой пÑоÑÐµÐ½Ñ ÑаÑÑо запÑаÑиваемÑÑ ÑÑÑок ÑаблиÑÑ Ð¾ÑноÑиÑÑÑ Ðº одной или лиÑÑ Ð½ÐµÑколÑким ÑекÑиÑм. СекÑиониÑование Ð¼Ð¾Ð¶ÐµÑ ÑÑгÑаÑÑ ÑÐ¾Ð»Ñ Ð²ÐµÐ´ÑÑÐ¸Ñ ÑÑолбÑов в индекÑÐ°Ñ , ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑменÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¸Ð½Ð´ÐµÐºÑа и ÑвелиÑÐ¸Ñ Ð²ÐµÑоÑÑноÑÑÑ Ð½Ð°Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ воÑÑÑебованнÑÑ ÑаÑÑей индекÑов в памÑÑи.
Ðогда в вÑбоÑке или изменении даннÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвована болÑÑÐ°Ñ ÑаÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑии, поÑледоваÑелÑное ÑканиÑование ÑÑой ÑекÑии Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем ÑлÑÑайнÑй доÑÑÑп по индекÑÑ Ðº даннÑм, ÑазбÑоÑаннÑм по вÑей ÑаблиÑе.
ÐаÑÑовÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ Ð¸ Ñдаление даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑÑеÑÑвлÑÑÑ, добавлÑÑ Ð¸ ÑдалÑÑ ÑекÑии, еÑли ÑÑо бÑло пÑедÑÑмоÑÑено пÑи пÑоекÑиÑовании ÑекÑий. ÐомандÑ
ALTER TABLE NO INHERITиDROP TABLEÑабоÑаÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем маÑÑÐ¾Ð²Ð°Ñ Ð·Ð°Ð³ÑÑзка. ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñакже полноÑÑÑÑ Ð¸ÑклÑÑаÑÑ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñе ÑаÑÑ Ð¾Ð´Ñ, ÑвÑзаннÑе Ñ Ð²Ñполнением опеÑаÑииVACUUMпоÑле командÑDELETE.Редко иÑполÑзÑемÑе даннÑе можно пеÑенеÑÑи на более деÑÑвÑе и медленнÑе ноÑиÑели.
ÐÑÑ ÑÑо обÑÑно полезно ÑолÑко Ð´Ð»Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑаблиÑ. Ðакие именно ÑаблиÑÑ Ð²ÑигÑаÑÑ Ð¾Ñ ÑекÑиониÑованиÑ, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного пÑиложениÑ, Ñ Ð¾ÑÑ, как пÑавило, ÑÑо ÑледÑÐµÑ Ð¿ÑименÑÑÑ Ð´Ð»Ñ ÑаблиÑ, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ Ð¿ÑевÑÑÐ°ÐµÑ Ð¾Ð±ÑÑм ÐÐУ ÑеÑвеÑа.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ PostgreSQL ÑеализÑÐµÑ ÑекÑиониÑование ÑÐ°Ð±Ð»Ð¸Ñ ÑеÑез Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ наÑледованиÑ. ÐÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑоздаваÑÑÑÑ ÐºÐ°Ðº ÐµÑ Ð´Ð¾ÑеÑнÑÑ ÑаблиÑа. Сама же ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа обÑÑно оÑÑаÑÑÑÑ Ð¿ÑÑÑой; она ÑÑÑеÑÑвÑÐµÑ ÑолÑко Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÑедÑÑавлÑÑÑ ÐµÐ´Ð¸Ð½Ñй Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑежде Ñем пÑиÑÑÑпиÑÑ Ðº изÑÑÐµÐ½Ð¸Ñ ÑекÑиониÑованиÑ, вам ÑледÑÐµÑ Ð¿Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸ÑÑÑÑ Ñ Ð½Ð°Ñледованием (Ñм. Раздел 5.9).
Ð PostgreSQL можно ÑеализоваÑÑ ÑледÑÑÑие ÑÐ¸Ð¿Ñ ÑекÑиониÑованиÑ:
- СекÑиониÑование по диапазонам
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ð¿Ð¾ «диапазонам», опÑеделÑннÑм по клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ Ð¸Ð»Ð¸ набоÑÑ ÑÑолбÑов, и не пеÑеÑекаÑÑимÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом. ÐапÑимеÑ, можно ÑекÑиониÑоваÑÑ Ð´Ð°Ð½Ð½Ñе по диапазонам Ð´Ð°Ñ Ð¸Ð»Ð¸ по диапазонам иденÑиÑикаÑоÑов опÑеделÑннÑÑ Ð±Ð¸Ð·Ð½ÐµÑ-обÑекÑов.
- СекÑиониÑование по ÑпиÑкÑ
ТаблиÑа ÑекÑиониÑÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпиÑка, Ñвно ÑказÑваÑÑего, какие знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑноÑиÑÑÑÑ Ðº каждой ÑекÑии.
5.10.2. РеализаÑÐ¸Ñ ÑекÑиониÑованиÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑекÑиониÑованнÑÑ ÑаблиÑÑ, вÑполниÑе ÑледÑÑÑее:
СоздайÑе «главнÑÑ» ÑаблиÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑой бÑдÑÑ ÑнаÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ñ Ð²Ñе ÑекÑии.
ÐÑа ÑаблиÑа не бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½ÑÑ . Ðе опÑеделÑйÑе Ð´Ð»Ñ Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¾Ð³ÑаниÑений, еÑли ÑолÑко Ð²Ñ Ð½Ðµ намеÑÐµÐ½Ñ Ð·Ð°Ñем Ñвно пÑодÑблиÑоваÑÑ Ð¸Ñ Ð²Ð¾ вÑÐµÑ ÑекÑиÑÑ . Также не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла опÑеделÑÑÑ Ð´Ð»Ñ Ð½ÐµÑ ÐºÐ°ÐºÐ¸Ðµ-либо индекÑÑ Ð¸Ð»Ð¸ огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи.
СоздайÑе неÑколÑко «доÑеÑÐ½Ð¸Ñ Â» ÑаблиÑ, ÑнаÑледовав Ð¸Ñ Ð²Ñе Ð¾Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹. ÐбÑÑно в ÑÐ°ÐºÐ¸Ñ ÑаблиÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑолбÑов, кÑоме ÑнаÑледованнÑÑ .
Ðалее Ð¼Ñ Ð±Ñдем назÑваÑÑ ÑÑи доÑеÑние ÑаблиÑÑ ÑекÑиÑми, Ñ Ð¾ÑÑ Ð¿Ð¾ ÑÑÑи они ниÑем не оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ PostgreSQL (и, возможно, ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑ).
ÐобавÑÑе в ÑаблиÑÑ-ÑекÑии огÑаниÑениÑ, опÑеделÑÑÑие допÑÑÑимÑе знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии.
ТипиÑнÑе пÑимеÑÑ ÑÐ°ÐºÐ¸Ñ Ð¾Ð³ÑаниÑений:
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.
ÐамеÑÑÑе, ÑÑо Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ ÑинÑакÑиÑеÑÐºÐ¸Ñ Ð¾ÑлиÑий Ð¼ÐµÐ¶Ð´Ñ ÑекÑиониÑованием по диапазонам и по ÑпиÑÐºÑ Ð·Ð½Ð°Ñений неÑ; ÑÑи ÑÐ¸Ð¿Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии ÑоздайÑе Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ клÑÑÐµÐ²Ð¾Ð¼Ñ ÑÑолбÑÑ(ам), а Ñакже лÑбÑе дÑÑгие индекÑÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ ÑÑмоÑÑениÑ. (ÐÐ½Ð´ÐµÐºÑ Ð¿Ð¾ клÑÑÑ, ÑÑÑого говоÑÑ, не Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼, но в болÑÑинÑÑве ÑлÑÑаев он бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½. ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа бÑли ÑникалÑнÑ, вам ÑледÑÐµÑ Ñакже ÑоздаÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи или пеÑвиÑного клÑÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии.)
ÐополниÑелÑно Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð¸Ð»Ð¸ пÑавило Ð´Ð»Ñ Ð¿ÐµÑенапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , добавлÑемÑÑ Ð² главнÑÑ ÑаблиÑÑ, в ÑооÑвеÑÑÑвÑÑÑÑÑ ÑекÑиÑ.
УбедиÑеÑÑ Ð² Ñом, ÑÑо паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии constraint_exclusion не вÑклÑÑен в
postgresql.conf. ÐнаÑе запÑоÑÑ Ð½Ðµ бÑдÑÑ Ð¾Ð¿ÑимизиÑоваÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом.
ÐапÑимеÑ, пÑедположим, ÑÑо Ð¼Ñ ÑоздаÑм Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑой компании, ÑоÑгÑÑÑей моÑоженÑм. ÐÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ ÑÑиÑÑÐ²Ð°ÐµÑ Ð¼Ð°ÐºÑималÑнÑÑ ÑемпеÑаÑÑÑÑ Ð¸ пÑодажи моÑоженого каждÑй Ð´ÐµÐ½Ñ Ð² ÑазÑезе Ñегионов. Ðо ÑÑÑи нам нÑжна ÑледÑÑÑÐ°Ñ ÑаблиÑа:
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
);ÐÑ Ð·Ð½Ð°ÐµÐ¼, ÑÑо болÑÑинÑÑво запÑоÑов бÑдÑÑ ÑабоÑаÑÑ ÑолÑко Ñ Ð´Ð°Ð½Ð½Ñми за поÑледнÑÑ Ð½ÐµÐ´ÐµÐ»Ñ, меÑÑÑ Ð¸Ð»Ð¸ кваÑÑал, Ñак как в оÑновном ÑÑа ÑаблиÑа нÑжна Ð´Ð»Ñ ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑекÑÑÐ¸Ñ Ð¾ÑÑÑÑов Ð´Ð»Ñ ÑÑководÑÑва. ЧÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ Ð¾Ð±ÑÑм Ñ ÑанÑÑÐ¸Ñ ÑÑ ÑÑаÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , Ð¼Ñ ÑеÑили оÑÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе ÑолÑко за 3 поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð³Ð¾Ð´Ð°. ÐенÑжнÑе даннÑе Ð¼Ñ Ð±Ñдем ÑдалÑÑÑ Ð² наÑале каждого меÑÑÑа.
ÐÑи ÑÐ°ÐºÐ¸Ñ ÑÑловиÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑимениÑÑ ÑекÑиониÑование Ð´Ð»Ñ ÑдовлеÑвоÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð½Ð°ÑÐ¸Ñ Ð¿Ð¾ÑÑебноÑÑей. ÐаÑÑÑоиÑÑ ÑекÑиониÑование ÑоглаÑно пÑиведÑнной вÑÑе поÑледоваÑелÑноÑÑи дейÑÑвий можно ÑледÑÑÑим обÑазом:
ÐÐ»Ð°Ð²Ð½Ð°Ñ ÑаблиÑа, названнаÑ
measurement, бÑÐ´ÐµÑ Ð¾Ð±ÑÑвлена в ÑоÑноÑÑи как показано вÑÑе.ÐаÑем Ð¼Ñ ÑоздаÑм оÑделÑнÑе ÑекÑии Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ нÑжного нам меÑÑÑа:
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);
ÐÑе ÑÑи ÑекÑии ÑвлÑÑÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑамоÑÑоÑÑелÑнÑми ÑаблиÑами, но они наÑледÑÑÑ Ñвои опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ñ ÑаблиÑÑ
measurement.ÐÑо ÑеÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ Ð¸Ð· наÑÐ¸Ñ Ð¿Ñоблем: Ñдаление ÑÑаÑÑÑ Ð´Ð°Ð½Ð½ÑÑ . ÐаждÑй меÑÑÑ Ð½Ð°Ð¼ нÑжно бÑÐ´ÐµÑ Ð¿ÑоÑÑо вÑполнÑÑÑ
DROP TABLEÐ´Ð»Ñ Ñамой ÑÑаÑой доÑеÑней ÑаблиÑÑ Ð¸ ÑоздаваÑÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¾ÑеÑнÑÑ ÑаблиÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ меÑÑÑа.ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделиÑÑ Ð½ÐµÐ¿ÐµÑеÑекаÑÑиеÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑаблиÑ. Таким обÑазом, ÑкÑÐ¸Ð¿Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ не пÑоÑÑо ÑоздаваÑÑ ÑекÑии, но еÑÑ Ð¸ задаваÑÑ Ð¾Ð³ÑаниÑениÑ:
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ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑекÑий.ХоÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ñложнее, Ñем ваÑÐ¸Ð°Ð½Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑекÑÑим меÑÑÑем, ÐµÑ Ð½Ðµ пÑидÑÑÑÑ Ñак ÑаÑÑо модиÑиÑиÑоваÑÑ, Ñак как веÑви ÑÑловий можно добавиÑÑ Ð·Ð°Ñанее.
ÐÑимеÑание
Ðа пÑакÑике бÑÐ´ÐµÑ Ð»ÑÑÑе ÑнаÑала пÑовеÑÑÑÑ ÑÑловие Ð´Ð»Ñ Ð¿Ð¾Ñледней ÑекÑии, еÑли ÑÑÑоки ÑаÑе добавлÑÑÑÑÑ Ð² ÑÑÑ ÑекÑиÑ. ÐÐ»Ñ Ð¿ÑоÑÑоÑÑ Ð¶Ðµ Ð¼Ñ ÑаÑположили пÑовеÑки ÑÑиггеÑа в Ñом же поÑÑдке, ÑÑо и в дÑÑÐ³Ð¸Ñ ÑÑагменÑÐ°Ñ ÐºÐ¾Ð´Ð° Ð´Ð»Ñ ÑÑого пÑимеÑа.
Ðак Ñже можно понÑÑÑ, Ð´Ð»Ñ ÑеализаÑии Ñложной ÑÑ ÐµÐ¼Ñ ÑÐ°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ DDL-код знаÑиÑелÑного обÑÑма. Рданном пÑимеÑе нам поÑÑебÑеÑÑÑ ÑоздаваÑÑ ÑекÑÐ¸Ñ ÐºÐ°Ð¶Ð´Ñй меÑÑÑ, Ñак ÑÑо бÑло Ð±Ñ ÑазÑмно напиÑаÑÑ ÑкÑипÑ, коÑоÑÑй Ð±Ñ ÑоÑмиÑовал ÑÑебÑемÑй код DDL авÑомаÑиÑеÑки.
5.10.3. УпÑавление ÑекÑиÑми
ÐбÑÑно Ð½Ð°Ð±Ð¾Ñ ÑекÑий, обÑазованнÑй изнаÑалÑно пÑи Ñоздании ÑаблиÑ, не пÑедполагаеÑÑÑ ÑÐ¾Ñ ÑанÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм. ЧаÑе наобоÑоÑ, планиÑÑеÑÑÑ ÑдалÑÑÑ ÑÑаÑÑе ÑекÑии даннÑÑ Ð¸ пеÑиодиÑеÑки добавлÑÑÑ Ð½Ð¾Ð²Ñе. Ðдно из наиболее важнÑÑ Ð¿ÑеимÑÑеÑÑв ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в Ñом, ÑÑо оно позволÑÐµÑ Ð¿ÑакÑиÑеÑки моменÑалÑно вÑполнÑÑÑ ÑÑÑдоÑмкие опеÑаÑии, изменÑÑ ÑÑÑÑкÑÑÑÑ ÑекÑий, а не ÑизиÑеÑки пеÑемеÑÐ°Ñ Ð±Ð¾Ð»ÑÑие обÑÑÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ .
СамÑй лÑгкий ÑпоÑоб ÑдалиÑÑ ÑÑаÑÑе даннÑе â ÑÑо пÑоÑÑо ÑдалиÑÑ ÑекÑиÑ, ÑÑавÑÑÑ Ð½ÐµÐ½Ñжной:
DROP TABLE measurement_y2006m02;
Так можно ÑдалиÑÑ Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ñ Ð·Ð°Ð¿Ð¸Ñей гоÑаздо бÑÑÑÑее, Ñем ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ ÑдалÑÑÑ Ð¸Ñ Ð¿Ð¾ одной.
ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑаÑÑо более пÑедпоÑÑиÑелÑнÑй ваÑÐ¸Ð°Ð½Ñ â ÑбÑаÑÑ ÑекÑÐ¸Ñ Ð¸Ð· главной ÑаблиÑÑ, но ÑÐ¾Ñ ÑаниÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ней как к ÑамоÑÑоÑÑелÑной ÑаблиÑе:
ALTER TABLE measurement_y2006m02 NO INHERIT measurement;
ÐÑи ÑÑом можно бÑÐ´ÐµÑ Ð¿ÑодолжаÑÑ ÑабоÑаÑÑ Ñ Ð´Ð°Ð½Ð½Ñми, пока ÑаблиÑа не бÑÐ´ÐµÑ Ñдалена. ÐапÑимеÑ, в ÑÑом ÑоÑÑоÑнии оÑÐµÐ½Ñ ÐºÑÑаÑи бÑÐ´ÐµÑ ÑделаÑÑ ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, иÑполÑзÑÑ COPY, pg_dump или подобнÑе ÑÑедÑÑва. Ðозможно, ÑÑи даннÑе Ñакже можно бÑÐ´ÐµÑ Ð°Ð³ÑегиÑоваÑÑ, пеÑевеÑÑи в компакÑнÑй ÑоÑмаÑ, вÑполниÑÑ Ð´ÑÑгÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¸Ð»Ð¸ поÑÑÑоиÑÑ Ð¾ÑÑÑÑÑ.
ÐналогиÑнÑм обÑазом можно добавлÑÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ñ Ð´Ð°Ð½Ð½Ñми. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð¿ÑÑÑÑÑ ÑекÑÐ¸Ñ Ð² главной ÑаблиÑе Ñак же, как Ð¼Ñ Ñоздавали ÑекÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ ÑоÑÑоÑнии до ÑÑого:
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.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 во вÑеÑ
запÑоÑаÑ
, даже в ÑамÑÑ
пÑоÑÑÑÑ
, где иÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑла.
5.10.5. ÐлÑÑеÑнаÑивнÑе ваÑианÑÑ ÑекÑиониÑованиÑ
ÐÑÑгой ÑпоÑоб пеÑенапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ ÑÑÑок в ÑооÑвеÑÑÑвÑÑÑÑÑ ÑекÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеализоваÑÑ, опÑеделив Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑаблиÑÑ Ð½Ðµ ÑÑиггеÑ, а пÑавила. ÐапÑимеÑ:
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 не оÑменÑÐµÑ ÑÑиггеÑÑ, Ñак ÑÑо Ñ ÑÑиггеÑами Ð²Ñ ÑможеÑе иÑполÑзоваÑÑ ÐµÑ Ð¾Ð±ÑÑнÑм обÑазом.
ÐÑÑ Ð¾Ð´Ð¸Ð½ недоÑÑаÑок Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° Ñ Ð¿Ñавилами ÑвÑзан Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли добавлÑÐµÐ¼Ð°Ñ ÑÑÑока не Ð¿Ð¾Ð´Ð¿Ð°Ð´Ð°ÐµÑ Ð½Ð¸ под одно из пÑавил; в ÑÑом ÑлÑÑае даннÑе пÑоÑÑо попадÑÑ Ð² главнÑÑ ÑаблиÑÑ.
СекÑиониÑование можно Ñакже ÑеализоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ UNION ALL вмеÑÑо наÑледованиÑ. ÐапÑимеÑ:
CREATE VIEW measurement AS
SELECT * FROM measurement_y2006m02
UNION ALL SELECT * FROM measurement_y2006m03
...
UNION ALL SELECT * FROM measurement_y2007m11
UNION ALL SELECT * FROM measurement_y2007m12
UNION ALL SELECT * FROM measurement_y2008m01;Ðднако Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñа ÑекÑий в ÑÑом ÑлÑÑае пÑидÑÑÑÑ Ð½Ðµ ÑолÑко добавлÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑ ÑекÑии, но и пеÑеÑоздаваÑÑ Ð¿ÑедÑÑавление. Ðа пÑакÑике ÑÑÐ¾Ñ Ð¼ÐµÑод не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑиÑелÑнÑÑ Ð¿ÑеимÑÑеÑÑв по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð½Ð°Ñледованием.
5.10.6. ÐгÑаниÑениÑ
С ÑекÑиониÑованнÑми ÑаблиÑами ÑвÑÐ·Ð°Ð½Ñ ÑледÑÑÑие огÑаниÑениÑ:
СиÑÑема не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑиÑÑ Ð°Ð²ÑомаÑиÑеÑки, ÑвлÑÑÑÑÑ Ð»Ð¸ вÑе огÑаниÑениÑ
CHECKвзаимно иÑклÑÑаÑÑими. ÐоÑÑÐ¾Ð¼Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñнее бÑÐ´ÐµÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð¸ оÑладиÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑекÑий и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸/или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвÑзаннÑÑ Ð¾Ð±ÑекÑов, Ñем делаÑÑ ÑÑо вÑÑÑнÑÑ.ÐоказаннÑе здеÑÑ ÑÑ ÐµÐ¼Ñ Ð¿Ð¾Ð´ÑазÑмеваÑÑ, ÑÑо клÑÑевой ÑÑолбеÑ(Ñ) ÑекÑии в ÑÑÑоке никогда не менÑеÑÑÑ, или менÑеÑÑÑ Ð½Ðµ наÑÑолÑко, ÑÑÐ¾Ð±Ñ ÑÑÑÐ¾ÐºÑ Ð¿Ð¾ÑÑебовалоÑÑ Ð¿ÐµÑенеÑÑи в дÑÑгÑÑ ÑекÑиÑ. ÐÑли же попÑÑаÑÑÑÑ Ð²ÑполниÑÑ Ñакой опеÑаÑоÑ
UPDATE, пÑоизойдÑÑ Ð¾Ñибка из-за наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑениÑCHECK. ÐÑли вам нÑжно обÑабоÑаÑÑ Ð¸ Ñакие ÑлÑÑаи, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑÑиггеÑÑ Ð½Ð° обновление в ÑаблиÑÑ-ÑекÑии, но ÑÑо еÑÑ Ð±Ð¾Ð»ÑÑе ÑÑÐ»Ð¾Ð¶Ð½Ð¸Ñ ÑпÑавление вÑей конÑÑÑÑкÑией.ÐÑли Ð²Ñ Ð²ÑполнÑеÑе командÑ
VACUUMилиANALYZEвÑÑÑнÑÑ, не забÑвайÑе, ÑÑо Ð¸Ñ Ð½Ñжно запÑÑкаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии в оÑделÑноÑÑи. ÐомандаANALYZE measurement;
обÑабоÑÐ°ÐµÑ ÑолÑко главнÑÑ ÑаблиÑÑ.
ÐпеÑаÑоÑÑ
INSERTÑ Ð¿ÑедложениÑмиON CONFLICTÑкоÑее вÑего не бÑдÑÑ ÑабоÑаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм обÑазом, Ñак как дейÑÑвиеON CONFLICTпÑедпÑинимаеÑÑÑ ÑолÑко в ÑлÑÑае наÑÑÑений ÑникалÑноÑÑи в Ñказанном Ñелевом оÑноÑении, а не его доÑеÑÐ½Ð¸Ñ Ð¾ÑноÑениÑÑ .
ÐÑименÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑениÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑиÑÑваÑÑ ÑледÑÑÑее:
ÐÑклÑÑение по огÑаниÑÐµÐ½Ð¸Ñ ÑабоÑÐ°ÐµÑ ÑолÑко когда пÑедложение
WHEREв запÑоÑе ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð½ÑÑанÑÑ (или полÑÑаемÑе извне паÑамеÑÑÑ). ÐапÑимеÑ, ÑÑавнение Ñ ÑÑнкÑией пеÑеменной пÑиÑодÑ, Ñакой какCURRENT_TIMESTAMP, нелÑÐ·Ñ Ð¾Ð¿ÑимизиÑоваÑÑ, Ñак как планиÑовÑик не знаеÑ, в какÑÑ ÑекÑÐ¸Ñ Ð¿Ð¾Ð¿Ð°Ð´ÑÑ Ð·Ð½Ð°Ñение ÑÑнкÑии во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.ÐгÑаниÑÐµÐ½Ð¸Ñ ÑекÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑоÑÑÑми, инаÑе планиÑовÑик не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑÑиÑлиÑÑ, какие ÑекÑии не нÑжно обÑабаÑÑваÑÑ. ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ ÑпиÑÐºÑ Ð¸ÑполÑзÑйÑе пÑоÑÑÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ð° ÑавенÑÑва, а Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам â пÑоÑÑÑе пÑовеÑки диапазонов, подобнÑе показаннÑм в пÑимеÑÐ°Ñ . РекомендÑеÑÑÑ ÑоздаваÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑекÑий, ÑодеÑжаÑие ÑолÑко Ñакие ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÑекÑиониÑÑÑÑÐ¸Ñ ÑÑолбÑов Ñ ÐºÐ¾Ð½ÑÑанÑами, в коÑоÑÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ, поддеÑживаÑÑие B-деÑевÑÑ.
ÐÑи анализе Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ огÑаниÑÐµÐ½Ð¸Ñ Ð¸ÑÑледÑÑÑÑÑ Ð²Ñе огÑаниÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ ÑекÑий главной ÑаблиÑÑ, поÑÑÐ¾Ð¼Ñ Ð¿Ñи болÑÑом колиÑеÑÑве ÑекÑий вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑÑÑ. ÐпиÑаннÑе вÑÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ ÑабоÑаÑÑ Ñ Ð¾ÑоÑо, пока колиÑеÑÑво ÑекÑий не пÑевÑÑÐ°ÐµÑ Ð¿ÑимеÑно ÑÑа, но не пÑÑайÑеÑÑ Ð¿ÑименÑÑÑ Ð¸Ñ Ñ ÑÑÑÑÑами ÑекÑий.