63.1. ÐндекÑÑ B-деÑевÑÑ #
63.1.1. Ðведение #
Postgres Pro вклÑÑÐ°ÐµÑ ÑеализаÑÐ¸Ñ ÑÑандаÑÑной индекÑной ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ â B-деÑева (btree, многонапÑавленного ÑбаланÑиÑованного деÑева). РиндекÑ-B-деÑево могÑÑ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñе лÑбого Ñипа, коÑоÑÑе можно оÑÑоÑÑиÑоваÑÑ Ð² ÑÑÑко опÑеделÑнном линейном поÑÑдке. ÐдинÑÑвенное его огÑаниÑение ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо ÑÐ°Ð·Ð¼ÐµÑ Ð·Ð°Ð¿Ð¸Ñи в индекÑе не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑевÑÑаÑÑ Ð¿ÑимеÑно ÑÑеÑÑ ÑÑÑаниÑÑ (поÑле ÑжаÑÐ¸Ñ TOAST, еÑли оно пÑименÑеÑÑÑ).
Так как каждÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки Ð´Ð»Ñ Ñвоего Ñипа даннÑÑ , клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree (или, ÑакÑиÑеÑки, ÑемейÑÑва опеÑаÑоÑов) оказалиÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑелÑнÑми и полезнÑми Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑеманÑики ÑоÑÑиÑовки в Postgres Pro. Ðак ÑледÑÑвие, они пÑиобÑели некоÑоÑÑе возможноÑÑи, коÑоÑÑе вÑÑ Ð¾Ð´ÑÑ Ð·Ð° Ñамки Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ минимÑма Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки индекÑов btree и иÑполÑзÑÑÑÑÑ ÑаÑÑÑми ÑиÑÑемÑ, доволÑно далÑкими Ð¾Ñ Ð¼ÐµÑодов доÑÑÑпа btree.
63.1.2. Ðоведение клаÑÑов опеÑаÑоÑов B-деÑева #
Ðак показано в ТаблиÑе 36.3, клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree должен пÑедоÑÑавиÑÑ Ð¿ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑÑавнениÑ, <, <=, =, >= и >. ХоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло ожидаÑÑ, ÑÑо ÑаÑÑÑÑ ÑÑого клаÑÑа бÑÐ´ÐµÑ Ð¸ опеÑаÑÐ¾Ñ <>, но ÑÑо не Ñак, поÑÐ¾Ð¼Ñ ÑÑо иÑполÑзоваÑÑ <> в пÑедложении WHERE Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по индекÑÑ Ð¿ÑакÑиÑеÑки беÑполезно. (ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
Ñелей планиÑовÑик ÑÑловно оÑноÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ <> к клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree, но он наÑ
Ð¾Ð´Ð¸Ñ Ð´Ð°Ð½Ð½Ñй опеÑаÑÐ¾Ñ ÐºÐ°Ðº оÑÑиÑание опеÑаÑоÑа =, а не обÑаÑаÑÑÑ Ðº pg_amop.)
Ðогда неÑколÑко Ñипов даннÑÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑакÑиÑеÑки одинаковÑÑ ÑеманÑÐ¸ÐºÑ ÑоÑÑиÑовки, Ð¸Ñ ÐºÐ»Ð°ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов можно ÑгÑÑппиÑоваÑÑ Ð² ÑемейÑÑво опеÑаÑоÑов. ÐÑо полезно Ñем, ÑÑо позволÑÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑÐ¸ÐºÑ Ð´ÐµÐ»Ð°ÑÑ Ð²ÑÐ²Ð¾Ð´Ñ Ð¾ межÑиповÑÑ ÑÑавнениÑÑ . ÐаждÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов в ÑемейÑÑве должен ÑодеÑжаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñвоего Ñипа Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ (и ÑопÑÑÑÑвÑÑÑие опоÑнÑе ÑÑнкÑии), Ñогда как межÑиповÑе опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ опоÑнÑе ÑÑнкÑии ÑвлÑÑÑÑÑ Â«Ñлабо» ÑвÑзаннÑми Ñ ÑемейÑÑвом. Ð ÑемейÑÑво ÑекомендÑеÑÑÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¿Ð¾Ð»Ð½Ñй Ð½Ð°Ð±Ð¾Ñ Ð¼ÐµÐ¶ÑиповÑÑ Ð¾Ð¿ÐµÑаÑоÑов, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик мог пÑедÑÑавиÑÑ Ð»ÑбÑе ÑÑловиÑ, коÑоÑÑе он Ð¼Ð¾Ð¶ÐµÑ Ð²ÑвеÑÑи, иÑполÑзÑÑ ÑÑанзиÑивноÑÑÑ.
СемейÑÑво опеÑаÑоÑов btree должно ÑдовлеÑвоÑÑÑÑ Ð½ÐµÑколÑким базовÑм положениÑм:
ÐпеÑаÑоÑ
=должен пÑедÑÑавлÑÑÑ Ð¾ÑноÑение ÑквиваленÑноÑÑи; Ñо еÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ Ð¾ÑлиÑнÑÑ Ð¾Ñ NULL знаÑенийA,B,CопÑеделÑнного Ñипа даннÑÑ :A=Aâ иÑÑина (ÑеÑлекÑивноÑÑÑ)еÑли
A=B, ÑоB=A(ÑиммеÑÑиÑ)еÑли
A=BиB=C, ÑоA=C(ÑÑанзиÑивноÑÑÑ)
ÐпеÑаÑоÑ
<должен пÑедÑÑавлÑÑÑ Ð¾ÑноÑение ÑÑÑогого ÑпоÑÑдоÑиваниÑ; Ñо еÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ Ð¾ÑлиÑнÑÑ Ð¾Ñ NULL знаÑенийA,B,C:A<Aâ ложно (анÑиÑеÑлекÑивноÑÑÑ)еÑли
A<BиB<C, ÑоA<C(ÑÑанзиÑивноÑÑÑ)
Ðолее Ñого, ÑпоÑÑдоÑивание дейÑÑвÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñно; Ñо еÑÑÑ Ð´Ð»Ñ Ð»ÑбÑÑ Ð¾ÑлиÑнÑÑ Ð¾Ñ NULL знаÑений
A,B:иÑÑиннÑм ÑвлÑеÑÑÑ Ñовно одно из ÑÑловий:
A<B,A=BилиB<A(ÑÑÐ¸Ñ Ð¾ÑомиÑ)
(РазÑмееÑÑÑ, опÑеделение ÑÑнкÑии, оÑÑÑеÑÑвлÑÑÑей ÑÑавнение, вÑÑÐµÐºÐ°ÐµÑ Ð¸Ð· закона ÑÑÐ¸Ñ Ð¾Ñомии.)
ÐÑÑалÑнÑе ÑÑи опеÑаÑоÑа опÑеделÑÑÑÑÑ ÑеÑез опеÑаÑоÑÑ = и < оÑевиднÑм обÑазом и Ð´Ð¾Ð»Ð¶Ð½Ñ ÑабоÑаÑÑ ÑоглаÑованно Ñ Ð¿Ð¾Ñледними.
ÐÐ»Ñ ÑемейÑÑва опеÑаÑоÑов, поддеÑживаÑÑего неÑколÑко Ñипов даннÑÑ
, вÑÑепеÑеÑиÑленнÑе Ð·Ð°ÐºÐ¾Ð½Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи знаÑениÑÑ
A, B, C, оÑноÑÑÑиÑ
ÑÑ Ðº лÑбÑм Ñипам из ÑемейÑÑва. ТÑанзиÑивноÑÑÑ Ð¾Ð±ÐµÑпеÑиÑÑ Ñложнее вÑего, Ñак как в ÑиÑÑаÑиÑÑ
Ñ ÑазнÑми Ñипами она ÑÑебÑÐµÑ ÑоглаÑованного Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ
или ÑÑÑÑ
ÑазлиÑнÑÑ
опеÑаÑоÑов. Так напÑимеÑ, в одном ÑемейÑÑве опеÑаÑоÑов не ÑмогÑÑ ÑабоÑаÑÑ ÑÐ¸Ð¿Ñ float8 и numeric, по кÑайней меÑе пÑи ÑекÑÑем подÑ
оде, когда знаÑÐµÐ½Ð¸Ñ numeric пÑеобÑазÑÑÑÑÑ Ð²Ð¾ float8 Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ float8. Ðз-за огÑаниÑенной ÑоÑноÑÑи Ñипа float8 ÑазлиÑнÑе знаÑÐµÐ½Ð¸Ñ numeric могÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑавнÑми Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ float8, ÑÑо наÑÑÑÐ¸Ñ Ð·Ð°ÐºÐ¾Ð½ ÑÑанзиÑивноÑÑи.
ÐÑÑ Ð¾Ð´Ð½Ð¾ ÑÑебование Ð´Ð»Ñ ÑемейÑÑва, ÑаÑÑÑиÑанного на неÑколÑко Ñипов даннÑÑ , ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо лÑбое неÑвное или двоиÑно-ÑовмеÑÑимое пÑиведение, коÑоÑое опÑеделено Ð¼ÐµÐ¶Ð´Ñ Ñипами, вклÑÑÑннÑми в ÑемейÑÑво опеÑаÑоÑов, не должно менÑÑÑ ÑооÑвеÑÑÑвÑÑÑий поÑÑдок ÑоÑÑиÑовки.
Ðолжно бÑÑÑ Ð´Ð¾ÑÑаÑоÑно понÑÑно, поÑÐµÐ¼Ñ Ð¸Ð½Ð´ÐµÐºÑ-B-деÑево ÑÑебÑÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð·Ð°ÐºÐ¾Ð½Ð¾Ð² Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ : без ÑÑого ÑпоÑÑдоÑивание клÑÑей невозможно. ÐÑоме Ñого, Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка в индекÑе по клÑÑÑ Ð´ÑÑгого Ñипа даннÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ Ñипов ÑÑавнивалиÑÑ ÐºÐ¾ÑÑекÑно. РаÑÑиÑение ÑемейÑÑва до ÑÑÑÑ Ð¸Ð»Ð¸ более Ñипов даннÑÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм Ð´Ð»Ñ Ñамого Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° индекÑа btree, но Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика в ÑелÑÑ Ð¾Ð¿ÑимизаÑии.
63.1.3. ÐпоÑнÑе ÑÑнкÑии B-деÑевÑев #
Ðак показано в ТаблиÑе 36.9, btree опÑеделÑÐµÑ Ð¾Ð´Ð½Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ пÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий. Таким обÑазом, полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°ÑÑ ÑеÑÑÑ Ð¼ÐµÑодов:
orderÐÐ»Ñ Ð²ÑÐµÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий Ñипов даннÑÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑемейÑÑво опеÑаÑоÑов btree пÑедоÑÑавлÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑÑавнениÑ, оно должно пÑедоÑÑавлÑÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²
pg_amprocÑ Ð½Ð¾Ð¼ÐµÑом 1 и camproclefttype/amprocrighttype, ÑавнÑми Ð»ÐµÐ²Ð¾Ð¼Ñ Ð¸ пÑÐ°Ð²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ (Ñо еÑÑÑ Ñем же Ñипам даннÑÑ , Ñ ÐºÐ¾ÑоÑÑми ÑооÑвеÑÑÑвÑÑÑие опеÑаÑоÑÑ Ð·Ð°ÑегиÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð²pg_amop). ÐÑа ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑинимаÑÑ Ð´Ð²Ð° оÑлиÑнÑÑ Ð¾Ñ NULL знаÑениÑAиBи возвÑаÑаÑÑ Ð·Ð½Ð°Ñениеint32, коÑоÑое бÑдеÑ<0,0или>0, когдаA<B,A=BилиA>B, ÑооÑвеÑÑÑвенно. РезÑлÑÑÐ°Ñ NULL не допÑÑкаеÑÑÑ: вÑе знаÑÐµÐ½Ð¸Ñ Ñипа даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÑавнимÑми.ÐÑли ÑÑавниваемÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑ ÑоÑÑиÑÑемÑй Ñип даннÑÑ , опоÑной ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑоÑÑиÑовки ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼
PG_GET_COLLATION().sortsupportÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑÑнкÑии поддеÑжки ÑоÑÑиÑовки, коÑоÑÑе ÑегиÑÑÑиÑÑÑÑÑÑ Ð¿Ð¾Ð´ номеÑом опоÑной ÑÑнкÑии 2. ÐÑи ÑÑнкÑии позволÑÑÑ ÑеализовÑваÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñелей ÑоÑÑиÑовки гоÑаздо ÑÑÑекÑивнее, Ñем ÑÑо возможно пÑи пÑÑмолинейном вÑзове ÑÑнкÑии поддеÑжки ÑÑавнениÑ. ÐадейÑÑвованнÑе в ÑÑом пÑогÑаммнÑе инÑеÑÑейÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²
src/include/utils/sortsupport.h.in_rangeÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии in_range, коÑоÑÑе ÑегиÑÑÑиÑÑÑÑÑÑ Ð¿Ð¾Ð´ номеÑом 3. Ðни не иÑполÑзÑÑÑÑÑ Ð² Ñ Ð¾Ð´Ðµ опеÑаÑий Ñ Ð¸Ð½Ð´ÐµÐºÑом btree; вмеÑÑо ÑÑого они ÑаÑÑиÑÑÑÑ ÑеманÑÐ¸ÐºÑ ÑемейÑÑва опеÑаÑоÑов, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ могло поддеÑживаÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñе пÑедложениÑ
RANGEÑмеÑениеPRECEDINGиRANGEÑмеÑениеFOLLOWING(Ñм. ÐодÑаздел 4.2.8). Ðо ÑÑÑи они пÑедоÑÑавлÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, позволÑÑÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð¸Ð»Ð¸ вÑÑиÑаÑÑÑмеÑениев ÑооÑвеÑÑÑвии Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки, пÑинÑÑÑм в ÑемейÑÑве.ФÑнкÑиÑ
in_rangeдолжна имеÑÑ ÑигнаÑÑÑÑin_range(
знаÑениеtype1,базаtype1,ÑмеÑениеtype2,вÑÑиÑаниеbool,менÑÑеbool) returns boolÐнаÑÐµÐ½Ð¸ÐµÐ¸Ð±Ð°Ð·Ð°Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ , и ÑÑÐ¾Ñ Ñип должен поддеÑживаÑÑÑÑ ÑемейÑÑвом опеÑаÑоÑов (Ñо еÑÑÑ ÑÑо должен бÑÑÑ Ñип, Ð´Ð»Ñ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑоÑÑиÑовка). ÐднакоÑмеÑÐµÐ½Ð¸ÐµÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑÑгого Ñипа, коÑоÑÑй никаким дÑÑгим обÑазом не поддеÑживаеÑÑÑ Ð´Ð°Ð½Ð½Ñм ÑемейÑÑвом. ÐапÑимеÑ, вÑÑÑоенное ÑемейÑÑвоtime_opsпÑедоÑÑавлÑÐµÑ ÑÑнкÑиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑойÑмеÑÐµÐ½Ð¸ÐµÐ¸Ð¼ÐµÐµÑ Ñипinterval. СемейÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ ÑÑнкÑииin_rangeÐ´Ð»Ñ Ð»ÑбÑÑ Ð¸Ð· ÑÐ²Ð¾Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ Ñипов и одного или неÑколÑÐºÐ¸Ñ ÑиповÑмеÑений. ÐÐ°Ð¶Ð´Ð°Ñ ÑÑнкÑиÑin_rangeдолжна ÑегиÑÑÑиÑоваÑÑÑÑ Ð²pg_amprocÑ Ð¿Ð¾Ð»ÐµÐ¼amproclefttype, ÑавнÑмtype1, иamprocrighttype, ÑавнÑмtype2.СÑÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÑÑнкÑии
in_rangeзавиÑÐ¸Ñ Ð¾Ñ Ð´Ð²ÑÑ Ð»Ð¾Ð³Ð¸ÑеÑÐºÐ¸Ñ Ñлагов. Ðна должна пÑибавиÑÑ Ð¸Ð»Ð¸ вÑÑеÑÑÑ Ð¸Ð·Ð±Ð°Ð·ÑÑмеÑение, а заÑем ÑÑавниÑÑзнаÑÐµÐ½Ð¸ÐµÑ ÑезÑлÑÑаÑом ÑледÑÑÑим обÑазом:еÑли
!вÑÑиÑаниеи!менÑÑе, возвÑаÑаеÑÑÑзнаÑение>=(база+ÑмеÑение)еÑли
!вÑÑиÑаниеименÑÑе, возвÑаÑаеÑÑÑзнаÑение<=(база+ÑмеÑение)еÑли
вÑÑиÑаниеи!менÑÑе, возвÑаÑаеÑÑÑзнаÑение>=(база-ÑмеÑение)еÑли
вÑÑиÑаниеименÑÑе, возвÑаÑаеÑÑÑзнаÑение<=(база-ÑмеÑение)
ÐÑежде Ñем делаÑÑ ÑÑо, ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑовеÑиÑÑ Ð·Ð½Ð°Ðº
ÑмеÑениÑи, еÑли оно оÑÑиÑаÑелÑное, вÑдаÑÑ Ð¾ÑибкÑERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE(22013) Ñ ÑекÑÑом оÑибки «invalid preceding or following size in window function» (невеÑÐ½Ð°Ñ Ð¿ÑедÑеÑÑвÑÑÑÐ°Ñ Ð¸Ð»Ð¸ поÑледÑÑÑÐ°Ñ Ð²ÐµÐ»Ð¸Ñина в оконной ÑÑнкÑии). (ÐÑо ÑÑебÑеÑÑÑ ÑÑандаÑÑом SQL, но неÑÑандаÑÑнÑе ÑемейÑÑва опеÑаÑоÑов могÑÑ Ð¿ÑоигноÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ð¾Ðµ огÑаниÑение, Ñак как оно не неÑÑÑ Ð±Ð¾Ð»ÑÑой ÑмÑÑловой нагÑÑзки.) ÐÑовеÑка ÑÑого ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ»ÐµÐ³Ð¸ÑÑеÑÑÑ ÑÑнкÑииin_range, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð´Ñ ÑдÑа не ÑÑебовалоÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо ознаÑÐ°ÐµÑ Â«Ð¼ÐµÐ½ÑÑе нÑлÑ» Ð´Ð»Ñ Ð¿ÑоизволÑного Ñипа даннÑÑ .ÐÑоме Ñого, ÑÑнкÑии
in_range, еÑли ÑÑо пÑакÑиÑно, могÑÑ Ð½Ðµ вÑдаваÑÑ Ð¾ÑибкÑ, когда опеÑаÑиÑбаза+ÑмеÑениеилибаза-ÑмеÑениепÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пеÑеполнениÑ. ÐÑавилÑнÑй ÑезÑлÑÑÐ°Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ, даже еÑли ÑÑо знаÑение вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° гÑаниÑÑ Ð´Ð¾Ð¿ÑÑÑимого диапазона ÑÑого Ñипа даннÑÑ . ÐамеÑÑÑе, ÑÑо еÑли Ð´Ð»Ñ Ñипа даннÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñакие понÑÑиÑ, как «беÑконеÑноÑÑÑ» и «NaN», могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе меÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑоглаÑованноÑÑи ÑезÑлÑÑаÑовin_rangeÑ Ð¾Ð±ÑÑнÑм поÑÑдком ÑоÑÑиÑовки данного ÑемейÑÑва опеÑаÑоÑов.РезÑлÑÑаÑÑ ÑÑнкÑии
in_rangeÐ´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ ÑоÑÑиÑовки, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÐ¼Ð¾Ð¼Ñ ÑемейÑÑвом опеÑаÑоÑов. ТоÑнее говоÑÑ, пÑи лÑбÑÑ ÑикÑиÑованнÑÑ Ð°ÑгÑменÑаÑÑмеÑениеивÑÑиÑаниеÑпÑаведливо:ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ true Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑ1ибазÑ, true должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾Ð·Ð½Ð°ÑениÑ2<=знаÑениÑ1Ñ Ñой жебазой.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ false Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑ1ибазÑ, false должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ Ð»ÑбогознаÑениÑ2>=знаÑениÑ1Ñ Ñой жебазой.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ true Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑибазÑ1, true должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹Ð±Ð°Ð·Ñ2>=базе1Ñ Ñем жезнаÑением.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ false Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑибазÑ1, false должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ Ð»ÑбойбазÑ2<=базе1Ñ Ñем жезнаÑением.
ÐналогиÑнÑе ÑÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ Ð¿ÑоÑивоположнÑми ÑÑловиÑми Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи
менÑÑе= false.ÐÑли ÑпоÑÑдоÑиваемÑй Ñип (
type1) ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑм, ÑÑнкÑииin_rangeбÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑоÑÑиÑовки ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ PG_GET_COLLATION().ФÑнкÑии
in_rangeне Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑ NULL в аÑгÑменÑÐ°Ñ Ð¸ обÑÑно помеÑаÑÑÑÑ ÐºÐ°Ðº ÑÑÑогие.equalimageÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии
equalimage(«ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов»), ÑегиÑÑÑиÑÑемÑе под номеÑом 4. ÐÑи ÑÑнкÑии позволÑÑÑ ÐºÐ¾Ð´Ñ ÑдÑа опÑеделиÑÑ, безопаÑно ли пÑименÑÑÑ Ð¸ÑклÑÑение дÑбликаÑов в B-деÑеве. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑнкÑииequalimageвÑзÑваÑÑÑÑ ÑолÑко пÑи поÑÑÑоении или пеÑеÑÑÑоении индекÑа.ФÑнкÑиÑ
equalimageдолжна имеÑÑ ÑигнаÑÑÑÑequalimage(
opcintypeoid) returns boolÐÑ ÑезÑлÑÑаÑом бÑÐ´ÐµÑ ÑÑаÑиÑеÑÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ клаÑÑе опеÑаÑоÑов и пÑавиле ÑоÑÑиÑовки. РезÑлÑÑаÑ
trueознаÑаеÑ, ÑÑо ÑÑнкÑиÑorderÐ´Ð»Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ0(пÑизнак ÑавенÑÑва аÑгÑменÑов), ÑолÑко когда аÑгÑменÑÑAиBвзаимозаменÑÐµÐ¼Ñ Ð±ÐµÐ· поÑеÑи ÑеманÑиÑеÑкой инÑоÑмаÑии. ÐÑли ÑÑнкÑиÑequalimageне опÑеделена или она возвÑаÑаеÑfalse, ÑаÑÑÑиÑÑваÑÑ Ð½Ð° вÑполнение данного ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½ÐµÐ»ÑзÑ.РаÑгÑменÑе
opcintypeпеÑедаÑÑÑÑÑипа даннÑÑ , индекÑиÑÑемого даннÑм клаÑÑом опеÑаÑоÑов. ÐÑо Ñделано Ð´Ð»Ñ ÑдобÑÑва повÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñей ÑÑнкÑииpg_type.oidequalimageв ÑазнÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑли ÑипopcintypeподдеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ñавила ÑоÑÑиÑовки, ÑÑнкÑииequalimageбÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼PG_GET_COLLATION().С ÑоÑки зÑÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов возвÑаÑаемое знаÑение
trueознаÑаеÑ, ÑÑо возможно безопаÑное пÑименение иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов (или оно безопаÑно Ð´Ð»Ñ Ð¿Ñавила ÑоÑÑиÑовки, OID коÑоÑого бÑл пеÑедан ÑÑнкÑииequalimage). Ðднако код ÑдÑа бÑÐ´ÐµÑ ÑÑиÑаÑÑ Ð¸ÑклÑÑение дÑбликаÑов безопаÑнÑм Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа, ÑолÑко еÑли Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа в ÑÑом индекÑе иÑполÑзÑеÑÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов, ÑегиÑÑÑиÑÑÑÑий ÑÑнкÑиÑequalimage, и вÑе ÑÑи ÑÑнкÑии пÑи вÑзове возвÑаÑаÑÑtrue.РавенÑÑво обÑазов поÑÑи ÑавнознаÑно пÑоÑÑÐ¾Ð¼Ñ Ð±Ð¸ÑÐ¾Ð²Ð¾Ð¼Ñ ÑавенÑÑвÑ. Ðо еÑÑÑ Ð¾Ð´Ð½Ð¾ неболÑÑое ÑазлиÑие: когда индекÑиÑÑеÑÑÑ Ñип даннÑÑ varlena, пÑедÑÑавление двÑÑ ÑавнÑÑ Ð¾Ð±Ñазов на диÑке Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¸Ð·-за ÑазлиÑного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑжаÑÐ¸Ñ TOAST к Ð²Ñ Ð¾Ð´Ð½Ñм даннÑм. ÐовоÑÑ ÑоÑмалÑно, когда ÑÑнкÑиÑ
equalimageклаÑÑа опеÑаÑоÑов возвÑаÑаеÑtrue, можно полагаÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ð° Cdatum_image_eq()гаÑанÑиÑованно бÑÐ´ÐµÑ ÑоглаÑованной Ñ ÑÑнкÑиейorderклаÑÑа опеÑаÑоÑов (пÑи ÑÑловии пеÑедаÑи обеим ÑÑнкÑиÑм одинакового OID пÑавила ÑоÑÑиÑовки).Ðод ÑдÑа в пÑинÑипе не Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо вÑÐ²Ð¾Ð´Ñ Ð¾ ÑвойÑÑве клаÑÑа опеÑаÑоÑов «ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов» в ÑемейÑÑве опеÑаÑоÑов Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва Ñипов, анализиÑÑÑ Ð´ÑÑгие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов в Ñом же ÑемейÑÑве. Также не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла ÑегиÑÑÑиÑоваÑÑ Ð¼ÐµÐ¶ÑиповÑÑ ÑÑнкÑиÑ
equalimageÐ´Ð»Ñ ÑемейÑÑва опеÑаÑоÑов, и пÑи попÑÑке ÑделаÑÑ ÑÑо пÑоизойдÑÑ Ð¾Ñибка. ÐÑо ÑвÑзано Ñ Ñем, ÑÑо ÑвойÑÑво «ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов» завиÑÐ¸Ñ Ð½Ðµ ÑолÑко Ð¾Ñ ÑеманÑики ÑоÑÑиÑовки/ÑавенÑÑва, опÑеделÑемой в некоÑоÑой ÑÑепени на ÑÑовне ÑемейÑÑва опеÑаÑоÑов. ÐообÑе говоÑÑ, ÑÑо ÑвойÑÑво оÑноÑиÑÑÑ Ðº конкÑеÑÐ½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¸ должно ÑаÑÑмаÑÑиваÑÑÑÑ Ð¾ÑделÑно.ÐÐ»Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов, поÑÑавлÑемÑÑ Ð² базовом пÑодÑкÑе Postgres Pro, пÑинÑÑо ÑоглаÑение ÑегиÑÑÑиÑоваÑÑ ÑнивеÑÑалÑнÑÑ ÑÑнкÑиÑ
equalimage. ÐолÑÑинÑÑво клаÑÑов опеÑаÑоÑов ÑегиÑÑÑиÑÑÑÑ Ð² каÑеÑÑве Ñакой ÑÑнкÑииbtequalimage(), коÑоÑÐ°Ñ ÑÑÑанавливаеÑ, ÑÑо иÑклÑÑение дÑбликаÑов безопаÑно без дополниÑелÑнÑÑ ÑÑловий. ÐпеÑаÑоÑÑ ÐºÐ»Ð°ÑÑов Ð´Ð»Ñ Ñипов даннÑÑ , поддеÑживаÑÑÐ¸Ñ Ð¿Ñавила ÑоÑÑиÑовки, напÑимеÑ, Ð´Ð»Ñ Ñипаtext, ÑегиÑÑÑиÑÑÑÑ ÑÑнкÑиÑbtvarstrequalimage(), коÑоÑÐ°Ñ ÑÑÑанавливаеÑ, ÑÑо иÑклÑÑение дÑбликаÑов безопаÑно Ñ Ð´ÐµÑеÑминиÑованнÑми пÑавилами ÑоÑÑиÑовки. ÐÐ»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑдка в ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаÑÑиÑениÑÑ Ñакже ÑекомендÑеÑÑÑ ÑегиÑÑÑиÑоваÑÑ Ð¸Ñ ÑобÑÑвеннÑе ÑÑнкÑииequalimage.optionsРдополнение ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии
options(«паÑамеÑÑÑ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов»), ÑегиÑÑÑиÑÑемÑе под номеÑом 5. ÐÑи ÑÑнкÑии позволÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð½Ð°Ð±Ð¾Ñ Ð²Ð¸Ð´Ð¸Ð¼ÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð°ÑамеÑÑов, ÑпÑавлÑÑÑÐ¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ клаÑÑа опеÑаÑоÑов.ÐпоÑÐ½Ð°Ñ ÑÑнкÑиÑ
optionsдолжна имеÑÑ ÑигнаÑÑÑÑoptions(
reloptslocal_relopts *) returns voidÐÑой ÑÑнкÑии пеÑедаÑÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ
local_relopts, в коÑоÑÑÑ Ð½Ñжно внеÑÑи Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов, оÑноÑÑÑÐ¸Ñ ÑÑ Ðº клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐбÑаÑаÑÑÑÑ Ðº ÑÑим паÑамеÑÑам из дÑÑÐ³Ð¸Ñ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼Ð°ÐºÑоÑовPG_HAS_OPCLASS_OPTIONS()иPG_GET_OPCLASS_OPTIONS().РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑиÑ
optionsне опÑеделена ни Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из клаÑÑов опеÑаÑоÑов btree. Сама оÑганизаÑÐ¸Ñ B-деÑева не позволÑÐµÑ Ð³Ð¸Ð±ÐºÐ¾ менÑÑÑ Ð¿ÑедÑÑавление клÑÑей, как ÑÑо возможно Ñ GiST, SP-GiST, GIN и BRIN. ÐоÑÑÐ¾Ð¼Ñ Ñ ÑÑÑеÑÑвÑÑÑим меÑодом доÑÑÑпа к индекÑÑ-B-деÑÐµÐ²Ñ Ð´Ð»Ñ ÑÑнкÑииoptionsÐ½ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¿Ñименений. Тем не менее ÑÑа опоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±Ñла добавлена Ð´Ð»Ñ B-деÑева Ñади единообÑÐ°Ð·Ð¸Ñ Ð¸ не иÑклÑÑено, ÑÑо она окажеÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ по меÑе ÑазвиÑÐ¸Ñ ÑеализаÑии B-деÑева в Postgres Pro.skipsupportÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑопÑÑка ÑаÑÑей индекÑа, коÑоÑÐ°Ñ ÑегиÑÑÑиÑÑеÑÑÑ Ð¿Ð¾Ð´ номеÑом опоÑной ÑÑнкÑии 6. ÐлагодаÑÑ ÑÑой ÑÑнкÑии код B-деÑева Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑебиÑаÑÑ Ð²Ñе возможнÑе знаÑÐµÐ½Ð¸Ñ Ñипа даннÑÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑого опÑеделÑн клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов (в поÑÑдке пÑоÑÑÑанÑÑва клÑÑей). Ðод ÑдÑа иÑполÑзÑÐµÑ ÑÑÐ¾Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ во вÑÐµÐ¼Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑимизаÑии пÑопÑÑка пÑи ÑканиÑовании. ÐадейÑÑвованнÑе в ÑÑом пÑогÑаммнÑе инÑеÑÑейÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²
src/include/utils/skipsupport.h.ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов, не пÑедоÑÑавлÑÑÑие ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑопÑÑка ÑаÑÑей индекÑа, вÑÑ Ð¶Ðµ могÑÑ Ð¸ÑполÑзоваÑÑ Ð¿ÑопÑÑк пÑи ÑканиÑовании. Ðод ÑдÑа Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð°Ð»ÑÑеÑнаÑивнÑÑ ÑÑÑаÑегиÑ, коÑоÑÐ°Ñ Ð½Ðµ Ñак ÑÑÑекÑивна Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¸ÑкÑеÑнÑÑ Ñипов. ÐÑедоÑÑавлÑÑÑ ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑопÑÑка ÑаÑÑей индекÑа Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов непÑеÑÑвнÑÑ Ñипов обÑÑно не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла (иногда и невозможно).
РегиÑÑÑиÑоваÑÑ ÑÑнкÑиÑ
skipsupportÐ´Ð»Ñ ÑемейÑÑва опеÑаÑоÑов ÑазнÑÑ Ñипов Ð½ÐµÑ ÑмÑÑла, и попÑÑка ÑделаÑÑ ÑÑо завеÑÑиÑÑÑ Ð¾Ñибкой. ÐÑиÑина в Ñом, ÑÑо ÑледÑÑÑее индекÑиÑÑемое знаÑение должно опÑеделÑÑÑÑÑ Ð¿ÑÑÑм ÑвелиÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑениÑ, ÑкопиÑованного из коÑÑежа индекÑа. ÐÑе ÑгенеÑиÑованнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑинадлежаÑÑ ÑÐ¾Ð¼Ñ Ð¶Ðµ нижележаÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ («пÑопÑÑенномÑ» ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ ).
63.1.4. РеализаÑÐ¸Ñ #
Ð ÑÑом Ñазделе оÑвеÑаÑÑÑÑ Ð´ÐµÑали ÑеализаÑии индекÑа-B-деÑева, знание коÑоÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ ÑпеÑиалиÑÑов.
63.1.4.1. СÑÑÑкÑÑÑа B-деÑева #
ÐндекÑÑ-B-деÑевÑÑ Ð² Postgres Pro пÑедÑÑавлÑÑÑ Ñобой многоÑÑовневÑе иеÑаÑÑ Ð¸ÑеÑкие ÑÑÑÑкÑÑÑÑ, в коÑоÑÑÑ ÐºÐ°Ð¶Ð´Ñй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´ÐµÑева Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÐºÐ°Ðº двÑÑвÑзнÑй ÑпиÑок ÑÑÑаниÑ. ÐдинÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑаÑÑÑаниÑа индекÑа Ñ ÑаниÑÑÑ Ð² ÑикÑиÑованной позиÑии в наÑале пеÑвого Ñайла ÑегменÑа индекÑа. ÐÑе оÑÑалÑнÑе ÑÑÑаниÑÑ Ð´ÐµÐ»ÑÑÑÑ Ð½Ð° внÑÑÑенние и на лиÑÑовÑе. ÐиÑÑовÑе ÑÑÑаниÑÑ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð½Ð° Ñамом нижнем ÑÑовне деÑева. ÐÑе более вÑÑокие ÑÑовни ÑоÑÑоÑÑ Ð¸Ð· внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑÑÑаниÑ. ÐиÑÑÐ¾Ð²Ð°Ñ ÑÑÑаниÑа ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾ÑÑежи, ÑказÑваÑÑие на ÑÑÑоки в ÑаблиÑе, а внÑÑÑеннÑÑ ÑÑÑаниÑа â коÑÑежи, ÑказÑваÑÑие на ÑледÑÑÑий ÑÑÐ¾Ð²ÐµÐ½Ñ Ð² деÑеве. ÐбÑÑно лиÑÑовÑе ÑÑÑаниÑÑ ÑоÑÑавлÑÑÑ Ð¾ÐºÐ¾Ð»Ð¾ 99% вÑÐµÑ ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. Ð Ð´Ð»Ñ ÑÐµÑ , и Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¾Ð´Ð¸Ð½ ÑÑандаÑÑнÑй ÑоÑмаÑ, опиÑаннÑй в Разделе 64.6.
ÐовÑе лиÑÑовÑе ÑÑÑаниÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² B-деÑево когда ÑÑÑеÑÑвÑÑÑÐ°Ñ Ð»Ð¸ÑÑÐ¾Ð²Ð°Ñ ÑÑÑаниÑа не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑиÑÑ Ð½Ð¾Ð²Ñй поÑÑÑпаÑÑий коÑÑеж. ÐÑи ÑÑом вÑполнÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ, оÑвобождаÑÑÐ°Ñ Ð¼ÐµÑÑо на пеÑеполнивÑейÑÑ ÑÑÑаниÑе, пеÑеноÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво изнаÑалÑно ÑодеÑжаÑÐ¸Ñ ÑÑ Ð½Ð° ней ÑлеменÑов на новÑÑ ÑÑÑаниÑÑ. ÐÑи Ñазделении ÑÑÑаниÑÑ Ð² ÐµÑ ÑодиÑелÑÑкÑÑ ÑÑÑаниÑÑ Ñакже должна бÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° ÑÑÑлка вниз, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑ Ð¿ÑоизвеÑÑи Ñазделение и ÑÑой ÑодиÑелÑÑкой ÑÑÑаниÑÑ. Разделение ÑÑÑÐ°Ð½Ð¸Ñ Â«ÐºÐ°Ñкадно поднимаеÑÑÑ Ð²Ð²ÐµÑÑ Â» ÑекÑÑÑивнÑм обÑазом. Ðогда же и коÑÐ½ÐµÐ²Ð°Ñ ÑÑÑаниÑа не Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑиÑÑ Ð½Ð¾Ð²ÑÑ ÑÑÑÐ»ÐºÑ Ð²Ð½Ð¸Ð·, пÑоизводиÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ñневой ÑÑÑаниÑÑ. ÐÑи ÑÑом в ÑÑÑÑкÑÑÑÑ Ð´ÐµÑева добавлÑеÑÑÑ Ð½Ð¾Ð²Ñй ÑÑовенÑ, на коÑоÑом оказÑваеÑÑÑ Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾ÑÐ½ÐµÐ²Ð°Ñ ÑÑÑаниÑа, ÑÑоÑÑÐ°Ñ Ð½Ð°Ð´ Ñой, ÑÑо бÑла коÑневой Ñанее.
63.1.4.2. ÐоÑÑ Ð¾Ð´ÑÑее Ñдаление индекÑнÑÑ ÐºÐ¾ÑÑежей #
Ð ÑеализаÑии индекÑов-B-деÑевÑев не ÑÑиÑÑваеÑÑÑ, ÑÑо в ÑÑеде MVCC Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко веÑÑий одной логиÑеÑкой ÑÑÑоки ÑаблиÑÑ; Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа каждÑй коÑÑеж ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑм обÑекÑом, ÑÑебÑÑÑим оÑделÑного ÑлеменÑа в индекÑе. ÐоÑÑежи «оÑÑабоÑаннÑÑ
веÑÑий» иногда могÑÑ Ð½Ð°ÐºÐ°Ð¿Ð»Ð¸Ð²Ð°ÑÑÑÑ, ÑÑо ÑÑеваÑо задеÑжками и замедлением пÑи вÑполнении запÑоÑов. ÐÑо обÑÑно пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи нагÑÑзке Ñ Ð¿Ñеобладанием UPDATE, когда Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва оÑделÑнÑÑ
опеÑаÑий Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
нелÑÐ·Ñ Ð¿ÑимениÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ HOT. Ðзменение знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð¶Ðµ одного индекÑиÑÑемого ÑÑолбÑа во вÑÐµÐ¼Ñ UPDATE вÑегда ÑÑебÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ набоÑа индекÑнÑÑ
коÑÑежей â оÑделÑного коÑÑежа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ индекÑа в ÑаблиÑе. Ðолее Ñого, обÑаÑиÑе внимание, ÑÑо новÑе коÑÑежи ÑÑебÑÑÑÑÑ Ð¸ Ð´Ð»Ñ ÑеÑ
индекÑов, коÑоÑÑе не бÑли «логиÑеÑки измененÑ» командой UPDATE. Ðо вÑеÑ
индекÑаÑ
бÑдÑÑ Ð½ÑÐ¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑизиÑеÑкие коÑÑежи, ÑказÑваÑÑие на поÑледнÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки в ÑаблиÑе. ÐаждÑй новÑй коÑÑеж в каждом индекÑе, как пÑавило, должен ÑоÑÑÑеÑÑвоваÑÑ Ñ Ð¸ÑÑ
однÑм подвеÑгÑимÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾ÑÑежем в ÑеÑение коÑоÑкого пеÑиода вÑемени (обÑÑно недолго поÑле ÑикÑаÑии ÑÑанзакÑии UPDATE).
РиндекÑаÑ
-B-деÑевÑÑÑ
поÑÑепенно ÑдалÑÑÑÑÑ ÐºÐ¾ÑÑежи оÑÑабоÑаннÑÑ
веÑÑий в Ñ
оде пÑоÑедÑÑÑ Ð²Ð¾ÑÑ
одÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ
коÑÑежей. ÐаждÑй пÑоÑ
од пÑоÑедÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²ÑзÑваеÑÑÑ, когда ожидаеÑÑÑ, ÑÑо пÑоизойдÑÑ Â«Ñазделение ÑÑÑÐ°Ð½Ð¸Ñ Ð¸Ð·-за оÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий». ÐÑо каÑаеÑÑÑ ÑолÑко ÑеÑ
индекÑов, коÑоÑÑе не бÑли логиÑеÑки Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑоÑами UPDATE, Ñак как именно в ниÑ
возможно конÑенÑÑиÑованное накопление ÑÑÑаÑевÑиÑ
веÑÑий на опÑеделÑннÑÑ
ÑÑÑаниÑаÑ
. РеализаÑÐ¸Ñ Ð¾Ð±ÑÑно ÑÑаÑаеÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑ, Ñ
оÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ возможно, ÑÑо опÑеделÑннÑе ÑеÑÐµÐ½Ð¸Ñ Ð½Ð° ÐµÑ ÑÑовне не позволÑÑ Ð¸Ð´ÐµÐ½ÑиÑиÑиÑоваÑÑ Ð¸ ÑдалиÑÑ Ð½Ð¸ одного мÑÑоÑного коÑÑежа в индекÑе (в ÑÑом ÑлÑÑае пÑоблема ÑазмеÑÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ коÑÑежа на заполненной лиÑÑовой ÑÑÑаниÑе ÑеÑаеÑÑÑ Ð¿ÑÑÑм ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ Ð¸Ð»Ð¸ в ÑезÑлÑÑаÑе иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов). ÐолÑÑое колиÑеÑÑво веÑÑий каждой оÑделÑной логиÑеÑкой ÑÑÑоки, коÑоÑое нÑжно пÑоÑиÑаÑÑ Ð¿Ñи каждом ÑканиÑовании индекÑа, ÑвлÑеÑÑÑ Ð²Ð°Ð¶Ð½Ñм оÑÑиÑаÑелÑнÑм ÑакÑоÑом обÑей пÑоизводиÑелÑноÑÑи и ÑкоÑоÑÑи оÑклика ÑиÑÑемÑ. ÐÑоÑедÑÑа воÑÑ
одÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ
коÑÑежей вÑбиÑÐ°ÐµÑ Ð½Ð° лиÑÑовой ÑÑÑаниÑе пÑедположиÑелÑно мÑÑоÑнÑе коÑÑежи на оÑновании каÑеÑÑвеннÑÑ
Ñ
аÑакÑеÑиÑÑик, опÑеделÑемÑÑ
логиÑеÑкими ÑÑÑоками и веÑÑиÑми. ÐÑо оÑлиÑÐ°ÐµÑ ÐµÑ Ð¾Ñ Â«Ð½Ð¸ÑÑ
одÑÑей» ÑбоÑки индекÑа, вÑполнÑемой пÑоÑеÑÑами авÑооÑиÑÑки, коÑоÑÐ°Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð¿Ñи пÑевÑÑении опÑеделÑннÑÑ
колиÑеÑÑвеннÑÑ
поÑоговÑÑ
знаÑений на ÑÑовне ÑаблиÑÑ (Ñм. ÐодÑаздел 23.1.6).
ÐÑимеÑание
Ðе вÑе опеÑаÑии ÑдалениÑ, вÑполнÑемÑе в индекÑаÑ
-B-деÑевÑÑÑ
, ÑеализÑÑÑÑÑ Ð¿ÑоÑедÑÑой воÑÑ
одÑÑего ÑдалениÑ. СÑÑеÑÑвÑÐµÑ Ð´ÑÑÐ³Ð°Ñ ÐºÐ°ÑегоÑÐ¸Ñ ÑакиÑ
опеÑаÑий: пÑоÑÑое Ñдаление индекÑнÑÑ
коÑÑежей. ÐÑо оÑÐ»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¾Ð±ÑлÑживаниÑ, ÑдалÑÑÑÐ°Ñ Ð¸Ð½Ð´ÐµÐºÑнÑе коÑÑежи, о коÑоÑÑÑ
извеÑÑно, ÑÑо иÑ
можно безопаÑно ÑÑеÑеÑÑ (Ñо еÑÑÑ Ñе, Ð´Ð»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов коÑоÑÑÑ
ÑÑÑановлен Ð±Ð¸Ñ LP_DEAD). Ðак и воÑÑ
одÑÑее Ñдаление индекÑнÑÑ
коÑÑежей, пÑоÑÑое Ñдаление пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ, когда ожидаеÑÑÑ Ñазделение ÑÑÑаниÑÑ, Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ ÑÑого ÑазделениÑ.
ÐÑоÑÑое Ñдаление вÑполнÑеÑÑÑ Ð¿Ð¾ возможноÑÑи в Ñом ÑмÑÑле, ÑÑо оно Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи ÑолÑко пÑи ÑÑловии, ÑÑо в ÑезÑлÑÑаÑе недавниÑ
ÑканиÑований индекÑа бÑли ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð±Ð¸ÑÑ LP_DEAD Ð´Ð»Ñ Ð¾Ð±ÑабоÑаннÑÑ
ÑлеменÑов. Ðо Postgres Pro 14 единÑÑвенной каÑегоÑией опеÑаÑий ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð² B-деÑеве бÑло пÑоÑÑое Ñдаление. ÐÑновное ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоÑÑÑм и воÑÑ
одÑÑим Ñдалением заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑолÑко пеÑвое обÑÑловлено акÑивноÑÑÑÑ ÑканиÑований индекÑа, а вÑоÑое оÑиенÑиÑовано именно на акÑивноÑÑÑ Ð¾ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий, вÑзÑваемÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ UPDATE, коÑоÑÑе не изменÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑки индекÑиÑованнÑе ÑÑолбÑÑ.
ÐÑи опÑеделÑнной нагÑÑзке воÑÑ
одÑÑее Ñдаление индекÑнÑÑ
коÑÑежей вÑполнÑÐµÑ Ð¾ÑновнÑÑ ÑабоÑÑ Ð¿Ð¾ ÑбоÑке мÑÑоÑнÑÑ
коÑÑежей из индекÑов. Такой ÑÑÑÐµÐºÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑÑÑ Ð´Ð»Ñ Ð»Ñбого индекÑа-B-деÑева, коÑоÑÑй в знаÑиÑелÑной меÑе заÑÑагиваеÑÑÑ Ð°ÐºÑивноÑÑÑÑ Ð¾ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÐµÑÑий из-за команд UPDATE, поÑÑи никогда не изменÑÑÑиÑ
логиÑеÑки ÑÑолбÑÑ, покÑÑваемÑе индекÑом. СÑеднее и наиболÑÑее колиÑеÑÑво веÑÑий Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑÑÑоки Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð½Ð° низком ÑÑовне иÑклÑÑиÑелÑно за ÑÑÑÑ Ð¿Ð¾ÑÑоÑннÑÑ
ÑоÑеÑнÑÑ
пÑоÑ
одов ÑдалениÑ. Ðполне возможно, ÑÑо ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð¿ÑеделÑннÑÑ
индекÑов на диÑке никогда не ÑвелиÑиÑÑÑ Ð½Ð¸ на Ð¾Ð´Ð½Ñ ÑÑÑаниÑÑ/блок, неÑмоÑÑÑ Ð½Ð° поÑÑоÑнное оÑÑабаÑÑвание веÑÑий, вÑзÑваемое командами UPDATE. Ðо даже в ÑÑом ÑлÑÑае в конÑе конÑов поÑÑебÑеÑÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ Â«Ð·Ð°ÑиÑÑка» индекÑа пÑоÑедÑÑой VACUUM (обÑÑно запÑÑкаемой в ÑабоÑем пÑоÑеÑÑе авÑооÑиÑÑки) как ÑаÑÑÑ ÑовмеÑÑной ÑбоÑки ÑаблиÑÑ Ð¸ вÑеÑ
ÐµÑ Ð¸Ð½Ð´ÐµÐºÑов.
РоÑлиÑие Ð¾Ñ VACUUM, воÑÑ
одÑÑее Ñдаление не даÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
надÑжнÑÑ
гаÑанÑий оÑноÑиÑелÑно возÑаÑÑа ÑÑаÑейÑего мÑÑоÑного индекÑного коÑÑежа. Ðи в одном индекÑе не допÑÑкаеÑÑÑ ÑоÑ
Ñанение «плаваÑÑиÑ
мÑÑоÑнÑÑ
» коÑÑежей, ÑÑавÑиÑ
мÑÑÑвÑми до конÑеÑваÑивной ÑоÑки оÑÑеÑениÑ, ÑвлÑÑÑейÑÑ Ð¾Ð±Ñей Ð´Ð»Ñ ÑаблиÑÑ Ð¸ вÑеÑ
ÐµÑ Ð¸Ð½Ð´ÐµÐºÑов. ÐÑÐ¾Ñ ÑÑндаменÑалÑнÑй инваÑÐ¸Ð°Ð½Ñ Ð½Ð° ÑÑовне ÑаблиÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾Ð±ÐµÑпеÑиваÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ ÑиÑкÑлÑÑÐ¸Ñ ÑаблиÑнÑÑ
иденÑиÑикаÑоÑов (TID). Ðменно Ñаким обÑазом ÑазнÑе логиÑеÑкие ÑÑÑоки могÑÑ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ иденÑиÑикаÑÐ¾Ñ Ñ ÑеÑением вÑемени (Ñ
оÑÑ ÑÑо невозможно Ð´Ð»Ñ Ð´Ð²ÑÑ
логиÑеÑкиÑ
ÑÑÑок, вÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ коÑоÑÑÑ
ÑкладÑваеÑÑÑ Ð² один и ÑÐ¾Ñ Ð¶Ðµ Ñикл VACUUM).
63.1.4.3. ÐÑклÑÑение дÑбликаÑов #
ÐÑбликаÑом назÑваеÑÑÑ ÐºÐ¾ÑÑеж на лиÑÑовой ÑÑÑаниÑе (коÑÑеж, ÑказÑваÑÑий на ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ), Ñ ÐºÐ¾ÑоÑого вÑе клÑÑевÑе ÑÑолбÑÑ Ð¸Ð½Ð´ÐµÐºÑа имеÑÑ Ð·Ð½Ð°ÑениÑ, ÑооÑвеÑÑÑвÑÑÑие знаÑениÑм ÑÑолбÑов из как минимÑм одного дÑÑгого коÑÑежа на лиÑÑовой ÑÑÑаниÑе в Ñом же индекÑе. ÐÑблиÑÑÑÑиеÑÑ ÐºÐ¾ÑÑежи доволÑно ÑаÑÑо вÑÑÑеÑаÑÑÑÑ Ð½Ð° пÑакÑике. РиндекÑÐ°Ñ -B-деÑевÑÑÑ Ñакие дÑбликаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð¾ÑобÑм ÑкономиÑнÑм обÑазом пÑи вклÑÑении дополниÑелÑного Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° â иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов.
РабоÑа ÑÑого Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° заклÑÑаеÑÑÑ Ð² пеÑиодиÑеÑком обÑединении гÑÑпп дÑблиÑÑÑÑÐ¸Ñ ÑÑ ÐºÐ¾ÑÑежей и ÑоÑмиÑовании одного коÑÑежа Ñо ÑпиÑком иденÑиÑикаÑоÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ гÑÑппÑ. Ð Ñаком пÑедÑÑавлении знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑевÑÑ ÑÑолбÑов Ñ ÑанÑÑÑÑ Ð² единÑÑвенном ÑкземплÑÑе, а за ними идÑÑ Ð¾ÑÑоÑÑиÑованнÑй маÑÑив иденÑиÑикаÑоÑов TID, ÑказÑваÑÑÐ¸Ñ Ð½Ð° ÑÑÑоки в ÑаблиÑе. ÐÑо ÑÑÑеÑÑвенно ÑменÑÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ñ ÑанÑÑÐ¸Ñ ÑÑ Ð¸Ð½Ð´ÐµÐºÑов, в коÑоÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение (или каждое ÑникалÑное ÑоÑеÑание знаÑений ÑÑолбÑов) поÑвлÑеÑÑÑ Ð² ÑÑеднем неÑколÑко Ñаз. Ð ÑезÑлÑÑаÑе Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑвелиÑиÑÑÑÑ ÑкоÑоÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, а Ñакже могÑÑ ÑокÑаÑиÑÑÑÑ Ð¸Ð·Ð´ÐµÑжки, ÑвÑзаннÑе Ñ ÑегÑлÑÑной оÑиÑÑкой индекÑов.
ÐÑимеÑание
ÐÑклÑÑение дÑбликаÑов в B-деÑеве ÑабоÑÐ°ÐµÑ ÑÑÑекÑивно и Ñ Â«Ð´ÑбликаÑами», ÑодеÑжаÑими знаÑение NULL, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо знаÑÐµÐ½Ð¸Ñ NULL не ÑÑиÑаÑÑÑÑ ÑавнÑми Ð¼ÐµÐ¶Ð´Ñ Ñобой ÑоглаÑно опеÑаÑоÑам =, вÑ
одÑÑим в клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов btree. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑеализаÑии, ÑабоÑаÑÑей Ñ Ð²Ð½ÑÑÑенним пÑедÑÑавлением ÑÑÑÑкÑÑÑÑ B-деÑева, NULL ÑвлÑеÑÑÑ Ð¿ÑоÑÑо одним из ÑлеменÑов множеÑÑва вÑеÑ
возможнÑÑ
знаÑений в индекÑе.
ÐÑоÑеÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ð¾ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи, когда вÑÑавлÑеÑÑÑ Ð½Ð¾Ð²Ñй ÑлеменÑ, не ÑмеÑаÑÑийÑÑ Ð½Ð° ÑÑÑеÑÑвÑÑÑей лиÑÑовой ÑÑÑаниÑе, но ÑолÑко Ñогда, когда Ñдаление индекÑного коÑÑежа не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑвободиÑÑ Ð´Ð¾ÑÑаÑоÑно меÑÑа Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑлеменÑа (обÑÑно Ñдаление недолго ÑаÑÑмаÑÑиваеÑÑÑ, а заÑем пÑопÑÑкаеÑÑÑ). РоÑлиÑие Ð¾Ñ ÐºÐ¾ÑÑежей Ñо ÑпиÑками иденÑиÑикаÑоÑов GIN, в B-деÑеве ÑÑи коÑÑежи не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑаÑÑиÑÑÑÑÑÑ Ð¿Ñи каждом добавлении нового дÑбликаÑа; они пÑоÑÑо обÑазÑÑÑ Ð´ÑÑгое ÑизиÑеÑкое пÑедÑÑавление иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ логиÑеÑкого ÑодеÑжимого лиÑÑовой ÑÑÑаниÑÑ. ÐÑи Ñаком Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ обеÑпеÑиваеÑÑÑ ÑÑабилÑÐ½Ð°Ñ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¿Ñи ÑмеÑанной нагÑÑзке ÑÑениÑ-запиÑи. ÐÑклÑÑение дÑбликаÑов должно даÑÑ ÐºÐ°Ðº минимÑм замеÑное ÑвелиÑение пÑоизводиÑелÑноÑÑи Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва клиенÑÑÐºÐ¸Ñ Ð¿Ñиложений. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½Ð¾ вклÑÑено.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE INDEX и REINDEX Ñакже вÑполнÑÑÑ Ð¸ÑклÑÑение дÑбликаÑов, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ ÐºÐ¾ÑÑежи Ñо ÑпиÑками иденÑиÑикаÑоÑов, но пÑименÑÑÑ Ð½ÐµÑколÑко дÑÑгÑÑ ÑÑÑаÑегиÑ. ÐÐ°Ð¶Ð´Ð°Ñ Ð³ÑÑппа дÑблиÑÑÑÑиÑ
ÑÑ Ð¾Ð±ÑÑнÑÑ
коÑÑежей, обнаÑÑженнÑÑ
в оÑÑоÑÑиÑованнÑÑ
даннÑÑ
, пÑеобÑазÑеÑÑÑ Ð² коÑÑеж Ñо ÑпиÑком иденÑиÑикаÑоÑов до Ñого, как даннÑе добавлÑÑÑÑÑ Ð² ÑекÑÑÑÑ Ð»Ð¸ÑÑовÑÑ ÑÑÑаниÑÑ. ÐÑи ÑÑом в каждÑй Ñакой коÑÑеж ÑпаковÑваеÑÑÑ ÐºÐ°Ðº можно болÑÑе иденÑиÑикаÑоÑов (TID). ÐоÑле ÑÑого лиÑÑовÑе ÑÑÑаниÑÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð¾Ð±ÑÑнÑм ÑпоÑобом, без дополниÑелÑного пÑоÑ
ода Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов. ÐÑа ÑÑÑаÑÐµÐ³Ð¸Ñ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ CREATE INDEX и REINDEX, Ñак как они обÑабаÑÑваÑÑ Ð²Ñе даннÑе ÑÑазÑ.
ÐÑли же в пÑоÑиле нагÑÑзки пÑÐµÐ¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸ иÑклÑÑение дÑбликаÑов не пÑиноÑÐ¸Ñ Ð²ÑигÑÑÑа Ð²Ð²Ð¸Ð´Ñ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ Ð¸Ð»Ð¸ неболÑÑого ÑиÑла дÑблиÑÑÑÑиÑ
ÑÑ Ð·Ð½Ð°Ñений, ÑÑÐ¾Ñ Ð¼ÐµÑ
анизм Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑодиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие поÑÑоÑннÑе издеÑжки (еÑли он не оÑклÑÑÑн). Ð ÑакиÑ
ÑлÑÑаÑÑ
его можно оÑклÑÑиÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
индекÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ð°ÑамеÑÑа Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ deduplicate_items. ÐÑи нагÑÑзке ÑолÑко на ÑÑение никакие дополниÑелÑнÑе издеÑжки не возникаÑÑ, Ñак как коÑÑежи Ñо ÑпиÑком иденÑиÑикаÑоÑов ÑиÑаÑÑÑÑ Ñак же ÑÑÑекÑивно, как и коÑÑежи в ÑÑандаÑÑном пÑедÑÑавлении. ÐоÑÑÐ¾Ð¼Ñ ÑаÑе вÑего оÑклÑÑение ÑÑого меÑ
анизма не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм.
ÐÑклÑÑение дÑбликаÑов иногда Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑникалÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑов (а Ñакже ÑникалÑнÑÑ Ð¾Ð³ÑаниÑений). ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дÑбликаÑÑ Ð¾ÑÑабоÑаннÑÑ Ð²ÐµÑÑий могÑÑ Ð²Ñеменно «поглоÑаÑÑÑÑ» лиÑÑовÑми ÑÑÑаниÑами. ÐÑклÑÑение дÑбликаÑов в ÑникалÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÐµÑ Ð²Ð¾ÑÑ Ð¾Ð´ÑÑее Ñдаление индекÑнÑÑ ÐºÐ¾ÑÑежей, оÑобенно в ÑÐµÑ ÑлÑÑаÑÑ , когда длиÑелÑÐ½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð´ÐµÑÐ¶Ð¸Ñ Ñнимок, пÑепÑÑÑÑвÑÑÑий ÑбоÑке мÑÑоÑа. Тем ÑамÑм вÑигÑÑваеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи ÑÑÑаÑегии воÑÑ Ð¾Ð´ÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ ÐºÐ¾ÑÑежей. ÐÑкладÑвание ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð´Ð¾ еÑÑеÑÑвенного завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ длиÑелÑной ÑÑанзакÑии позволÑÐµÑ ÑÑпеÑно пÑоизвеÑÑи пÑÐ¾Ñ Ð¾Ð´ воÑÑ Ð¾Ð´ÑÑего ÑдалениÑ, коÑоÑÑй Ñанее бÑл невозможен.
ÐодÑказка
ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи пÑовеÑÑи пÑоÑедÑÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов в ÑникалÑном индекÑе пÑименÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑообÑажениÑ. Ð ÑакиÑ
индекÑаÑ
как пÑавило можно пеÑейÑи ÑÑÐ°Ð·Ñ Ðº ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð»Ð¸ÑÑовой ÑÑÑаниÑÑ, не ÑаÑÑ
одÑÑ Ð»Ð¸Ñние ÑÐ¸ÐºÐ»Ñ Ð½Ð° беÑполезнÑе пÑоÑ
Ð¾Ð´Ñ Ð² поиÑке дÑбликаÑов. ÐÑли Ð²Ð°Ñ Ð±ÐµÑпокоÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе издеÑжки, коÑоÑÑе могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¸ÑклÑÑением дÑбликаÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð·Ð½Ð°Ñение deduplicate_items = off Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
индекÑов. Ðднако его вполне можно оÑÑавиÑÑ Ð²ÐºÐ»ÑÑÑннÑм и Ð´Ð»Ñ ÑникалÑнÑÑ
индекÑов.
ÐÑклÑÑение дÑбликаÑов Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð½Ðµ вÑегда Ð²Ð²Ð¸Ð´Ñ Ð¾Ð³ÑаниÑений на ÑÑовне ÑеализаÑии. ÐозможноÑÑÑ ÐµÐ³Ð¾ пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ CREATE INDEX или REINDEX.
УÑÑиÑе, ÑÑо иÑклÑÑение дÑбликаÑов ÑÑиÑаеÑÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑм и не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÑлÑÑаÑÑ , когда Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑеманÑиÑеÑкие ÑазлиÑÐ¸Ñ ÑавнÑÑ Ð·Ð½Ð°Ñений:
ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ñ Ñипами
text,varcharиcharв ÑлÑÑае иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑÑ Ð¿Ñавил ÑоÑÑиÑовки, Ñак как в ÑавнÑÑ Ð·Ð½Ð°ÑениÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе ÑазлиÑÐ¸Ñ Ð² ÑегиÑÑÑе и диакÑиÑиÑеÑÐºÐ¸Ñ Ð·Ð½Ð°ÐºÐ°Ñ .ÐÑклÑÑение дÑбликаÑов невозможно Ñ Ñипом
numeric, Ñак как Ð´Ð»Ñ ÑавнÑÑ Ð·Ð½Ð°Ñений должен ÑÐ¾Ñ ÑанÑÑÑÑÑ ÑиÑловой маÑÑÑаб, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазнÑм.ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ñ Ñипом
jsonb, Ñак как внÑÑÑи клаÑÑа опеÑаÑоÑов B-деÑеваjsonbиÑполÑзÑеÑÑÑ Ñипnumeric.ÐÑклÑÑение дÑбликаÑов невозможно Ð´Ð»Ñ Ñипов
float4иfloat8. Ð ÑÑÐ¸Ñ ÑÐ¸Ð¿Ð°Ñ Ð¸Ð¼ÐµÑÑÑÑ ÑазнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений-0и0, коÑоÑÑе пÑи ÑÑом ÑÑиÑаÑÑÑÑ ÑавнÑми. Ðднако оÑлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ должно ÑÐ¾Ñ ÑанÑÑÑÑÑ.
ÐмееÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение на ÑÑовне ÑеализаÑии, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑнÑÑо в бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ Postgres Pro:
ÐÑклÑÑение дÑбликаÑов невозможно Ñ Ñипами-конÑейнеÑами (ÑÑо ÑоÑÑавнÑе, диапазоннÑе ÑипÑ, а Ñакже маÑÑивÑ).
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ огÑаниÑение на ÑÑовне ÑеализаÑии, дейÑÑвÑÑÑее вне завиÑимоÑÑи Ð¾Ñ Ð¿ÑименÑемого клаÑÑа опеÑаÑоÑов или пÑавила ÑоÑÑиÑовки:
ÐÑклÑÑение дÑбликаÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² индекÑÐ°Ñ Ñ
INCLUDE.