66.4. РеализаÑÐ¸Ñ #
Ð ÑÑом Ñазделе оÑвеÑаÑÑÑÑ ÑонкоÑÑи ÑеализаÑии и оÑобенноÑÑи, о коÑоÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ знаÑÑ Ñем, кÑо бÑÐ´ÐµÑ ÑеализовÑваÑÑ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов SP-GiST.
66.4.1. ÐгÑаниÑÐµÐ½Ð¸Ñ SP-GiST #
ÐÑделÑнÑе коÑÑежи лиÑÑÑев и внÑÑÑенние коÑÑежи Ð´Ð¾Ð»Ð¶Ð½Ñ ÑмеÑаÑÑÑÑ Ð² одной ÑÑÑаниÑе индекÑа (по ÑмолÑÐ°Ð½Ð¸Ñ ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ 8 ÐбайÑ). Таким обÑазом пÑи индекÑиÑовании знаÑений Ñипов даннÑÑ
пеÑеменной Ð´Ð»Ð¸Ð½Ñ Ð±Ð¾Ð»ÑÑие знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ ÑолÑко Ñакими ÑÑ
емами, как пÑеÑикÑнÑе деÑевÑÑ, в коÑоÑÑÑ
каждÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´ÐµÑева вклÑÑÐ°ÐµÑ Ð¿ÑеÑикÑ, доÑÑаÑоÑно коÑоÑкий Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð² ÑÑÑаниÑÑ, и на конеÑном ÑÑовне лиÑÑÑев ÑодеÑжиÑÑÑ ÑÑÑÑикÑ, коÑоÑÑй Ñакже доÑÑаÑоÑно мал, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¼ÐµÑÑиÑÑÑÑ Ð² ÑÑÑаниÑе. ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен ÑÑÑанавливаÑÑ Ð¿Ñизнак longValuesOK, ÑолÑко еÑли он гоÑов оÑганизовÑваÑÑ ÑакÑÑ ÑÑÑÑкÑÑÑÑ. ÐÑли ÑÑÐ¾Ñ Ð¿Ñизнак не ÑÑÑановлен, ÑдÑо SP-GiST не пÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° индекÑаÑÐ¸Ñ Ð·Ð½Ð°ÑениÑ, коÑоÑое ÑлиÑком велико Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа.
Также клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен оÑвеÑаÑÑ Ð·Ð° Ñо, ÑÑÐ¾Ð±Ñ Ð²Ð½ÑÑÑенние коÑÑежи пÑи ÑаÑÑиÑении не вÑÑ Ð¾Ð´Ð¸Ð»Ð¸ за пÑÐµÐ´ÐµÐ»Ñ ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа; ÑÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ ÑиÑло доÑеÑÐ½Ð¸Ñ Ñзлов, коÑоÑÑе могÑÑ Ð¿ÑинадлежаÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð²Ð½ÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÐºÐ¾ÑÑежÑ, а Ñакже макÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿ÑеÑикÑа.
ÐÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо когда Ñзел внÑÑÑеннего коÑÑежа ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾ÑÑежей лиÑÑÑев, вÑе ÑÑи коÑÑежи Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð² одной ÑÑÑаниÑе индекÑа. (ÐÑо конÑÑÑÑкÑивное огÑаниÑение введено Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии позиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñкономии меÑÑа на ÑÑÑлкаÑ
, ÑвÑзÑваÑÑиÑ
Ñакие коÑÑежи вмеÑÑе.) ÐÑли Ð½Ð°Ð±Ð¾Ñ ÐºÐ¾ÑÑежей лиÑÑÑев оказÑваеÑÑÑ ÑлиÑком болÑÑим Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑаниÑÑ, вÑполнÑеÑÑÑ Ñазделение и вÑÑавлÑеÑÑÑ Ð¿ÑомежÑÑоÑнÑй внÑÑÑенний коÑÑеж. ЧÑÐ¾Ð±Ñ ÑÑÑÑаниÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÑÑÑ Ð¿ÑоблемÑ, новÑй внÑÑÑенний коÑÑеж должен ÑазделÑÑÑ Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений в лиÑÑе на неÑколÑко гÑÑпп Ñзлов. ÐÑли ÑÑнкÑÐ¸Ñ picksplit клаÑÑа опеÑаÑоÑов не Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÑÑо, ÑдÑо SP-GiST пеÑеÑ
Ð¾Ð´Ð¸Ñ Ðº ÑÑезвÑÑайнÑм меÑам, опиÑаннÑм в ÐодÑазделе 66.4.3.
Ðогда longValuesOK Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, ожидаеÑÑÑ, ÑÑо поÑледÑÑÑие ÑÑовни деÑева SP-GiST бÑдÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð²ÑÑ Ð±Ð¾Ð»ÑÑе и болÑÑе инÑоÑмаÑии в пÑеÑикÑÑ Ð¸ меÑки Ñзлов внÑÑÑенниÑ
коÑÑежей, поÑÑепенно ÑменÑÑÐ°Ñ Ð·Ð½Ð°Ñение, коÑоÑое нÑжно ÑоÑ
ÑаниÑÑ Ð½Ð° ÑÑовне лиÑÑÑев, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ в конÑе конÑов ÑмеÑÑилоÑÑ Ð½Ð° ÑÑÑаниÑе. ЧÑÐ¾Ð±Ñ Ð² ÑлÑÑае оÑибки в клаÑÑаÑ
опеÑаÑоÑаÑ
иÑклÑÑиÑÑ Ð±ÐµÑконеÑнÑе ÑÐ¸ÐºÐ»Ñ Ð¿Ñи добавлении запиÑи, ÑдÑо SP-GiST вÑдаÑÑ Ð¾ÑибкÑ, еÑли знаÑение Ð´Ð»Ñ Ð»Ð¸ÑÑа не ÑменÑÑиÑÑÑ Ð·Ð° 10 вÑзовов меÑода choose.
66.4.2. SP-GiST без меÑок Ñзлов #
РнекоÑоÑÑÑ
дÑевовиднÑÑ
ÑÑ
емаÑ
каждÑй внÑÑÑенний коÑÑеж ÑодеÑÐ¶Ð¸Ñ ÑикÑиÑованнÑй Ð½Ð°Ð±Ð¾Ñ Ñзлов; напÑимеÑ, в деÑеве квадÑанÑов ÑÑо вÑегда ÑеÑÑÑе Ñзла, ÑооÑвеÑÑÑвÑÑÑие ÑеÑÑÑÑм квадÑанÑам вокÑÑг ÑенÑÑалÑной ÑоÑки внÑÑÑеннего коÑÑежа. Ð Ñаком ÑлÑÑае код обÑÑно ÑабоÑÐ°ÐµÑ Ñ Ñзлами по номеÑам и необÑ
одимоÑÑи в ÑвнÑÑ
меÑкаÑ
Ñзлов неÑ. ЧÑÐ¾Ð±Ñ ÑбÑаÑÑ Ð¼ÐµÑки Ñзлов (и Ñаким обÑазом ÑÑкономиÑÑ Ð¼ÐµÑÑо), ÑÑнкÑÐ¸Ñ picksplit Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ NULL вмеÑÑо маÑÑива nodeLabels, а ÑÑнкÑÐ¸Ñ choose аналогиÑно Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ NULL вмеÑÑо маÑÑива prefixNodeLabels во вÑÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ spgSplitTuple. Ð ÑезÑлÑÑаÑе пÑи поÑледÑÑÑиÑ
вÑзоваÑ
ÑÑнкÑий choose и inner_consistent им вмеÑÑо nodeLabels бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ NULL. РпÑинÑипе меÑки Ñзлов могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¸Ñ
внÑÑÑенниÑ
коÑÑежей и оÑÑÑÑÑÑвоваÑÑ Ñ Ð´ÑÑгиÑ
в Ñом же индекÑе.
Ðогда внÑÑÑенний коÑÑеж ÑодеÑÐ¶Ð¸Ñ ÑÐ·Ð»Ñ Ð±ÐµÐ· меÑок, ÑÑнкÑÐ¸Ñ choose не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ Ð´ÐµÐ¹ÑÑвие spgAddNode, Ñак как в ÑÑом ÑлÑÑае пÑедполагаеÑÑÑ, ÑÑо Ð½Ð°Ð±Ð¾Ñ Ñзлов ÑикÑиÑованнÑй.
66.4.3. ÐнÑÑÑенние коÑÑежи «вÑе-ÑавнÑ» #
ЯдÑо SP-GiST Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеопÑеделиÑÑ ÑезÑлÑÑаÑÑ ÑÑнкÑии picksplit клаÑÑа опеÑаÑоÑов, когда ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ ÑазделиÑÑ Ð¿Ð¾ÑÑÑпивÑие знаÑÐµÐ½Ð¸Ñ Ð»Ð¸ÑÑÑев на минимÑм две каÑегоÑии Ñзлов. Ðогда ÑÑо пÑоиÑÑ
одиÑ, ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй внÑÑÑенний коÑÑеж Ñ Ð½ÐµÑколÑкими Ñзлами, каждÑй из коÑоÑÑÑ
Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð½Ñ Ð¼ÐµÑÐºÑ (еÑли имееÑ), коÑоÑÑÑ picksplit дала Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑзлÑ, а знаÑÐµÐ½Ð¸Ñ Ð»Ð¸ÑÑÑев ÑаÑпÑеделÑÑÑÑÑ ÑлÑÑайно Ð¼ÐµÐ¶Ð´Ñ ÑÑими ÑавнознаÑнÑми Ñзлами. ÐÐ»Ñ ÑÑого внÑÑÑеннего коÑÑежа ÑÑÑанавливаеÑÑÑ Ñлаг allTheSame, коÑоÑÑй пÑедÑпÑÐµÐ¶Ð´Ð°ÐµÑ ÑÑнкÑии choose и inner_consistent, ÑÑо коÑÑеж не ÑодеÑÐ¶Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ Ñзлов, коÑоÑÑй они обÑÑно ожидаÑÑ.
Ðогда обÑабаÑÑваеÑÑÑ ÐºÐ¾ÑÑеж Ñ Ñлагом allTheSame, вÑбÑанное ÑÑнкÑией choose дейÑÑвие spgMatchNode воÑпÑинимаеÑÑÑ ÐºÐ°Ðº Ñказание, ÑÑо новое знаÑение можно пÑиÑвоиÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· ÑавнознаÑнÑÑ
Ñзлов; код ÑдÑа бÑÐ´ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ Ð¿Ð¾Ð»ÑÑенное знаÑение nodeN и ÑпÑÑÑиÑÑÑ Ð² один из Ñзлов, вÑбÑаннÑй ÑлÑÑайно (ÑÑÐ¾Ð±Ñ Ð´ÐµÑево бÑло ÑбаланÑиÑованнÑм). ÐÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð¾Ñибкой, еÑли choose вÑбеÑÐµÑ Ð´ÐµÐ¹ÑÑвие spgAddNode, Ñак как пÑи ÑÑом не вÑе ÑÐ·Ð»Ñ Ð¾ÐºÐ°Ð¶ÑÑÑÑ ÑавнÑ; еÑли добавлÑемое знаÑение не ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑеÑÑвÑÑÑим Ñзлам, должно вÑбиÑаÑÑÑÑ Ð´ÐµÐ¹ÑÑвие spgSplitTuple.
Также, когда обÑабаÑÑваеÑÑÑ ÐºÐ¾ÑÑеж Ñ Ñлагом allTheSame, ÑÑнкÑÐ¸Ñ inner_consistent должна веÑнÑÑÑ Ð²Ñе или не возвÑаÑаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑÐ·Ð»Ñ Ð´Ð»Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка по индекÑÑ, Ñак как вÑе ÑÐ·Ð»Ñ ÑавнознаÑнÑ. ÐÐ»Ñ ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ, а Ð¼Ð¾Ð¶ÐµÑ Ð¸ не поÑÑебоваÑÑÑÑ ÐºÐ¾Ð´ обÑабоÑки оÑобого ÑлÑÑаÑ, в завиÑимоÑÑи Ð¾Ñ Ñого, как inner_consistent обÑÑно воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑзлÑ.