61.2. ФÑнкÑии Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ Ð¼ÐµÑодов доÑÑÑпа
ÐндекÑнÑй меÑод доÑÑÑпа должен опÑеделиÑÑ Ð² IndexAmRoutine ÑледÑÑÑие ÑÑнкÑии поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸ обÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов:
IndexBuildResult *
ambuild (Relation heapRelation,
Relation indexRelation,
IndexInfo *indexInfo); СÑÑÐ¾Ð¸Ñ Ð½Ð¾Ð²Ñй индекÑ. ÐÑноÑение индекÑа Ñже ÑизиÑеÑки Ñоздано, но пока пÑÑÑо. Ðно должно бÑÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑикÑиÑованнÑми даннÑми, коÑоÑÑе ÑÑебÑÑÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, и запиÑÑми Ð´Ð»Ñ Ð²ÑеÑ
коÑÑежей, Ñже ÑÑÑеÑÑвÑÑÑиÑ
в ÑаблиÑе. ÐбÑÑно ÑÑнкÑÐ¸Ñ ambuild вÑзÑÐ²Ð°ÐµÑ table_index_build_scan() Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка в ÑаблиÑе ÑÑÑеÑÑвÑÑÑиÑ
коÑÑежей и Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑавлÑÑÑÑÑ Ð² ÑÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc и ÑодеÑжаÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ индекÑа.
void ambuildempty (Relation indexRelation);
СоздаÑÑ Ð¿ÑÑÑой Ð¸Ð½Ð´ÐµÐºÑ Ð¸ запиÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ в Ñлой иниÑиализаÑии (INIT_FORKNUM) данного оÑноÑениÑ. ÐÑÐ¾Ñ Ð¼ÐµÑод вÑзÑваеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐ¶ÑÑналиÑÑемÑÑ
индекÑов; пÑÑÑой индекÑ, запиÑаннÑй в Ñлой иниÑиализаÑии, бÑÐ´ÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑÑÑ Ð² оÑновной Ñлой оÑноÑÐµÐ½Ð¸Ñ Ð¿Ñи каждом пеÑезапÑÑке ÑеÑвеÑа.
bool
aminsert (Relation indexRelation,
Datum *values,
bool *isnull,
ItemPointer heap_tid,
Relation heapRelation,
IndexUniqueCheck checkUnique,
bool indexUnchanged,
IndexInfo *indexInfo); ÐÑÑавлÑÐµÑ Ð½Ð¾Ð²Ñй коÑÑеж в ÑÑÑеÑÑвÑÑÑий индекÑ. РмаÑÑиваÑ
values и isnull пеÑедаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑоиндекÑиÑованÑ, а в heap_tid â иденÑиÑикаÑÐ¾Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого коÑÑежа (TID). ÐÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑникалÑнÑе индекÑÑ (Ñлаг amcanunique ÑÑÑановлен), паÑамеÑÑ checkUnique ÑказÑваеÑ, ÐºÐ°ÐºÐ°Ñ Ð¿ÑовеÑка ÑникалÑноÑÑи должна вÑполнÑÑÑÑÑ. ÐÑо завиÑÐ¸Ñ Ð¾Ñ Ñого, ÑвлÑеÑÑÑ Ð»Ð¸ огÑаниÑение ÑникалÑноÑÑи оÑкладÑваемÑм; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 61.5. ÐбÑÑно паÑамеÑÑ heapRelation нÑжен меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа ÑолÑко Ð´Ð»Ñ Ð¿ÑовеÑки ÑникалÑноÑÑи (Ñак как он должен обÑаÑиÑÑÑÑ Ðº оÑновнÑм даннÑм, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ Ð² акÑÑалÑноÑÑи коÑÑежа).
ÐÑлево знаÑение indexUnchanged даÑÑ Â«Ð¿Ð¾Ð´ÑказкÑ» о пÑиÑоде индекÑиÑÑемого коÑÑежа. Ðогда ÑÑо знаÑение â true, коÑÑеж ÑвлÑеÑÑÑ Ð´ÑбликаÑом некоÑоÑого ÑÑÑеÑÑвÑÑÑего коÑÑежа в индекÑе. ÐовÑй коÑÑеж ÑвлÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑки неизменÑннÑм, ÑозданнÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ веÑÑии MVCC. Такие коÑÑежи поÑвлÑÑÑÑÑ, когда вÑполнÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ UPDATE, коÑоÑÐ°Ñ Ð½Ðµ менÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑÑолбÑÑ, оÑ
ваÑÑваемÑе индекÑом, но Ñем не менее ÑÑебÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ веÑÑии коÑÑежа в индекÑ. ÐпиÑаÑÑÑ Ð½Ð° ÑÑÑ Â«Ð¿Ð¾Ð´ÑказкÑ», индекÑнÑй меÑод Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ ÑеÑение о вÑполнении воÑÑ
одÑÑего ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑÑ
коÑÑежей в ÑаÑÑÑÑ
индекÑа, где ÑкапливаеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ веÑÑий одной и Ñой же логиÑеÑкой ÑÑÑоки. ÐамеÑÑÑе, ÑÑо изменение неклÑÑевого ÑÑолбÑа не влиÑÐµÑ Ð½Ð° знаÑение indexUnchanged. Ркоде ÑдÑа опÑеделÑеÑÑÑ Ð·Ð½Ð°Ñение indexUnchanged каждого коÑÑежа пÑи иÑполÑзовании подÑ
ода Ñ Ð½Ð¸Ð·ÐºÐ¸Ð¼Ð¸ издеÑжками, коÑоÑÑй допÑÑÐºÐ°ÐµÑ ÐºÐ°Ðº ложнÑе положиÑелÑнÑе, Ñак и ложнÑе оÑÑиÑаÑелÑнÑе ÑезÑлÑÑаÑÑ. ÐндекÑнÑе ÐРне Ð´Ð¾Ð»Ð¶Ð½Ñ ÑаÑÑмаÑÑиваÑÑ indexUnchanged как авÑоÑиÑеÑнÑй иÑÑоÑник инÑоÑмаÑии о видимоÑÑи коÑÑежа или веÑÑиониÑовании.
ÐозвÑаÑаемÑй ÑÑнкÑией бÑлев ÑезÑлÑÑÐ°Ñ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, ÑолÑко когда паÑамеÑÑ checkUnique Ñавен UNIQUE_CHECK_PARTIAL. Ð ÑÑом ÑлÑÑае ÑезÑлÑÑÐ°Ñ true ознаÑаеÑ, ÑÑо Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ñизнана ÑникалÑной, Ñогда как false ознаÑаеÑ, ÑÑо она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑникалÑной (и ÑÑебÑеÑÑÑ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ Ð¾ÑложеннÑÑ Ð¿ÑовеÑÐºÑ ÑникалÑноÑÑи). РдÑÑгиÑ
ÑлÑÑаÑÑ
ÑекомендÑеÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¿Ð¾ÑÑоÑннÑй ÑезÑлÑÑÐ°Ñ false.
ÐекоÑоÑÑе индекÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑоваÑÑ Ð½Ðµ вÑе коÑÑежи. ÐÑли коÑÑеж не бÑÐ´ÐµÑ Ð¸Ð½Ð´ÐµÐºÑиÑован, aminsert должна пÑоÑÑо завеÑÑиÑÑÑÑ, не Ð´ÐµÐ»Ð°Ñ Ð½Ð¸Ñего.
ÐÑли индекÑнÑй ÐÐ Ñ
оÑÐµÑ ÐºÐµÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑиÑми Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Ð¸Ð½Ð´ÐµÐºÑ Ð² одном опеÑаÑоÑе SQL, он Ð¼Ð¾Ð¶ÐµÑ Ð²ÑделиÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð² indexInfo->ii_Context и ÑоÑ
ÑаниÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑи даннÑе в поле indexInfo->ii_AmCache (коÑоÑое изнаÑалÑно Ñавно NULL).
IndexBulkDeleteResult *
ambulkdelete (IndexVacuumInfo *info,
IndexBulkDeleteResult *stats,
IndexBulkDeleteCallback callback,
void *callback_state); УдалÑÐµÑ ÐºÐ¾ÑÑеж(и) из индекÑа. ÐÑо опеÑаÑÐ¸Ñ Â«Ð¼Ð°ÑÑового ÑдалениÑ», коÑоÑÐ°Ñ Ð¿ÑедположиÑелÑно бÑÐ´ÐµÑ Ñеализована пÑÑÑм ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñего индекÑа и пÑовеÑки Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи, должна ли она ÑдалÑÑÑÑÑ. ÐеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ callback должна вÑзÑваÑÑÑÑ Ð² ÑÑиле callback( Ñ ÑезÑлÑÑаÑом bool, коÑоÑÑй говоÑиÑ, должна ли ÑдалÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð½Ð´ÐµÐºÑа, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ Ð¿ÐµÑедаваемÑй TID. ÐозвÑаÑаÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° NULL или ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc и ÑодеÑжаÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ ÑезÑлÑÑаÑа ÑдалениÑ. NULL можно веÑнÑÑÑ, еÑли Ð½Ð¸ÐºÐ°ÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð½Ðµ должна пеÑедаваÑÑÑÑ Ð² TID, callback_state)amvacuumcleanup.
Ðз-за огÑаниÑÐµÐ½Ð¸Ñ maintenance_work_mem пÑоÑедÑÑа ambulkdelete Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð½ÐµÑколÑко Ñаз, когда ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð¸Ñ Ð±Ð¾Ð»ÑÑое колиÑеÑÑво коÑÑежей. РаÑгÑменÑе stats пеÑедаÑÑÑÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑедÑдÑÑего вÑзова Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ индекÑа (пÑи пеÑвом вÑзове в Ñ
оде опеÑаÑии VACUUM он ÑодеÑÐ¶Ð¸Ñ NULL). ÐÑо позволÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа накапливаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð² пÑоÑеÑÑе вÑей опеÑаÑии. ÐбÑÑно ambulkdelete модиÑиÑиÑÑÐµÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ, еÑли в stats пеÑедаÑÑÑÑ Ð½Ðµ NULL.
IndexBulkDeleteResult *
amvacuumcleanup (IndexVacuumInfo *info,
IndexBulkDeleteResult *stats); ÐÑовеÑÑи ÑбоÑÐºÑ Ð¿Ð¾Ñле опеÑаÑии VACUUM (до ÑÑого ambulkdelete могла вÑзÑваÑÑÑÑ Ð½ÐµÑколÑко или Ð½Ð¾Ð»Ñ Ñаз). ÐÑ ÑÑой ÑÑнкÑии не ÑÑебÑеÑÑÑ Ð½Ð¸Ñего, кÑоме как вÑдаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ индекÑÑ, но она Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизвеÑÑи маÑÑовÑÑ ÑбоÑкÑ, напÑимеÑ, вÑÑвободиÑÑ Ð¿ÑÑÑÑе ÑÑÑаниÑÑ Ð¸Ð½Ð´ÐµÐºÑа. Ð stats ей пеÑедаÑÑÑÑ ÑÑÑÑкÑÑÑа, возвÑаÑÑÐ½Ð½Ð°Ñ Ð¿Ñи поÑледнем вÑзове ambulkdelete, либо NULL, еÑли ambulkdelete не вÑзÑвалаÑÑ, Ñак как никакие коÑÑежи ÑдалÑÑÑ Ð½Ðµ ÑÑебовалоÑÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ NULL или ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ Ð²Ñзовом palloc. СодеÑжаÑаÑÑÑ Ð² ÑÑой ÑÑÑÑкÑÑÑе ÑÑаÑиÑÑика бÑÐ´ÐµÑ Ð¾ÑÑажена в запиÑи в pg_class и попадÑÑ Ð² вÑвод ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM, еÑли она вÑполнÑлаÑÑ Ñ Ñказанием VERBOSE. NULL Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ, еÑли Ð¸Ð½Ð´ÐµÐºÑ Ð²Ð¾Ð²Ñе не изменилÑÑ Ð² пÑоÑеÑÑе опеÑаÑии VACUUM, но в пÑоÑивном ÑлÑÑае должна возвÑаÑаÑÑÑÑ ÐºÐ¾ÑÑекÑÐ½Ð°Ñ ÑÑаÑиÑÑика.
amvacuumcleanup Ñакже вÑзÑваеÑÑÑ Ð² конÑе опеÑаÑии ANALYZE. Ð ÑÑом ÑлÑÑае stats вÑегда NULL и лÑбое возвÑаÑаемое знаÑение игноÑиÑÑеÑÑÑ. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð²Ñзова можно ÑаÑпознаÑÑ, пÑовеÑив поле info->analyze_only. ÐÑи Ñаком вÑзове меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа ÑекомендÑеÑÑÑ Ð½Ð¸Ñего не делаÑÑ, кÑоме как пÑовеÑÑи ÑбоÑÐºÑ Ð¿Ð¾Ñле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, и ÑолÑко в ÑабоÑем пÑоÑеÑÑе авÑооÑиÑÑки.
bool amcanreturn (Relation indexRelation, int attno);
ÐÑовеÑÑеÑ, поддеÑживаеÑÑÑ Ð»Ð¸ ÑканиÑование ÑолÑко индекÑа Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑолбÑа, когда из индекÑа можно полÑÑиÑÑ Ð¸ÑÑ
одное знаÑение ÑÑолбÑа. ÐÑÑибÑÑÑ Ð½ÑмеÑÑÑÑÑÑ Ñ 1, Ñо еÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑвого ÑÑолбÑа attno Ñавен 1. ÐозвÑаÑÐ°ÐµÑ true, еÑли Ñакое ÑканиÑование поддеÑживаеÑÑÑ, а инаÑе â false. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑегда возвÑаÑаÑÑ true Ð´Ð»Ñ Ð½ÐµÐºÐ»ÑÑевÑÑ
ÑÑолбÑов (еÑли ÑаковÑе поддеÑживаÑÑÑÑ), Ñак как неклÑÑевÑе ÑÑолбÑÑ, знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑе нелÑÐ·Ñ Ð¸Ð·Ð²Ð»ÐµÑÑ, не имеÑÑ ÑмÑÑла. ÐÑли индекÑнÑй меÑод доÑÑÑпа в пÑинÑипе не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование ÑолÑко индекÑа, в поле amcanreturn его ÑÑÑÑкÑÑÑÑ IndexAmRoutine можно запиÑаÑÑ NULL.
void
amcostestimate (PlannerInfo *root,
IndexPath *path,
double loop_count,
Cost *indexStartupCost,
Cost *indexTotalCost,
Selectivity *indexSelectivity,
double *indexCorrelation,
double *indexPages);РаÑÑÑиÑÑÐ²Ð°ÐµÑ Ð¿ÑимеÑнÑÑ ÑÑоимоÑÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ в Разделе 61.6.
bytea *
amoptions (ArrayType *reloptions,
bool validate); РазбиÑÐ°ÐµÑ Ð¸ пÑовеÑÑÐµÑ Ð¼Ð°ÑÑив паÑамеÑÑов Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ, ÑолÑко когда Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа задан оÑлиÑнÑй Ð¾Ñ NULL маÑÑив reloptions. ÐаÑÑив reloptions ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑлеменÑов Ñипа text, ÑодеÑжаÑиÑ
запиÑи вида имÑ=знаÑение. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° полÑÑиÑÑ Ð·Ð½Ð°Ñение Ñипа bytea, коÑоÑое бÑÐ´ÐµÑ ÑкопиÑовано в поле rd_options запиÑи индекÑа в relcache. СодеÑжимое ÑÑого знаÑÐµÐ½Ð¸Ñ bytea опÑеделÑеÑÑÑ Ñамим меÑодом доÑÑÑпа; болÑÑинÑÑво ÑÑандаÑÑнÑÑ
меÑодов доÑÑÑпа помеÑаÑÑ Ð² него ÑÑÑÑкÑÑÑÑ StdRdOptions. Ðогда паÑамеÑÑ validate Ñавен true, ÑÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑдаÑÑ Ð¿Ð¾Ð´Ñ
одÑÑее ÑообÑение об оÑибке, еÑли какие-либо паÑамеÑÑÑ Ð½ÐµÑаÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ñ Ð¸Ð»Ð¸ имеÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑе знаÑениÑ; еÑли же validate Ñавен false, некоÑÑекÑнÑе запиÑи Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑоÑÑо игноÑиÑоваÑÑÑÑ. (Ð validate пеÑедаÑÑÑÑ false, когда паÑамеÑÑÑ Ñже загÑÑÐ¶ÐµÐ½Ñ Ð² pg_catalog; пÑи ÑÑом невеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжена, ÑолÑко еÑли в меÑоде доÑÑÑпа поменÑлиÑÑ Ð¿Ñавила обÑабоÑки паÑамеÑÑов, и в ÑÑом ÑлÑÑае ÑÑÐ¾Ð¸Ñ Ð¿ÑоÑÑо игноÑиÑоваÑÑ Ñакие запиÑи.) NULL можно веÑнÑÑÑ, когда нÑжно полÑÑиÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑаниÑ.
bool
amproperty (Oid index_oid, int attno,
IndexAMProperty prop, const char *propname,
bool *res, bool *isnull); ÐÑоÑедÑÑа amproperty позволÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑнÑм меÑодам доÑÑÑпа пеÑеопÑеделÑÑÑ ÑÑандаÑÑное поведение ÑÑнкÑии pg_index_column_has_property и ÑвÑзаннÑÑ
Ñ Ð½ÐµÐ¹. ÐÑли меÑод доÑÑÑпа не пÑоÑвлÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
оÑобенноÑÑей пÑи запÑоÑе ÑвойÑÑв индекÑов, поле amproperty в ÑÑÑÑкÑÑÑе IndexAmRoutine Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ NULL. РпÑоÑивном ÑлÑÑае пÑоÑедÑÑа amproperty бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð½ÑлевÑми паÑамеÑÑами index_oid и attno пÑи вÑзове pg_indexam_has_property, либо Ñ ÐºÐ¾ÑÑекÑнÑм index_oid и нÑлевÑм attno пÑи вÑзове pg_index_has_property, либо Ñ ÐºÐ¾ÑÑекÑнÑм index_oid и положиÑелÑнÑм attno пÑи вÑзове pg_index_column_has_property. Ð prop пеÑедаÑÑÑÑ Ð·Ð½Ð°Ñение пеÑеÑиÑлениÑ, ÑказÑваÑÑее на пÑовеÑÑемое знаÑение, а в propname â ÑÑÑока Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑвойÑÑва. ÐÑли код ÑдÑа не ÑаÑпознаÑÑ Ð¸Ð¼Ñ ÑвойÑÑва, в prop пеÑедаÑÑÑÑ AMPROP_UNKNOWN. ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа могÑÑ Ð²Ð¾ÑпÑинимаÑÑ Ð½ÐµÑÑандаÑÑнÑе имена ÑвойÑÑв, пÑовеÑÑÑ propname на Ñовпадение (Ð´Ð»Ñ ÑоглаÑованноÑÑи Ñ ÐºÐ¾Ð´Ð¾Ð¼ ÑдÑа иÑполÑзÑйÑе Ð´Ð»Ñ Ð¿ÑовеÑки pg_strcasecmp); Ð´Ð»Ñ Ð¸Ð¼Ñн, извеÑÑнÑÑ
ÐºÐ¾Ð´Ñ ÑдÑа, лÑÑÑе пÑовеÑÑÑÑ prop. ÐÑли пÑоÑедÑÑа amproperty возвÑаÑÐ°ÐµÑ true, ÑÑо знаÑиÑ, ÑÑо она ÑÑÑановила ÑезÑлÑÑÐ°Ñ Ð¿ÑовеÑки ÑвойÑÑва: она должна задаÑÑ Ð² *res возвÑаÑаемое логиÑеÑкое знаÑение или ÑÑÑановиÑÑ Ð² *isnull знаÑение true, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ NULL. (ÐеÑед вÑзовом обе ÑпомÑнÑÑÑе пеÑеменнÑе иниÑиализиÑÑÑÑÑÑ Ð·Ð½Ð°Ñением false.) ÐÑли amproperty возвÑаÑÐ°ÐµÑ false, код ÑдÑа пеÑеклÑÑаеÑÑÑ Ð½Ð° обÑÑнÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа пÑовеÑки ÑвойÑÑва.
ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, поддеÑживаÑÑие опеÑаÑоÑÑ ÑпоÑÑдоÑиваниÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑеализовÑваÑÑ Ð¿ÑовеÑÐºÑ ÑвойÑÑва AMPROP_DISTANCE_ORDERABLE, Ñак как код ÑдÑа не знаеÑ, как ÑÑо ÑделаÑÑ Ð¸ возвÑаÑÐ°ÐµÑ NULL. Также Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ ÑеализоваÑÑ Ð¿ÑовеÑÐºÑ AMPROP_RETURNABLE, еÑли ÑÑо можно ÑделаÑÑ Ð¿ÑоÑе, Ñем обÑаÑаÑÑÑ Ðº индекÑÑ Ð¸ вÑзÑÐ²Ð°Ñ amcanreturn (ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð´ ÑдÑа по ÑмолÑаниÑ). ÐÐ»Ñ Ð²ÑеÑ
оÑÑалÑнÑÑ
ÑÑандаÑÑнÑÑ
ÑвойÑÑв поведение ÑдÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑиÑаÑÑ ÑдовлеÑвоÑиÑелÑнÑм.
char * ambuildphasename (int64 phasenum);
ÐозвÑаÑÐ°ÐµÑ ÑекÑÑовое название пеÑеданной ÑÐ°Ð·Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. ÐомеÑа Ñаз пеÑедаÑÑÑÑ Ð² пÑоÑеÑÑе поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа ÑÑнкÑии pgstat_progress_update_param. ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ñаз показÑваÑÑÑÑ Ð² пÑедÑÑавлении pg_stat_progress_create_index.
bool amvalidate (Oid opclassoid);
ÐÑовеÑÑÐµÑ Ð·Ð°Ð¿Ð¸Ñи в каÑалоге Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа опеÑаÑоÑов, наÑколÑко ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ Ð¼ÐµÑод доÑÑÑпа. ÐапÑимеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð¿ÑовеÑкÑ, вÑе ли необÑ
одимÑе опоÑнÑе ÑÑнкÑии ÑеализованÑ. ФÑнкÑÐ¸Ñ amvalidate должна веÑнÑÑÑ false, еÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов непÑигоден к иÑполÑзованиÑ. СообÑÐµÐ½Ð¸Ñ Ð¾ пÑоблеме ÑледÑÐµÑ Ð²ÑдаÑÑ ÑеÑез ereport, как пÑавило, на ÑÑовне INFO.
void
amadjustmembers (Oid opfamilyoid,
Oid opclassoid,
List *operators,
List *functions); ÐÑовеÑÑÐµÑ Ð¿ÑедложеннÑе новÑе опеÑаÑоÑÑ Ð¸ ÑÑнкÑии-ÑÐ»ÐµÐ½Ñ ÑемейÑÑва опеÑаÑоÑов, наÑколÑко меÑод доÑÑÑпа позволÑÐµÑ ÑÑо ÑделаÑÑ, и задаÑÑ Ð²Ð¸Ð´Ñ Ð¸Ñ
завиÑимоÑÑей, еÑли подÑазÑмеваемÑе по ÑмолÑÐ°Ð½Ð¸Ñ Ð½ÐµÑдовлеÑвоÑиÑелÑÐ½Ñ ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ CREATE OPERATOR CLASS и ALTER OPERATOR FAMILY ADD; в поÑледнем ÑлÑÑае знаÑение opclassoid Ñавно InvalidOid. РаÑгÑменÑаÑ
Ñипа List пеÑедаÑÑÑÑ ÑпиÑки ÑлеменÑов ÑÑÑÑкÑÑÑÑ OpFamilyMember. ÐÑовеÑки, вÑполнÑемÑе данной ÑÑнкÑией, обÑÑно ÑвлÑÑÑÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑвом пÑовеÑок, вÑполнÑемÑÑ
amvalidate, поÑколÑÐºÑ Ð¿ÑедполагаеÑÑÑ, ÑÑо amadjustmembers не Ð²Ð¸Ð´Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñй Ð½Ð°Ð±Ð¾Ñ Ñленов. ÐапÑимеÑ, в ÑÑой ÑÑнкÑии бÑÐ´ÐµÑ ÑазÑмнÑм пÑовеÑиÑÑ ÑигнаÑÑÑÑ Ð¾Ð¿Ð¾Ñной ÑÑнкÑии, но не пÑовеÑÑÑÑ, пÑедоÑÑавлÑÑÑÑÑ Ð»Ð¸ вÑе необÑ
одимÑе опоÑнÑе ÑÑнкÑии. РлÑбÑÑ
пÑоблемаÑ
можно ÑообÑиÑÑ, вÑдав оÑибкÑ. СвÑзаннÑе Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми Ð¿Ð¾Ð»Ñ ÑÑÑÑкÑÑÑÑ OpFamilyMember иниÑиализиÑÑÑÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼ ÑдÑа â еÑли вÑполнÑеÑÑÑ CREATE OPERATOR CLASS, ÑоздаÑÑÑÑ Ð¶ÑÑÑкие завиÑимоÑÑи Ð¾Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов, а еÑли вÑполнÑеÑÑÑ ALTER OPERATOR FAMILY ADD â мÑгкие завиÑимоÑÑи Ð¾Ñ ÑемейÑÑва опеÑаÑоÑов. ФÑнкÑÐ¸Ñ amadjustmembers Ð¼Ð¾Ð¶ÐµÑ ÑкоÑÑекÑиÑоваÑÑ ÑÑи полÑ, еÑли более ÑмеÑÑно дÑÑгое поведение. ÐапÑимеÑ, GIN, GiST и SP-GiST вÑегда ÑÑÑанавливаÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов-Ñленов мÑгкÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ Ð¾Ñ ÑемейÑÑва опеÑаÑоÑов, поÑколÑÐºÑ Ð² ÑÑиÑ
ÑипаÑ
индекÑов ÑвÑÐ·Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑом и клаÑÑом опеÑаÑоÑа оÑноÑиÑелÑно Ñлаба; поÑÑÐ¾Ð¼Ñ ÐµÑÑÑ ÑмÑÑл ÑазÑеÑиÑÑ Ñвободное добавление и Ñдаление Ñленов опеÑаÑоÑов. ÐÐ»Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑÑ
опоÑнÑÑ
ÑÑнкÑий обÑÑно Ñакже ÑÑÑанавливаÑÑÑÑ Ð¼Ñгкие завиÑимоÑÑи, ÑÑÐ¾Ð±Ñ Ð¿Ñи необÑ
одимоÑÑи иÑ
можно бÑло ÑдалиÑÑ.
Ð¦ÐµÐ»Ñ Ð¸Ð½Ð´ÐµÐºÑа, конеÑно, в Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¿Ð¾Ð¸Ñк коÑÑежей, ÑооÑвеÑÑÑвÑÑÑиÑ
индекÑиÑÑÐµÐ¼Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE, по огÑаниÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ клÑÑÑ Ð¿Ð¾Ð¸Ñка. СканиÑование индекÑа опиÑÑваеÑÑÑ Ð±Ð¾Ð»ÐµÐµ полно ниже, в Разделе 61.3. ÐндекÑнÑй меÑод доÑÑÑпа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Â«Ð¿ÑоÑÑое» ÑканиÑование, ÑканиÑование по «биÑовой каÑÑе» или и Ñо, и дÑÑгое. ÐеÑод доÑÑÑпа должен или Ð¼Ð¾Ð¶ÐµÑ ÑеализовÑваÑÑ ÑледÑÑÑие ÑÑнкÑии, ÑвÑзаннÑе Ñо ÑканиÑованием:
IndexScanDesc
ambeginscan (Relation indexRelation,
int nkeys,
int norderbys); ÐодгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑод к ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. РпаÑамеÑÑаÑ
nkeys и norderbys задаÑÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво опеÑаÑоÑов ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ ÑоÑÑиÑовки, коÑоÑÑе бÑдÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð¿Ñи ÑканиÑовании; ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи. ÐамеÑÑÑе, ÑÑо ÑакÑиÑеÑкие знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ ÐµÑÑ Ð½Ðµ пÑедоÑÑавлÑÑÑÑÑ. Ð ÑезÑлÑÑаÑе ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑдаÑÑ ÑÑÑÑкÑÑÑÑ, вÑделеннÑÑ ÑÑедÑÑвами palloc. Ð ÑвÑзи Ñ Ð¾ÑобенноÑÑÑми ÑеализаÑии, меÑод доÑÑÑпа должен ÑоздаÑÑ ÑÑÑ ÑÑÑÑкÑÑÑÑ, вÑзвав RelationGetIndexScan(). РболÑÑинÑÑве ÑлÑÑаев вÑе дейÑÑÐ²Ð¸Ñ ambeginscan ÑводÑÑÑÑ ÑолÑко к вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого вÑзова и, возможно, полÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок; вÑÑ Ñамое инÑеÑеÑное пÑи запÑÑке ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² amrescan.
void
amrescan (IndexScanDesc scan,
ScanKey keys,
int nkeys,
ScanKey orderbys,
int norderbys); ÐапÑÑÐºÐ°ÐµÑ Ð¸Ð»Ð¸ пеÑезапÑÑÐºÐ°ÐµÑ ÑканиÑование индекÑа, возможно, Ñ Ð½Ð¾Ð²Ñми клÑÑами ÑканиÑованиÑ. (ÐÐ»Ñ Ð¿ÐµÑезапÑÑка ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ñанее пеÑеданнÑми клÑÑами в keys и/или orderbys пеÑедаÑÑÑÑ NULL.) ÐамеÑÑÑе, ÑÑо колиÑеÑÑво клÑÑей или опеÑаÑоÑов ÑоÑÑиÑовки не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑевÑÑаÑÑ Ð·Ð½Ð°ÑениÑ, поÑÑÑпивÑие в ambeginscan. Ðа пÑакÑике возможноÑÑÑ Ð¿ÐµÑезапÑÑка иÑполÑзÑеÑÑÑ, когда в Ñоединении Ñо вложеннÑм Ñиклом вÑбиÑаеÑÑÑ Ð½Ð¾Ð²Ñй внеÑний коÑÑеж, Ñак ÑÑо ÑÑебÑеÑÑÑ ÑÑавнение Ñ Ð½Ð¾Ð²Ñм клÑÑом, но ÑÑÑÑкÑÑÑа клÑÑей ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ менÑеÑÑÑ.
bool
amgettuple (IndexScanDesc scan,
ScanDirection direction); ÐÑбиÑÐ°ÐµÑ ÑледÑÑÑий коÑÑеж в Ñ
оде данного ÑканиÑованиÑ, Ñ Ð¿ÐµÑедвижением по индекÑÑ Ð² заданном напÑавлении (впеÑÑд или назад). ÐозвÑаÑÐ°ÐµÑ true, еÑли коÑÑеж бÑл полÑÑен, или false, еÑли подÑ
одÑÑиÑ
коÑÑежей не оÑÑалоÑÑ. Ð ÑлÑÑае ÑÑпеÑ
а в ÑÑÑÑкÑÑÑе scan ÑоÑ
ÑанÑеÑÑÑ TID коÑÑежа. ÐамеÑÑÑе, ÑÑо под «ÑÑпеÑ
ом» здеÑÑ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ ÑолÑко, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑ, ÑооÑвеÑÑÑвÑÑÑÑÑ ÐºÐ»ÑÑам ÑканиÑованиÑ, а не Ñо, ÑÑо даннÑй коÑÑеж обÑзаÑелÑно ÑÑÑеÑÑвÑÐµÑ Ð² даннÑÑ
или оказÑваеÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñм в Ñнимке вÑзÑваÑÑего ÑÑбÑекÑа. ÐÑи положиÑелÑном ÑезÑлÑÑаÑе amgettuple должна Ñакже ÑÑÑановиÑÑ Ð´Ð»Ñ ÑвойÑÑва scan->xs_recheck знаÑение true или false. ÐнаÑение false бÑÐ´ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ, ÑÑо запиÑÑ Ð¸Ð½Ð´ÐµÐºÑа ÑоÑно ÑооÑвеÑÑÑвÑÐµÑ ÐºÐ»ÑÑам ÑканиÑованиÑ, а true â ÑÑо еÑÑÑ Ñомнение в ÑÑом, Ñак ÑÑо ÑÑловиÑ, пÑедÑÑавленнÑе клÑÑами ÑканиÑованиÑ, необÑ
одимо еÑÑ Ñаз пеÑепÑовеÑиÑÑ Ð´Ð»Ñ ÑакÑиÑеÑкого коÑÑежа, когда он бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен. ÐÑо ÑвойÑÑво введено Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки «неÑоÑнÑÑ
» опеÑаÑоÑов индекÑов. ÐамеÑÑÑе, ÑÑо ÑÐ°ÐºÐ°Ñ Ð¿ÐµÑепÑовеÑка каÑаеÑÑÑ ÑолÑко ÑÑловий ÑканиÑованиÑ; пÑÐµÐ´Ð¸ÐºÐ°Ñ ÑаÑÑиÑного индекÑа (еÑли он имееÑÑÑ) никогда не пеÑепÑовеÑÑеÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼, вÑзÑваÑÑим amgettuple.
ÐÑли Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование ÑолÑко индекÑа (Ñо еÑÑÑ amcanreturn вÑдаÑÑ true Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ
-либо его ÑÑолбÑов), Ñо в ÑлÑÑае ÑÑпеÑ
а меÑод доÑÑÑпа должен Ñакже пÑовеÑиÑÑ Ñлаг scan->xs_want_itup и, еÑли он ÑÑÑановлен, должен веÑнÑÑÑ Ð¸ÑÑ
однÑе индекÑиÑованнÑе даннÑе Ð´Ð»Ñ ÑÑой запиÑи индекÑа. Ð ÑÑолбÑаÑ
, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
amcanreturn вÑдаÑÑ false, можно веÑнÑÑÑ null. ÐаннÑе могÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð¿Ð¾ÑÑедÑÑвом ÑказаÑÐµÐ»Ñ Ð½Ð° IndexTuple, ÑоÑ
ÑанÑнного в scan->xs_itup, Ñ Ð´ÐµÑкÑипÑоÑом scan->xs_itupdesc; либо поÑÑедÑÑвом ÑказаÑÐµÐ»Ñ Ð½Ð° HeapTuple, ÑоÑ
ÑанÑнного в scan->xs_hitup, Ñ Ð´ÐµÑкÑипÑоÑом коÑÑежа scan->xs_hitupdesc. (ÐÑоÑой ваÑÐ¸Ð°Ð½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ иÑполÑзоваÑÑÑÑ Ð¿Ñи воÑÑÑановлении даннÑÑ
, коÑоÑÑе могÑÑ Ð½Ðµ ÑмеÑÑиÑÑÑÑ Ð² IndexTuple.) РлÑбом ÑлÑÑае за ÑпÑавление Ñелевой облаÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
, опÑеделÑемой ÑÑим ÑказаÑелем, оÑвеÑÐ°ÐµÑ Ð¼ÐµÑод доÑÑÑпа. ÐаннÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑаваÑÑÑÑ Ð°ÐºÑÑалÑнÑми как минимÑм до ÑледÑÑÑего вÑзова amgettuple, amrescan или amendscan в пÑоÑеÑÑе ÑканиÑованиÑ.
ФÑнкÑÐ¸Ñ amgettuple должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Â«Ð¿ÑоÑÑое» ÑканиÑование индекÑа. РпÑоÑивном ÑлÑÑае поле amgettuple в ÑÑÑÑкÑÑÑе IndexAmRoutine должно ÑодеÑжаÑÑ NULL.
int64
amgetbitmap (IndexScanDesc scan,
TIDBitmap *tbm); ÐÑбиÑÐ°ÐµÑ Ð²Ñе коÑÑежи Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ добавлÑÐµÑ Ð¸Ñ
в пеÑедаваемÑÑ Ð²ÑзÑваÑÑим кодом ÑÑÑÑкÑÑÑÑ TIDBitmap (Ñо еÑÑÑ, полÑÑÐ°ÐµÑ Ð»Ð¾Ð³Ð¸ÑеÑкое обÑединение множеÑÑва TID вÑбÑаннÑÑ
коÑÑежей Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом, Ñже запиÑаннÑм в биÑовой каÑÑе). ÐозвÑаÑÐ°ÐµÑ ÑÑа ÑÑнкÑÐ¸Ñ ÑиÑло полÑÑеннÑÑ
коÑÑежей (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко пÑиблизиÑелÑÐ½Ð°Ñ Ð¾Ñенка; напÑимеÑ, некоÑоÑÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа не ÑÑиÑÑваÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑениÑ). ÐобавлÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ ÐºÐ¾ÑÑежей в биÑовÑÑ ÐºÐ°ÑÑÑ, amgetbitmap Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо Ð´Ð»Ñ ÑÑиÑ
коÑÑежей нÑжно пеÑепÑовеÑиÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑканиÑованиÑ. ÐÐ»Ñ ÑÑого Ñак же, как и в amgettuple, ÑÑÑанавливаеÑÑÑ Ð²ÑÑ
одной паÑамеÑÑ xs_recheck. ÐамеÑание: в ÑекÑÑей ÑеализаÑии ÑÑа возможноÑÑÑ ÑвÑзÑваеÑÑÑ Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð½ÐµÑоÑного Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑамиÑ
биÑовÑÑ
каÑÑ, Ñаким обÑазом вÑзÑваÑÑий код пеÑепÑовеÑÑÐµÑ Ð´Ð»Ñ Ð¾ÑмеÑеннÑÑ
коÑÑежей и ÑÑÐ»Ð¾Ð²Ð¸Ñ ÑканиÑованиÑ, и пÑÐµÐ´Ð¸ÐºÐ°Ñ ÑаÑÑиÑного индекÑа (еÑли он имееÑÑÑ). Ðднако Ñак Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ вÑегда. ФÑнкÑии amgetbitmap и amgettuple не могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² одном ÑканиÑовании индекÑа; еÑÑÑ Ð¸ дÑÑгие огÑаниÑÐµÐ½Ð¸Ñ Ð² пÑименении amgetbitmap, опиÑаннÑе в Разделе 61.3.
ФÑнкÑÐ¸Ñ amgetbitmap должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование индекÑа «по биÑовой каÑÑе». РпÑоÑивном ÑлÑÑае поле amgetbitmap в ÑÑÑÑкÑÑÑе IndexAmRoutine должно ÑодеÑжаÑÑ NULL.
void amendscan (IndexScanDesc scan);
ÐавеÑÑÐ°ÐµÑ ÑканиÑование и оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑеÑÑÑÑÑ. Ð¡Ð°Ð¼Ñ ÑÑÑÑкÑÑÑÑ scan оÑвобождаÑÑ Ð½Ðµ ÑледÑеÑ, но лÑбÑе блокиÑовки или закÑÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов, ÑÑÑановленнÑе внÑÑÑи меÑода доÑÑÑпа, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑнÑÑÑ.
void ammarkpos (IndexScanDesc scan);
ÐомеÑÐ°ÐµÑ ÑекÑÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑканиÑованиÑ. ÐеÑод доÑÑÑпа должен поддеÑживаÑÑ ÑÐ¾Ñ Ñанение ÑолÑко одной позиÑии в пÑоÑеÑÑе ÑканиÑованиÑ.
ФÑнкÑÐ¸Ñ ammarkpos должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование по поÑÑдкÑ. ÐÑли ÑÑо не Ñак, в поле ammarkpos в ÑÑÑÑкÑÑÑе IndexAmRoutine можно запиÑаÑÑ NULL.
void amrestrpos (IndexScanDesc scan);
ÐоÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑканиÑованиÑ, оÑмеÑеннÑÑ Ð¿Ð¾Ñледней.
ФÑнкÑÐ¸Ñ amrestrpos должна бÑÑÑ Ñеализована, ÑолÑко еÑли меÑод доÑÑÑпа поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование по поÑÑдкÑ. ÐÑли ÑÑо не Ñак, в поле amrestrpos в ÑÑÑÑкÑÑÑе IndexAmRoutine можно запиÑаÑÑ NULL.
Ðомимо обÑÑного ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑÐ¸Ð¿Ñ Ð¸Ð½Ð´ÐµÐºÑов могÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¿Ð°ÑаллелÑное ÑканиÑование индекÑа, ÑÑо позволÑÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑ ÑовмеÑÑное ÑканиÑование индекÑа неÑколÑким обÑлÑживаÑÑим пÑоÑеÑÑам. ÐÐ»Ñ ÑÑого меÑод доÑÑÑпа должен оÑганизоваÑÑ ÑабоÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ñй из взаимодейÑÑвÑÑÑÐ¸Ñ Ð¿ÑоÑеÑÑов возвÑаÑал подмножеÑÑво коÑÑежей, коÑоÑое Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑалоÑÑ Ð¿Ñи обÑÑном, не паÑаллелÑном ÑканиÑовании, и Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ñединение ÑÑÐ¸Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑв Ñовпадало Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом коÑÑежей, возвÑаÑаемÑÑ Ð¿Ñи обÑÑном ÑканиÑовании. Ðолее Ñого, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑÑебовалаÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑÐ½Ð°Ñ ÑоÑÑиÑовка коÑÑежей, возвÑаÑаемÑÑ Ð¿Ñи паÑаллелÑном ÑканиÑовании, поÑÑдок коÑÑежей в подмножеÑÑÐ²Ð°Ñ , вÑдаваемÑÑ Ð²Ñеми взаимодейÑÑвÑÑÑими пÑоÑеÑÑами, должен ÑооÑвеÑÑÑвоваÑÑ Ð·Ð°Ð¿ÑоÑенномÑ. ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки паÑаллелÑного ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ индекÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ ÑледÑÑÑие ÑÑнкÑии:
Size amestimateparallelscan (void);
РаÑÑÑиÑÑÐ²Ð°ÐµÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÑм (в байÑаÑ
) в динамиÑеÑкой ÑазделÑемой памÑÑи, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑÑеÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑного ÑканиÑованиÑ. (ÐÑÐ¾Ñ Ð¾Ð±ÑÑм дополнÑеÑ, а не заменÑÐµÑ Ð¾Ð±ÑÑм памÑÑи, заÑÑебованнÑй Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, незавиÑимо Ð¾Ñ ÐÐ, в ParallelIndexScanDescData.)
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ не ÑеализовÑваÑÑ Ð´Ð»Ñ Ð¼ÐµÑодов доÑÑÑпа, коÑоÑÑе не поддеÑживаÑÑ Ð¿Ð°ÑаллелÑное ÑканиÑование, или Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð±ÑÑм дополниÑелÑно ÑÑебÑÑÑейÑÑ Ð¿Ð°Ð¼ÑÑи Ñавен нÑлÑ.
void aminitparallelscan (void *target);
ÐÑа ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии облаÑÑи динамиÑеÑкой ÑазделÑемой памÑÑи в наÑале паÑаллелÑного ÑканиÑованиÑ. ÐаÑамеÑÑ target бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° облаÑÑÑ Ð¾Ð±ÑÑма, не менÑÑего, Ñем возвÑаÑила ÑÑнкÑÐ¸Ñ amestimateparallelscan, и Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ñ
ÑаниÑÑ Ð² ÑÑой облаÑÑи лÑбÑе нÑжнÑе ей даннÑе.
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ не ÑеализовÑваÑÑ Ð´Ð»Ñ Ð¼ÐµÑодов доÑÑÑпа, коÑоÑÑе не поддеÑживаÑÑ Ð¿Ð°ÑаллелÑное ÑканиÑование, или когда вÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² ÑазделÑемой памÑÑи не ÑÑебÑÐµÑ Ð¸Ð½Ð¸ÑиализаÑии.
void amparallelrescan (IndexScanDesc scan);
ÐÑа ÑÑнкÑиÑ, еÑли ÐµÑ ÑеализоваÑÑ, бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿ÐµÑед пеÑезапÑÑком паÑаллелÑного ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа. Ðна должна ÑбÑоÑиÑÑ Ð²ÑÑ ÑазделÑемое ÑоÑÑоÑние, ÑÑÑановленное ÑÑнкÑией aminitparallelscan, Ñ Ñем, ÑÑÐ¾Ð±Ñ Ñакое ÑканиÑование пеÑезапÑÑÑилоÑÑ Ñ Ð½Ð°Ñала.