67.4. РеализаÑÐ¸Ñ #
ÐнÑÑÑи Ð¸Ð½Ð´ÐµÐºÑ GIN ÑодеÑÐ¶Ð¸Ñ B-деÑево, поÑÑÑоенное по клÑÑам, где каждÑй клÑÑ ÑвлÑеÑÑÑ ÑлеменÑом одного или неÑколÑÐºÐ¸Ñ Ð¸Ð½Ð´ÐµÐºÑиÑованнÑÑ Ð¾Ð±ÑекÑов (напÑимеÑ, Ñленом маÑÑива) и где каждÑй коÑÑеж на ÑÑÑаниÑÐ°Ñ Ð»Ð¸ÑÑÑев ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸Ð±Ð¾ ÑказаÑÐµÐ»Ñ Ð½Ð° B-деÑево ÑказаÑелей на даннÑе («деÑево иденÑиÑикаÑоÑов»), либо пÑоÑÑой ÑпиÑок ÑказаÑелей на даннÑе («ÑпиÑок иденÑиÑикаÑоÑов»), когда ÑÑÐ¾Ñ ÑпиÑок доÑÑаÑоÑно мал, ÑÑÐ¾Ð±Ñ ÑмеÑÑиÑÑÑÑ Ð² одном коÑÑеже индекÑа вмеÑÑе Ñо знаÑением клÑÑа. ÐÑи компоненÑÑ GIN-индекÑа Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð½Ð° РиÑÑнке 67.1.
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL веÑÑии 9.1, в Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей, ÑавнÑе NULL. ÐÑоме Ñого, в Ð¸Ð½Ð´ÐµÐºÑ Ð²ÑÑавлÑÑÑÑÑ NULL Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑÑ
обÑекÑов, ÑавнÑÑ
NULL или не ÑодеÑжаÑиÑ
клÑÑей, ÑоглаÑно ÑÑнкÑии extractValue. ÐÑо позволÑÐµÑ Ð½Ð°Ñ
одиÑÑ Ð¿Ñи поиÑке пÑÑÑÑе обÑекÑÑ, когда они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ.
СоÑÑавнÑе индекÑÑ GIN ÑеализÑÑÑÑÑ Ð² виде одного B-деÑева по ÑоÑÑавнÑм знаÑениÑм (Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа, знаÑение клÑÑа). ÐнаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей Ð´Ð»Ñ ÑазлиÑнÑÑ ÑÑолбÑов могÑÑ Ð±ÑÑÑ ÑазнÑÑ Ñипов.
РиÑÑнок 67.1. ÐнÑÑÑеннее ÑÑÑÑойÑÑво GIN
67.4.1. ÐеÑодика бÑÑÑÑого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ GIN #
ÐÑиÑода инвеÑÑиÑованного индекÑа Ñакова, ÑÑо обновление GIN обÑÑно Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ: пÑи добавлении или изменении одной ÑÑÑоки даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð²ÑполниÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво добавлений запиÑей в Ð¸Ð½Ð´ÐµÐºÑ (Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клÑÑа, извлеÑÑнного из индекÑиÑÑемого обÑекÑа). GIN Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑложиÑÑ Ð±Ð¾Ð»ÑÑой обÑÑм ÑÑой ÑабоÑÑ, вÑÑавлÑÑ Ð½Ð¾Ð²Ñе коÑÑежи во вÑеменнÑй, неÑоÑÑиÑованнÑй ÑпиÑок запиÑей, ожидаÑÑиÑ
индекÑаÑии. Ðогда ÑаблиÑа оÑиÑаеÑÑÑ, авÑомаÑиÑеÑки анализиÑÑеÑÑÑ, вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ gin_clean_pending_list или ÑÐ°Ð·Ð¼ÐµÑ ÑÑого ÑпиÑка вÑеменного ÑпиÑка ÑÑановиÑÑÑ Ð±Ð¾Ð»ÑÑе Ñем gin_pending_list_limit, запиÑи пеÑеноÑÑÑÑÑ Ð² оÑновнÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
GIN Ñеми же меÑодами маÑÑового Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑÑо и пÑи наÑалÑном Ñоздании индекÑа. ÐÑо знаÑиÑелÑно ÑвелиÑÐ¸Ð²Ð°ÐµÑ ÑкоÑоÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа GIN, даже Ñ ÑÑÑÑом дополниÑелÑнÑÑ
издеÑжек пÑи оÑиÑÑке. Ð ÑÐ¾Ð¼Ñ Ð¶Ðµ ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑабоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑполниÑÑ Ð² Ñоновом пÑоÑеÑÑе, а не в пÑоÑеÑÑе, непоÑÑедÑÑвенно вÑполнÑÑÑем запÑоÑÑ.
ÐÑновной недоÑÑаÑок Ñакого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо пÑи поиÑке Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ не ÑолÑко пÑовеÑиÑÑ Ð¾Ð±ÑÑнÑй индекÑ, но и пÑоÑканиÑоваÑÑ ÑпиÑок ожидаÑÑÐ¸Ñ Ð·Ð°Ð¿Ð¸Ñей, Ñак ÑÑо еÑли ÑÑÐ¾Ñ ÑпиÑок болÑÑой, поиÑк знаÑиÑелÑно замедлÑеÑÑÑ. ÐÑÑ Ð¾Ð´Ð¸Ð½ недоÑÑаÑок ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ñ Ð¾ÑÑ Ð² оÑновном Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑоизводÑÑÑÑ Ð±ÑÑÑÑо, изменение, пÑи коÑоÑом ÑÑÐ¾Ñ ÑпиÑок оказÑваеÑÑÑ Â«ÑлиÑком болÑÑим», влеÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð¹ оÑиÑÑки и поÑÑÐ¾Ð¼Ñ Ð²ÑполнÑеÑÑÑ Ð³Ð¾Ñаздо долÑÑе оÑÑалÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐинимизиÑоваÑÑ ÑÑи недоÑÑаÑки можно, пÑавилÑно оÑганизовав авÑооÑиÑÑкÑ.
ÐÑли вÑдеÑжанноÑÑÑ Ð²Ñемени опеÑаÑий важнее ÑкоÑоÑÑи обновлениÑ, пÑименение ÑпиÑка ожидаÑÑиÑ
запиÑей можно оÑклÑÑиÑÑ, вÑклÑÑив паÑамеÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ fastupdate Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа GIN. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº CREATE INDEX.
67.4.2. ÐлгоÑиÑм ÑаÑÑиÑного ÑооÑвеÑÑÑÐ²Ð¸Ñ #
GIN Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¿ÑовеÑки «ÑаÑÑиÑного ÑооÑвеÑÑÑвиÑ», когда запÑÐ¾Ñ Ð²ÑÑвлÑÐµÑ Ð½Ðµ ÑоÑное ÑооÑвеÑÑÑвие Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð»Ð¸ неÑколÑким клÑÑам, а возможнÑе ÑооÑвеÑÑÑвиÑ, попадаÑÑие в доÑÑаÑоÑно Ñзкий диапазон знаÑений клÑÑей (пÑи поÑÑдке ÑоÑÑиÑовки клÑÑей, опÑеделÑннÑм опоÑнÑм меÑодом compare). Ð ÑÑом ÑлÑÑае меÑод extractQuery возвÑаÑÐ°ÐµÑ Ð½Ðµ знаÑение клÑÑа, коÑоÑое должно ÑооÑвеÑÑÑвоваÑÑ ÑоÑно, а знаÑение, опÑеделÑÑÑее нижнÑÑ Ð³ÑаниÑÑ Ð¸Ñкомого диапазона, и ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñлаг pmatch. ÐаÑем диапазон клÑÑей ÑканиÑÑеÑÑÑ Ð¼ÐµÑодом comparePartial. ÐеÑод comparePartial должен веÑнÑÑÑ Ð½Ð¾Ð»Ñ Ð¿Ñи ÑооÑвеÑÑÑвии клÑÑа индекÑа, оÑÑиÑаÑелÑное знаÑение, еÑли ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð½ÐµÑ, но нÑжно пÑодолжаÑÑ Ð¿ÑовеÑÐºÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°, и положиÑелÑное знаÑение, еÑли клÑÑ Ð¸Ð½Ð´ÐµÐºÑа оказалÑÑ Ð·Ð° иÑкомÑм диапазоном.