66.2. TOAST #
Рданном Ñазделе ÑаÑÑмаÑÑиваеÑÑÑ TOAST (The Oversized-Attribute Storage Technique, ÐеÑодика Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑвеÑÑ Ð±Ð¾Ð»ÑÑÐ¸Ñ Ð°ÑÑибÑÑов).
PostgreSQL иÑполÑзÑÐµÑ ÑикÑиÑованнÑй ÑÐ°Ð·Ð¼ÐµÑ ÑÑÑаниÑÑ (обÑÑно 8 ÐÐ), и не позволÑÐµÑ ÐºÐ¾ÑÑежам занимаÑÑ Ð½ÐµÑколÑко ÑÑÑаниÑ. ÐоÑÑÐ¾Ð¼Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ ÑаниÑÑ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ невозможно. ÐÐ»Ñ Ð¿ÑÐµÐ¾Ð´Ð¾Ð»ÐµÐ½Ð¸Ñ ÑÑого огÑаниÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑие знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ ÑжимаÑÑÑÑ Ð¸/или ÑазбиваÑÑÑÑ Ð½Ð° неÑколÑко ÑизиÑеÑÐºÐ¸Ñ ÑÑÑок. ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð½ÐµÐ·Ð°Ð¼ÐµÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ на болÑÑÑÑ ÑаÑÑÑ ÐºÐ¾Ð´Ð° ÑеÑвеÑа влиÑÐµÑ Ð½ÐµÐ·Ð½Ð°ÑиÑелÑно. ÐÑÐ¾Ñ Ð¼ÐµÑод извеÑÑен как TOAST (ÑоÑÑ, или «лÑÑÑее поÑле изобÑеÑÐµÐ½Ð¸Ñ Ð½Ð°Ñезанного Ñ Ð»ÐµÐ±Ð°Â»). ÐнÑÑаÑÑÑÑкÑÑÑа TOAST Ñакже пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии обÑабоÑки болÑÑÐ¸Ñ Ð·Ð½Ð°Ñений даннÑÑ Ð² памÑÑи.
ÐиÑÑ Ð¾Ð¿ÑеделÑннÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
поддеÑживаÑÑ TOAST â Ð½ÐµÑ ÑмÑÑла пÑоизводиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дейÑÑÐ²Ð¸Ñ Ñ Ñипами даннÑÑ
, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ
не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑим. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ TOAST, Ñип даннÑÑ
должен пÑедÑÑавлÑÑÑ Ð·Ð½Ð°Ñение пеÑеменной Ð´Ð»Ð¸Ð½Ñ (varlena), в коÑоÑом пеÑвое ÑеÑÑÑÑÑ
байÑовое Ñлово лÑбого Ñ
ÑанÑÑегоÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±ÑÑÑ Ð´Ð»Ð¸Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² байÑаÑ
(вклÑÑÐ°Ñ Ñамо ÑÑо Ñлово). СодеÑжание оÑÑавÑейÑÑ ÑаÑÑи знаÑÐµÐ½Ð¸Ñ TOAST не огÑаниÑиваеÑ. СпеÑиалÑнÑе пÑедÑÑавлениÑ, в Ñелом назÑваемÑе знаÑениÑми в ÑоÑмаÑе TOAST, ÑабоÑаÑÑ, манипÑлиÑÑÑ ÑÑим наÑалÑнÑм Ñловом Ð´Ð»Ð¸Ð½Ñ Ð¸ инÑеÑпÑеÑиÑÑÑ ÐµÐ³Ð¾ по-ÑвоемÑ. Таким обÑазом, ÑÑнкÑии ÑÑÐ¾Ð²Ð½Ñ C, ÑабоÑаÑÑие Ñ Ñипом даннÑÑ
, поддеÑживаÑÑим TOAST, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð°ÐºÐºÑÑаÑно обÑаÑаÑÑÑÑ Ñо вÑ
однÑми знаÑениÑми, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð² ÑоÑмаÑе TOAST: вÑ
однÑе даннÑе могÑÑ Ð¸ не ÑодеÑжаÑÑ ÑеÑÑÑÑÑ
байÑовое Ñлово Ð´Ð»Ð¸Ð½Ñ Ð¸ ÑодеÑжимое поÑле него, пока не бÑдÑÑ ÑаÑпакованÑ. (ÐбÑÑно в ÑакиÑ
ÑиÑÑаÑиÑÑ
нÑжно иÑполÑзоваÑÑ Ð¼Ð°ÐºÑÐ¾Ñ PG_DETOAST_DATUM пÑежде Ñем ÑÑо-либо делаÑÑ Ñ Ð²Ñ
однÑм знаÑением, но в некоÑоÑÑÑ
ÑлÑÑаÑÑ
Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¸ более ÑÑÑекÑивнÑе подÑ
одÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 36.13.1.)
TOAST Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° биÑа Ñлова Ð´Ð»Ð¸Ð½Ñ varlena (ÑÑаÑÑие биÑÑ Ð½Ð° маÑÐ¸Ð½Ð°Ñ Ñ Ð¿Ð¾ÑÑдком Ð±Ð°Ð¹Ñ Ð¾Ñ ÑÑаÑÑего к младÑемÑ, или младÑие биÑÑ â пÑи дÑÑгом поÑÑдке байÑ), Ñаким обÑазом, логиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ Ð»Ñбого знаÑÐµÐ½Ð¸Ñ Ð² ÑоÑмаÑе TOAST огÑаниÑиваеÑÑÑ 1 ÐигабайÑом (230 - 1 байÑ). Ðогда оба биÑа ÑÐ°Ð²Ð½Ñ Ð½ÑлÑ, знаÑение ÑвлÑеÑÑÑ Ð¾Ð±ÑÑнÑм, не в ÑоÑмаÑе TOAST, и оÑÑавÑиеÑÑ Ð±Ð¸ÑÑ Ñлова Ð´Ð»Ð¸Ð½Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð±Ñий ÑÐ°Ð·Ð¼ÐµÑ ÑлеменÑа даннÑÑ (вклÑÑÐ°Ñ Ñлово длинÑ) в байÑÐ°Ñ . Ðогда ÑÑÑановлен ÑÑаÑÑий (или младÑий, в завиÑимоÑÑи Ð¾Ñ Ð°ÑÑ Ð¸ÑекÑÑÑÑ) биÑ, знаÑение Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð½Ð¾Ð±Ð°Ð¹ÑовÑй заголовок вмеÑÑо обÑÑного ÑеÑÑÑÑÑ Ð±Ð°Ð¹Ñового, а оÑÑавÑиеÑÑ Ð±Ð¸ÑÑ ÑÑого байÑа задаÑÑ Ð¾Ð±Ñий ÑÐ°Ð·Ð¼ÐµÑ ÑлеменÑа даннÑÑ (вклÑÑÐ°Ñ Ð±Ð°Ð¹Ñ Ð´Ð»Ð¸Ð½Ñ) в байÑÐ°Ñ . ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ñкономно Ñ ÑаниÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑе 127 Ð±Ð°Ð¹Ñ Ð¸ пÑи ÑÑом допÑÑÐºÐ°ÐµÑ ÑаÑÑиÑение знаÑÐµÐ½Ð¸Ñ ÑÑого Ñипа даннÑÑ Ð´Ð¾ 1 ÐбайÑа пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи. ÐнаÑÐµÐ½Ð¸Ñ Ñ Ð¾Ð´Ð½Ð¾Ð±Ð°Ð¹ÑовÑми заголовками не вÑÑавниваÑÑÑÑ Ð¿Ð¾ какой-либо опÑеделÑнной гÑаниÑе, Ñогда как знаÑÐµÐ½Ð¸Ñ Ñ ÑеÑÑÑÑÑ Ð±Ð°Ð¹ÑовÑми заголовками вÑÑавниваÑÑÑÑ Ð¿Ð¾ гÑаниÑе минимÑм ÑеÑÑÑÑÑ Ð±Ð°Ð¹Ñ; ÑÑо избавление Ð¾Ñ Ð²ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй вÑигÑÑÑ Ð² обÑÑме, оÑÐµÐ½Ñ Ð¾ÑÑÑимÑй Ð´Ð»Ñ ÐºÐ¾ÑоÑÐºÐ¸Ñ Ð·Ð½Ð°Ñений. РкаÑеÑÑве оÑобого ÑлÑÑаÑ, еÑли вÑе оÑÑавÑиеÑÑ Ð±Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð±Ð°Ð¹Ñового заголовка ÑÐ°Ð²Ð½Ñ Ð½ÑÐ»Ñ (ÑÑо в пÑинÑипе невозможно Ñ ÑÑÑÑом вклÑÑÐµÐ½Ð¸Ñ ÑазмеÑа длинÑ), знаÑением ÑвлÑеÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° оÑделÑно ÑазмеÑÑннÑе даннÑе, Ñ Ð½ÐµÑколÑкими возможнÑми ваÑианÑами, опиÑаннÑми ниже. Тип и ÑÐ°Ð·Ð¼ÐµÑ Ñакого ÑказаÑÐµÐ»Ñ TOAST опÑеделÑеÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼, Ñ ÑанÑÑимÑÑ Ð²Ð¾ вÑоÑом байÑе знаÑениÑ. ÐаконеÑ, когда ÑÑаÑÑий (или младÑий, в завиÑимоÑÑи Ð¾Ñ Ð°ÑÑ Ð¸ÑекÑÑÑÑ) Ð±Ð¸Ñ Ð¾ÑиÑен, а ÑоÑедний Ð±Ð¸Ñ ÑÑÑановлен, ÑодеÑжимое даннÑÑ Ñ ÑаниÑÑÑ Ð² Ñпакованном виде и должно бÑÑÑ ÑаÑпаковано пеÑед иÑполÑзованием. Ð ÑÑом ÑлÑÑае оÑÑавÑиеÑÑ Ð±Ð¸ÑÑ ÑеÑÑÑÑÑ Ð±Ð°Ð¹Ñового Ñлова Ð´Ð»Ð¸Ð½Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð±Ñий ÑÐ°Ð·Ð¼ÐµÑ ÑжаÑÑÑ , а не иÑÑ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ . ÐамеÑÑÑе, ÑÑо ÑжаÑие Ñакже возможно и Ð´Ð»Ñ Ð¾ÑделÑннÑÑ Ð´Ð°Ð½Ð½ÑÑ , но заголовок varlena не говоÑиÑ, Ð¸Ð¼ÐµÐµÑ Ð»Ð¸ оно меÑÑо â ÑÑо опÑеделÑеÑÑÑ ÑодеÑжимÑм, на коÑоÑое ÑказÑÐ²Ð°ÐµÑ ÑказаÑÐµÐ»Ñ TOAST.
ÐеÑод, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ ÑжаÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑи внÑÑÑеннем и внеÑнем Ñ
Ñанении, можно вÑбÑаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ оÑделÑного ÑÑолбÑа, задав паÑамеÑÑ COMPRESSION в команде CREATE TABLE или ALTER TABLE. ÐÑли меÑод ÑжаÑÐ¸Ñ Ð´Ð»Ñ ÑÑолбÑа не задан ÑвнÑм обÑазом, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ñи вÑÑавке даннÑÑ
бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¼ÐµÑод из паÑамеÑÑа default_toast_compression.
Ðак Ñже бÑло Ñказано, ÑÑÑеÑÑвÑÑÑ ÑазнÑе ваÑианÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑказаÑÐµÐ»Ñ TOAST. СамÑй ÑÑаÑÑй и наиболее попÑлÑÑнÑй ваÑÐ¸Ð°Ð½Ñ â когда он ÑказÑÐ²Ð°ÐµÑ Ð½Ð° оÑделÑннÑе даннÑе, ÑазмеÑÑннÑе в TOAST-ÑаблиÑе, коÑоÑÐ°Ñ Ð¾Ñделена, но ÑвÑзана Ñ ÑаблиÑей, ÑодеÑжаÑей ÑобÑÑвенно ÑказаÑÐµÐ»Ñ Ð´Ð°Ð½Ð½ÑÑ
TOAST. Такой ÑказаÑÐµÐ»Ñ Ð½Ð° даннÑе на диÑке ÑоздаÑÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼ обÑабоÑки TOAST (в access/common/toast_internals.c), когда коÑÑеж, ÑоÑ
ÑанÑемÑй на диÑк, оказÑваеÑÑÑ ÑлиÑком болÑÑим. ÐополниÑелÑнÑе подÑобноÑÑи опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 66.2.1. ÐÑоме Ñого, ÑказаÑÐµÐ»Ñ TOAST Ð¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑ Ð½Ð° оÑделÑннÑе даннÑе, ÑазмеÑÑннÑе где-Ñо в памÑÑи. Такие даннÑе обÑзаÑелÑно недолговÑеменнÑе и никогда не оказÑваÑÑÑÑ Ð½Ð° диÑке, но ÑÑÐ¾Ñ Ð¼ÐµÑ
анизм оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ избÑÑоÑной обÑабоÑки даннÑÑ
болÑÑого ÑазмеÑа. ÐополниÑелÑнÑе подÑобноÑÑи опиÑÐ°Ð½Ñ Ð² ÐодÑазделе 66.2.2.
66.2.1. ÐÑделÑное ÑазмеÑение TOAST на диÑке #
ÐÑли какие-либо ÑÑолбÑÑ ÑаблиÑÑ Ñ
ÑанÑÑÑÑ Ð² ÑоÑмаÑе TOAST, Ñ ÑаблиÑÑ Ð±ÑÐ´ÐµÑ ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñ Ð½ÐµÐ¹ ÑаблиÑа TOAST, OID коÑоÑой Ñ
ÑаниÑÑÑ Ð² знаÑении pg_class.reltoastrelid Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ. РазмеÑаемÑе на диÑке TOAST-знаÑÐµÐ½Ð¸Ñ ÑодеÑжаÑÑÑ Ð² ÑаблиÑе TOAST, ÑÑо подÑобнее опиÑано ниже.
ÐÑделÑннÑе знаÑÐµÐ½Ð¸Ñ Ð´ÐµÐ»ÑÑÑÑ Ð½Ð° поÑÑии (поÑле ÑжаÑиÑ, еÑли оно пÑименÑеÑÑÑ) ÑазмеÑом не более TOAST_MAX_CHUNK_SIZE Ð±Ð°Ð¹Ñ (по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑо знаÑение вÑбиÑаеÑÑÑ Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð½Ð° ÑÑÑаниÑе помеÑалиÑÑ ÑеÑÑÑе ÑÑÑоки поÑÑий, Ñо еÑÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑоÑÑавлÑÐµÑ Ð¿Ð¾ÑÑдка 2000 байÑ). ÐÐ°Ð¶Ð´Ð°Ñ Ð¿Ð¾ÑÑÐ¸Ñ Ñ
ÑаниÑÑÑ ÐºÐ°Ðº оÑделÑÐ½Ð°Ñ ÑÑÑока в ÑаблиÑе TOAST, пÑинадлежаÑей иÑÑ
одной ÑаблиÑе-владелÑÑÑ. ÐÐ°Ð¶Ð´Ð°Ñ ÑаблиÑа TOAST Ð¸Ð¼ÐµÐµÑ ÑÑолбÑÑ chunk_id (OID, иденÑиÑиÑиÑÑÑÑий конкÑеÑное TOAST-знаÑение), chunk_seq (поÑледоваÑелÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð´Ð»Ñ Ð¿Ð¾ÑÑии внÑÑÑи знаÑениÑ) и chunk_data (ÑакÑиÑеÑкие даннÑе поÑÑии). УникалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ chunk_id и chunk_seq обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð±ÑÑÑÑÑÑ Ð²ÑдаÑÑ Ð·Ð½Ð°Ñений. Таким обÑазом, в ÑказаÑеле, пÑедÑÑавлÑÑÑем оÑделÑно ÑазмеÑаемое на диÑке знаÑение TOAST, должно Ñ
ÑаниÑÑÑÑ OID ÑаблиÑÑ TOAST, к коÑоÑой нÑжно обÑаÑаÑÑÑÑ, и OID опÑеделÑнного знаÑÐµÐ½Ð¸Ñ (его chunk_id). ÐÐ»Ñ ÑдобÑÑва в даннÑÑ
ÑказаÑÐµÐ»Ñ Ñакже Ñ
ÑаниÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ ÑлеменÑа даннÑÑ
(иÑÑ
однÑÑ
даннÑÑ
без ÑжаÑиÑ), ÑакÑиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ Ñ
ÑанимÑÑ
даннÑÑ
(оÑлиÑаÑÑийÑÑ, еÑли бÑло пÑименено ÑжаÑие) и иÑполÑзÑемÑй меÑод ÑжаÑиÑ, еÑли он задан. УÑиÑÑÐ²Ð°Ñ Ð±Ð°Ð¹ÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° varlena, обÑий ÑÐ°Ð·Ð¼ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° Ñ
Ñанимое на диÑке знаÑение TOAST ÑоÑÑавлÑÐµÑ 18 байÑ, незавиÑимо Ð¾Ñ ÑакÑиÑеÑкого ÑазмеÑа ÑобÑÑвенно знаÑениÑ.
Ðод обÑабоÑки TOAST ÑÑабаÑÑваеÑ, ÑолÑко когда знаÑение ÑÑÑоки, коÑоÑое должно Ñ
ÑаниÑÑÑÑ Ð² ÑаблиÑе, по ÑазмеÑÑ Ð±Ð¾Ð»ÑÑе, Ñем TOAST_TUPLE_THRESHOLD Ð±Ð°Ð¹Ñ (обÑÑно ÑÑо 2 Ðб). Ðод TOAST бÑÐ´ÐµÑ ÑжимаÑÑ Ð¸/или вÑноÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ ÑаблиÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока знаÑение ÑÑÑоки не ÑÑÐ°Ð½ÐµÑ Ð¼ÐµÐ½ÑÑе TOAST_TUPLE_TARGET Ð±Ð°Ð¹Ñ (пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²ÐµÐ»Ð¸Ñина, Ñак же обÑÑно 2 Ðб) или ÑменÑÑиÑÑ Ð¾Ð±ÑÑм ÑÑÐ°Ð½ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾. Ðо вÑÐµÐ¼Ñ Ð¾Ð¿ÐµÑаÑии UPDATE знаÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½ÑннÑÑ
полей обÑÑно ÑоÑ
ÑанÑÑÑÑÑ ÐºÐ°Ðº еÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¸Ñ ÑÑÑоки Ñ Ð¾ÑделÑно Ñ
ÑанимÑми знаÑениÑми не неÑÑÑ Ð¸Ð·Ð´ÐµÑжек, ÑвÑзаннÑÑ
Ñ TOAST, еÑли вÑе Ñакие знаÑÐµÐ½Ð¸Ñ Ð¾ÑÑаÑÑÑÑ Ð±ÐµÐ· изменений.
Ðод обÑабоÑки TOAST ÑаÑпознаÑÑ ÑеÑÑÑе ÑазлиÑнÑе ÑÑÑаÑегии Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑÑолбÑов, ÑовмеÑÑимÑÑ Ñ TOAST, на диÑке:
PLAINне допÑÑÐºÐ°ÐµÑ Ð½Ð¸ ÑжаÑиÑ, ни оÑделÑного Ñ ÑанениÑ. ÐÑо единÑÑвенно Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÑÑÑаÑÐµÐ³Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑов Ñипов даннÑÑ , коÑоÑÑе неÑовмеÑÑÐ¸Ð¼Ñ Ñ TOAST.EXTENDEDдопÑÑÐºÐ°ÐµÑ ÐºÐ°Ðº ÑжаÑие, Ñак и оÑделÑное Ñ Ñанение. ÐÑо ÑÑандаÑÑнÑй ваÑÐ¸Ð°Ð½Ñ Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва Ñипов даннÑÑ , ÑовмеÑÑимÑÑ Ñ TOAST. СнаÑала пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð¿ÑÑка вÑполниÑÑ ÑжаÑие, заÑем â ÑÐ¾Ñ Ñанение вне ÑаблиÑÑ, еÑли ÑÑÑока вÑÑ ÐµÑÑ ÑлиÑком велика.EXTERNALдопÑÑÐºÐ°ÐµÑ Ð¾ÑделÑное Ñ Ñанение, но не ÑжаÑие. ÐÑполÑзованиеEXTERNALÑÑкоÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑии над ÑаÑÑÑми ÑÑÑок в болÑÑÐ¸Ñ ÑÑолбÑаÑtextиbytea(Ñеной ÑвелиÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑма памÑÑи Ð´Ð»Ñ Ñ ÑанениÑ), Ñак как ÑÑи опеÑаÑии опÑимизиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÑолÑко ÑÑебÑемÑÑ ÑаÑÑей оÑделÑнного знаÑениÑ, когда оно не ÑжаÑо.MAINдопÑÑÐºÐ°ÐµÑ ÑжаÑие, но не оÑделÑное Ñ Ñанение. (ФакÑиÑеÑки Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ ÑÑолбÑов бÑÐ´ÐµÑ Ñем не менее пÑименÑÑÑÑÑ Ð¾ÑделÑное Ñ Ñанение, но лиÑÑ ÐºÐ°Ðº кÑайнÑÑ Ð¼ÐµÑа, когда Ð½ÐµÑ Ð´ÑÑгого ÑпоÑоба ÑменÑÑиÑÑ ÑÑÑÐ¾ÐºÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° помеÑалаÑÑ Ð½Ð° ÑÑÑаниÑе.)
ÐаждÑй Ñип даннÑÑ
, ÑовмеÑÑимÑй Ñ TOAST, опÑеделÑÐµÑ ÑÑандаÑÑнÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑов ÑÑого Ñипа даннÑÑ
, но ÑÑÑаÑÐµÐ³Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑолбÑа ÑаблиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ALTER TABLE ... SET STORAGE.
TOAST_TUPLE_TARGET можно задаваÑÑ Ð½Ð° ÑÑовне ÑÐ°Ð±Ð»Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TABLE ... SET (toast_tuple_target = N)
ÐÑа ÑÑ ÐµÐ¼Ð° Ð¸Ð¼ÐµÐµÑ ÑÑд пÑеимÑÑеÑÑв по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑм Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð¼, когда знаÑÐµÐ½Ð¸Ñ ÑÑÑок могÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð½ÐµÑколÑко ÑÑÑаниÑ. ÐÑли пÑедположиÑÑ, ÑÑо обÑÑно запÑоÑÑ Ñ Ð°ÑакÑеÑизÑÑÑÑÑ Ð²Ñполнением ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾ÑноÑиÑелÑно маленÑкими знаÑениÑми клÑÑа, болÑÑÐ°Ñ ÑаÑÑÑ ÑабоÑÑ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¸ÑполÑзованием главной запиÑи ÑÑÑоки. ÐолÑÑие знаÑÐµÐ½Ð¸Ñ Ð°ÑÑибÑÑов в ÑоÑмаÑе TOAST бÑдÑÑ Ð¿ÑоÑÑо пеÑедаваÑÑÑÑ (еÑли бÑдÑÑ Ð²ÑбÑанÑ) в ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ, когда ÑезÑлÑÑиÑÑÑÑий Ð½Ð°Ð±Ð¾Ñ Ð¾ÑпÑавлÑеÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ. Таким обÑазом, Ð³Ð»Ð°Ð²Ð½Ð°Ñ ÑаблиÑа полÑÑаеÑÑÑ Ð³Ð¾Ñаздо менÑÑе, и в обÑий ÐºÐµÑ Ð±ÑÑеÑов помеÑаеÑÑÑ Ð±Ð¾Ð»ÑÑе ÐµÑ ÑÑÑок, Ñем Ð¸Ñ Ð±Ñло Ð±Ñ Ð±ÐµÐ· иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑделÑного Ñ ÑанениÑ. ÐабоÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ ÑоÑÑиÑовок Ñакже ÑменÑÑаÑÑÑÑ, а ÑоÑÑиÑовки ÑаÑе бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð¸ÑклÑÑиÑелÑно в памÑÑи. ÐеболÑÑой ÑеÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð», ÑÑо ÑаблиÑа, ÑодеÑжаÑÐ°Ñ ÑипиÑнÑе HTML-ÑÑÑаниÑÑ Ð¸ Ð¸Ñ URL поÑле ÑжаÑÐ¸Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°Ð»Ð° пÑимеÑно Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ Ð¾Ð±ÑÑма иÑÑ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ , вклÑÑÐ°Ñ ÑаблиÑÑ TOAST, и ÑÑо Ð³Ð»Ð°Ð²Ð½Ð°Ñ ÑаблиÑа ÑодеÑжала лиÑÑ Ð¾ÐºÐ¾Ð»Ð¾ 10% вÑÐµÑ Ð´Ð°Ð½Ð½ÑÑ (URL и некоÑоÑÑе маленÑкие HTML-ÑÑÑаниÑÑ). ÐÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑки не оÑлиÑалоÑÑ Ð¾Ñ Ð²Ñемени, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑаблиÑÑ Ð±ÐµÐ· иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ TOAST, в коÑоÑой ÑÐ°Ð·Ð¼ÐµÑ Ð²ÑÐµÑ HTML-ÑÑÑÐ°Ð½Ð¸Ñ Ð±Ñл ÑменÑÑен до 7 Ðб, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ ÑмеÑÑилиÑÑ Ð² ÑÑÑÐ¾ÐºÐ°Ñ .
66.2.2. ÐÑделÑное ÑазмеÑение TOAST в памÑÑи #
УказаÑели TOAST могÑÑ ÑказÑваÑÑ Ð½Ð° даннÑе, ÑазмеÑÑннÑе не на диÑке, а где-либо в памÑÑи ÑекÑÑего ÑеÑвеÑного пÑоÑеÑÑа. ÐÑевидно, ÑÑо Ñакие ÑказаÑели не могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð»Ð³Ð¾Ð²ÑеменнÑми, но они Ñем не менее полезнÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð´Ð²Ð° подваÑианÑа: коÑвеннÑе ÑказаÑели на даннÑе и ÑказаÑели на ÑазвÑÑнÑÑÑе даннÑе.
ÐоÑвеннÑй ÑказаÑÐµÐ»Ñ TOAST пÑоÑÑо ÑказÑÐ²Ð°ÐµÑ Ð½Ð° знаÑение varlena, Ñ ÑанÑÑееÑÑ Ð³Ð´Ðµ-Ñо в памÑÑи. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¸Ð·Ð½Ð°ÑалÑно бÑл Ñеализован пÑоÑÑо как подÑвеÑждение конÑепÑии, но в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð½ пÑименÑеÑÑÑ Ð¿Ñи логиÑеÑком декодиÑовании, ÑÑÐ¾Ð±Ñ Ð½Ðµ пÑÐ¸Ñ Ð¾Ð´Ð¸Ð»Ð¾ÑÑ ÑоздаваÑÑ ÑизиÑеÑкие коÑÑежи болÑÑе одного 1 ÐÐ (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿Ñи конÑолидаÑии вÑÐµÑ Ð¾ÑделÑннÑÑ Ð·Ð½Ð°Ñений полей в одном коÑÑеже). ÐаннÑй ваÑÐ¸Ð°Ð½Ñ Ð¸Ð¼ÐµÐµÑ Ð¾Ð³ÑаниÑенное пÑименение, Ñак как ÑоздаÑÐµÐ»Ñ Ñакого ÑказаÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ полноÑÑÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо ÑелевÑе даннÑе бÑдÑÑ ÑÑÑеÑÑвоваÑÑ, ÑолÑко пока ÑÑÑеÑÑвÑÐµÑ ÑказаÑелÑ, и никакой инÑÑаÑÑÑÑкÑÑÑÑ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ñ Ð½ÐµÑ.
УказаÑели на ÑазвÑÑнÑÑÑе даннÑе TOAST Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑложнÑÑ
Ñипов, пÑедÑÑавление коÑоÑÑÑ
на диÑке плоÑ
о пÑиÑпоÑоблено Ð´Ð»Ñ Ð²ÑÑиÑлиÑелÑнÑÑ
Ñелей. ÐапÑимеÑ, ÑÑандаÑÑное пÑедÑÑавление в виде varlena маÑÑива PostgreSQL вклÑÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑазмеÑноÑÑи, биÑовÑÑ ÐºÐ°ÑÑÑ ÑлеменÑов NULL (еÑли они в нÑм ÑодеÑжаÑÑÑ), а заÑем знаÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑлеменÑов по поÑÑдкÑ. Ðогда ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñам по Ñебе Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑеменнÑÑ Ð´Ð»Ð¸Ð½Ñ, единÑÑвеннÑй ÑпоÑоб найÑи N-й ÑÐ»ÐµÐ¼ÐµÐ½Ñ â пÑоÑканиÑоваÑÑ Ð²Ñе пÑедÑдÑÑие ÑлеменÑÑ. ÐÑо пÑедÑÑавление компакÑно и поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð½Ð° диÑке, но Ð´Ð»Ñ Ð²ÑÑиÑлиÑелÑной обÑабоÑки маÑÑива гоÑаздо Ñдобнее имеÑÑ Â«ÑазвÑÑнÑÑое» или «деконÑÑÑÑиÑованное» пÑедÑÑавление, в коÑоÑом можно опÑеделиÑÑ Ð½Ð°ÑалÑнÑе адÑеÑа вÑеÑ
ÑлеменÑов. ÐеÑ
анизм ÑказаÑелей TOAST ÑпоÑобÑÑвÑÐµÑ ÑеÑÐµÐ½Ð¸Ñ ÑÑой задаÑи, допÑÑÐºÐ°Ñ Ð¿ÐµÑедаÑÑ Ð¿Ð¾ ÑÑÑлке ÑлеменÑа Datum как ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑандаÑÑное знаÑение varlena (пÑедÑÑавление на диÑке) или ÑказаÑÐµÐ»Ñ TOAST на ÑазвÑÑнÑÑое пÑедÑÑавление где-Ñо в памÑÑи. ÐеÑали ÑазвÑÑнÑÑого пÑедÑÑавление опÑеделÑÑÑÑÑ Ñамим Ñипом даннÑÑ
, Ñ
оÑÑ Ð¾Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑÑандаÑÑнÑй заголовок и ÑдовлеÑвоÑÑÑÑ Ð´ÑÑгим ÑÑебованиÑм API, опиÑаннÑм в src/include/utils/expandeddatum.h. ФÑнкÑии ÑÑÐ¾Ð²Ð½Ñ C, ÑабоÑаÑÑие Ñ ÑÑим Ñипом, могÑÑ ÑеализоваÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð»Ñбого из ÑÑиÑ
пÑедÑÑавлений. ФÑнкÑии, не знаÑÑие о ÑазвÑÑнÑÑом пÑедÑÑавлении, а пÑоÑÑо пÑименÑÑÑие PG_DETOAST_DATUM к Ñвоим вÑ
однÑм даннÑм, бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки полÑÑаÑÑ ÑÑадиÑионное пÑедÑÑавление varlena; Ñак ÑÑо поддеÑжка ÑазвÑÑнÑÑого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð²Ð¾Ð´Ð¸ÑÑÑÑ Ð¿Ð¾ÑÑепенно, по одной ÑÑнкÑии.
УказаÑели TOAST на ÑазвÑÑнÑÑÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÐµÐµ подÑазделÑÑÑÑÑ Ð½Ð° ÑказаÑели Ð´Ð»Ñ ÑÑениÑ/запиÑи и ÑказаÑели ÑолÑко Ð´Ð»Ñ ÑÑениÑ. ÐÑедÑÑавление, на коÑоÑое они ÑказÑваÑÑ, в лÑбом ÑлÑÑае одинаковое, но ÑÑнкÑии, полÑÑаÑÑей ÑказаÑÐµÐ»Ñ Ð´Ð»Ñ ÑÑениÑ/запиÑи, ÑазÑеÑаеÑÑÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ ÑелевÑе даннÑе пÑÑмо на меÑÑе, Ñогда как ÑÑнкÑиÑ, полÑÑаÑÑÐ°Ñ ÑказаÑÐµÐ»Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, не должна ÑÑого делаÑÑ; еÑли ей нÑжно полÑÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑÑ Ð²ÐµÑÑÐ¸Ñ Ð·Ð½Ð°ÑениÑ, она должна ÑнаÑала ÑделаÑÑ ÐºÐ¾Ð¿Ð¸Ñ. ÐÑо оÑлиÑие и ÑвÑзаннÑе Ñ Ð½Ð¸Ð¼ ÑоглаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¸Ð·Ð»Ð¸Ñнего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑазвÑÑнÑÑÑÑ Ð·Ð½Ð°Ñений пÑи вÑполнении запÑоÑов.
ÐÐ»Ñ Ð²ÑÐµÑ Ñипов ÑказаÑелей TOAST на даннÑе в памÑÑи, код обÑабоÑки TOAST гаÑанÑиÑÑеÑ, ÑÑо Ñакие даннÑе не окажÑÑÑÑ ÑлÑÑайно ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ñ Ð½Ð° диÑке. УказаÑели TOAST в памÑÑи авÑомаÑиÑеÑки ÑвоÑаÑиваÑÑÑÑ Ð² обÑÑнÑе знаÑÐµÐ½Ð¸Ñ varlena пеÑед ÑÐ¾Ñ Ñанением â а заÑем могÑÑ Ð¿ÑеобÑазоваÑÑÑÑ Ð² ÑказаÑели TOAST на диÑке, еÑли без ÑÑого не ÑмогÑÑ ÑмеÑÑиÑÑÑÑ Ð² ÑодеÑжаÑем Ð¸Ñ ÐºÐ¾ÑÑеже.