61.3. СканиÑование индекÑа #
РпÑоÑеÑÑе ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑнÑй меÑод доÑÑÑпа оÑвеÑÐ°ÐµÑ ÑолÑко за вÑдаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов вÑÐµÑ ÐºÐ¾ÑÑежей, коÑоÑÑе по его пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ ÐºÐ»ÑÑам ÑканиÑованиÑ. ÐеÑод доÑÑÑпа не ÑÑаÑÑвÑÐµÑ Ð² Ñамой пÑоÑедÑÑе вÑбоÑки ÑÑÐ¸Ñ ÐºÐ¾ÑÑежей из оÑновной ÑаблиÑÑ Ð¸ не опÑеделÑеÑ, ÑдовлеÑвоÑÑÑÑ Ð»Ð¸ ÑÑи коÑÑежи ÑÑловиÑм видимоÑÑи или дÑÑгим огÑаниÑениÑм.
ÐлÑÑом ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвлÑеÑÑÑ Ð²Ð½ÑÑÑеннее пÑедÑÑавление пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE в виде клÑÑ_индекÑа опеÑаÑÐ¾Ñ ÐºÐ¾Ð½ÑÑанÑа, где клÑÑ Ð¸Ð½Ð´ÐµÐºÑа â один из ÑÑолбÑов индекÑа, а опеÑаÑÐ¾Ñ â один из Ñленов ÑемейÑÑва опеÑаÑоÑов, ÑвÑзанного Ñ Ñипом данного ÑÑолбÑа. ÐÑи ÑканиÑовании по индекÑÑ Ð¼Ð¾Ð³ÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð½ÐµÑколÑко или Ð½Ð¾Ð»Ñ ÐºÐ»ÑÑей ÑканиÑованиÑ, ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка коÑоÑÑÑ
Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½ÐµÑвно обÑединÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑией AND â ожидаеÑÑÑ, ÑÑо возвÑаÑаемÑе коÑÑежи бÑдÑÑ ÑдовлеÑвоÑÑÑÑ Ð²Ñем заданнÑм ÑÑловиÑм.
ÐеÑод доÑÑÑпа Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного запÑоÑа Ð¼Ð¾Ð¶ÐµÑ ÑообÑиÑÑ, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ ÑвлÑеÑÑÑ Ð½ÐµÑоÑнÑм или, дÑÑгими Ñловами, ÑÑебÑÐµÑ Ð¿ÐµÑепÑовеÑки. ÐÑо подÑазÑмеваеÑ, ÑÑо пÑи ÑканиÑовании индекÑа бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð²Ñе запиÑи, ÑооÑвеÑÑÑвÑÑÑие клÑÑÑ ÑканиÑованиÑ, плÑÑ, возможно, дополниÑелÑнÑе запиÑи, коÑоÑÑе ÐµÐ¼Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÑÑ. ÐнÑÑÑенний Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñем повÑоÑно пÑÐ¸Ð¼ÐµÐ½Ð¸Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа к коÑÑÐµÐ¶Ñ Ð´Ð°Ð½Ð½ÑÑ , ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ, нÑжно ли его вÑбиÑаÑÑ Ð½Ð° Ñамом деле. ÐÑли пÑизнак пеÑепÑовеÑки не ÑÑÑановлен, пÑи ÑканиÑовании индекÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ ÑолÑко ÑооÑвеÑÑÑвÑÑÑие клÑÑам запиÑи.
ÐамеÑÑÑе, ÑÑо именно меÑод доÑÑÑпа должен гаÑанÑиÑоваÑÑ, ÑÑо коÑÑекÑно бÑдÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð²Ñе и ÑолÑко Ñе запиÑи, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð²Ñем пеÑеданнÑм клÑÑам ÑканиÑованиÑ. Также ÑÑÑиÑе, ÑÑо ÑдÑо ÑиÑÑÐµÐ¼Ñ Ð¿ÑоÑÑо пеÑедаÑÑ Ð²Ñе пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE Ñ Ð¿Ð¾Ð´Ñ
одÑÑими клÑÑами индекÑа и ÑемейÑÑвами опеÑаÑоÑов, не пÑÐ¾Ð²Ð¾Ð´Ñ ÑеманÑиÑеÑкий анализ на пÑÐµÐ´Ð¼ÐµÑ Ð¸Ñ
избÑÑоÑноÑÑи или пÑоÑивоÑеÑивоÑÑи. ÐапÑимеÑ, Ñ ÑÑловием WHERE x > 4 AND x > 14, где x â ÑÑÐ¾Ð»Ð±ÐµÑ Ñ Ð¸Ð½Ð´ÐµÐºÑом-B-деÑевом, именно Ñамой ÑÑнкÑии amrescan в меÑоде B-деÑева пÑедоÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð½ÑÑÑ, ÑÑо пеÑвÑй клÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð±ÑÑоÑнÑй и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑбÑоÑен. ÐбÑÑм пÑедваÑиÑелÑной обÑабоÑки, коÑоÑÑÑ Ð½Ñжно пÑоизвеÑÑи Ð´Ð»Ñ ÑÑого в amrescan, завиÑÐ¸Ñ Ð¾Ñ Ñого, до какой ÑÑепени меÑод доÑÑÑпа должен ÑводиÑÑ ÐºÐ»ÑÑи к «ноÑмализованной» ÑоÑме.
ÐекоÑоÑÑе меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа возвÑаÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи индекÑа в ÑÑÑко опÑеделÑнном поÑÑдке, в оÑлиÑие Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ . ФакÑиÑеÑки еÑÑÑ Ð´Ð²Ð° ÑазлиÑнÑÑ Ð²Ð°ÑианÑа ÑеализаÑии ÑпоÑÑдоÑенного вÑвода некоÑоÑÑм меÑодом доÑÑÑпа:
ÐÐ»Ñ Ð¼ÐµÑодов доÑÑÑпа, коÑоÑÑе вÑегда возвÑаÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи в поÑÑдке Ð¸Ñ ÐµÑÑеÑÑвенной ÑоÑÑиÑовки (как, напÑимеÑ, в B-деÑеве), ÑÑÑанавливаеÑÑÑ Ð¿Ñизнак
amcanorder. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿ÐµÑаÑоÑам пÑовеÑки ÑавенÑÑва и ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи ÑÑом Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ð·Ð½Ð°ÑаÑÑÑÑ Ð½Ð¾Ð¼ÐµÑа ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑÑÑаÑегий B-деÑева.ÐÐ»Ñ Ð¼ÐµÑодов доÑÑÑпа, коÑоÑÑе поддеÑживаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑпоÑÑдоÑиваниÑ, ÑÑÑанавливаеÑÑÑ Ð¿Ñизнак
amcanorderbyop. Ðн показÑваеÑ, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи в поÑÑдке, опÑеделÑемом пÑедложениемORDER BYклÑÑ_индекÑаопеÑаÑоÑконÑÑанÑа. ÐодиÑикаÑоÑÑ Ð´Ð»Ñ Ñакого ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð²amrescan, как опиÑÑвалоÑÑ Ñанее.
У ÑÑнкÑии amgettuple еÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ direction, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°Ñение ForwardScanDirection (обÑÑнÑй ваÑианÑ, ÑканиÑование впеÑÑд) или BackwardScanDirection (ÑканиÑование назад). ÐÑли в пеÑвом вÑзове поÑле amrescan ÑказÑваеÑÑÑ BackwardScanDirection, Ñо множеÑÑво ÑооÑвеÑÑÑвÑÑÑиÑ
запиÑей индекÑа ÑканиÑÑеÑÑÑ Ð¾Ñ ÐºÐ¾Ð½Ñа к наÑалÑ, а не в обÑÑном напÑавлении Ð¾Ñ Ð½Ð°Ñала к конÑÑ. Ð ÑÑом ÑлÑÑае amgettuple должна веÑнÑÑÑ Ð¿Ð¾Ñледний ÑооÑвеÑÑÑвÑÑÑий коÑÑеж индекÑа, а не пеÑвÑй как обÑÑно. (ÐÑо ÑаÑпÑоÑÑÑанÑеÑÑÑ ÑолÑко на меÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа Ñ ÑÑÑановленнÑм пÑизнаком amcanorder.) ÐоÑле пеÑвого вÑзова amgettuple должна бÑÑÑ Ð³Ð¾Ñова пÑодолжаÑÑ ÑканиÑование в лÑбом напÑавлении Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи, вÑданной поÑледней до ÑÑого. (Ðо еÑли пÑизнак amcanbackward не ÑÑÑановлен, пÑи вÑеÑ
поÑледÑÑÑиÑ
вÑзоваÑ
должно ÑоÑ
ÑанÑÑÑÑÑ Ñо же напÑавление, ÑÑо бÑло в пеÑвом.)
ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа, коÑоÑÑе поддеÑживаÑÑ ÑпоÑÑдоÑенное ÑканиÑование, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑмеÑÑ Â«Ð¿Ð¾Ð¼ÐµÑаÑÑ» позиÑÐ¸Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ заÑем возвÑаÑаÑÑÑÑ Ðº помеÑенной позиÑии (возможно, неÑколÑко Ñаз к одной и Ñой же позиÑии). Ðо запоминаÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑолÑко одна позиÑÐ¸Ñ Ð² Ñ
оде ÑканиÑованиÑ; поÑледÑÑÑий вÑзов ammarkpos пеÑеопÑеделÑÐµÑ Ñанее ÑоÑ
ÑанÑннÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑ. ÐеÑод доÑÑÑпа, не поддеÑживаÑÑий ÑпоÑÑдоÑенное ÑканиÑование, не должен опÑеделÑÑÑ ÑÑнкÑии ammarkpos и amrestrpos в IndexAmRoutine; доÑÑаÑоÑно запиÑаÑÑ Ð² ÑÑи ÑказаÑели NULL.
РпозиÑÐ¸Ñ ÑканиÑованиÑ, и оÑмеÑÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ (пÑи налиÑии) Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ Ð² ÑоглаÑованном ÑоÑÑоÑнии Ñ ÑÑÑÑом одновÑеменнÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹ или Ñдалений запиÑей в индекÑе. Ðе бÑÐ´ÐµÑ Ð¾Ñибкой, еÑли ÑолÑко ÑÑо вÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ðµ бÑÐ´ÐµÑ Ð²Ñдана пÑи ÑканиÑовании, коÑоÑое могло Ð±Ñ Ð½Ð°Ð¹Ñи ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ, еÑли Ð±Ñ Ð¾Ð½Ð° ÑÑÑеÑÑвовала до его наÑала, либо еÑли ÑканиÑование вÑдаÑÑ ÑакÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ð¾Ñле пеÑезапÑÑка или возвÑаÑа, даже еÑли она не бÑла вÑдана в пеÑвÑй Ñаз. ÐодобнÑм обÑазом, паÑаллелÑное Ñдаление Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑажаÑÑÑÑ, а Ð¼Ð¾Ð¶ÐµÑ Ð¸ не оÑÑажаÑÑÑÑ Ð² ÑезÑлÑÑаÑÐ°Ñ ÑканиÑованиÑ. Ðажно ÑолÑко, ÑÑÐ¾Ð±Ñ Ð¿Ñи ÑÐ°ÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑиÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ пÑоиÑÑ Ð¾Ð´Ð¸Ð»Ð¾ поÑеÑÑ Ð¸Ð»Ð¸ дÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей, коÑоÑÑе в ÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑиÑÑ Ð½Ðµ ÑÑаÑÑвовали.
ÐÑли Ð¸Ð½Ð´ÐµÐºÑ ÑÐ¾Ñ ÑанÑÐµÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñе индекÑиÑÑемÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ (а не Ð¸Ñ Ð¸ÑкажÑнное пÑедÑÑавление), обÑÑно полезно поддеÑжаÑÑ ÑканиÑование ÑолÑко индекÑа, пÑи коÑоÑом Ð¸Ð½Ð´ÐµÐºÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑакÑиÑеÑкие даннÑе, а не ÑолÑко TID коÑÑежа даннÑÑ . ÐÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¾Ð¿ÑимизиÑоваÑÑ Ð²Ð²Ð¾Ð´-вÑвод, ÑолÑко еÑли каÑÑа видимоÑÑи показÑваеÑ, ÑÑо TID оÑноÑиÑÑÑ Ðº полноÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð¹ ÑÑÑаниÑе; в пÑоÑивном ÑлÑÑае вÑÑ Ñавно пÑидÑÑÑÑ Ð¿Ð¾ÑеÑиÑÑ ÐºÐ¾ÑÑеж, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ ÐµÐ³Ð¾ видимоÑÑÑ Ð´Ð»Ñ MVCC. Ðо ÑÑо не ÑвлÑеÑÑÑ Ð·Ð°Ð±Ð¾Ñой меÑода доÑÑÑпа.
ÐмеÑÑо amgettuple, ÑканиÑование индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑÑÑ ÑÑнкÑией amgetbitmap, коÑоÑÐ°Ñ Ð²ÑбиÑÐ°ÐµÑ Ð²Ñе коÑÑежи за один вÑзов. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð½Ð°ÑиÑелÑно ÑÑÑекÑивнее amgettuple, Ñак как позволÑÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ñиклов блокиÑовки/ÑазблокиÑовки в меÑоде доÑÑÑпа. РпÑинÑипе, amgetbitmap должна даваÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑÑÑекÑ, ÑÑо и многокÑаÑнÑе вÑÐ·Ð¾Ð²Ñ amgettuple, но пÑоÑÑоÑÑ Ñади Ð¼Ñ Ð½Ð°ÐºÐ»Ð°Ð´Ñваем ÑÑд дополниÑелÑнÑÑ
огÑаниÑений. Ðо-пеÑвÑÑ
, amgetbitmap возвÑаÑÐ°ÐµÑ Ð²Ñе коÑÑежи ÑÑÐ°Ð·Ñ Ð¸ не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¼ÐµÑÐºÑ Ð¿Ð¾Ð·Ð¸Ñий и возвÑаÑение к ним. Ðо-вÑоÑÑÑ
, коÑÑежи, возвÑаÑаемÑе в биÑовой каÑÑе, не ÑпоÑÑдоÑиваÑÑÑÑ ÐºÐ°ÐºÐ¸Ð¼-либо опÑеделÑннÑм обÑазом, поÑÑÐ¾Ð¼Ñ amgetbitmap не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ direction. (РопеÑаÑоÑÑ ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не бÑдÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð´Ð»Ñ Ñакого ÑканиÑованиÑ.) ÐÑоме Ñого, ÑканиÑование ÑолÑко индекÑа Ñ amgetbitmap неоÑÑÑеÑÑвимо, Ñак как Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ возможноÑÑи возвÑаÑиÑÑ ÑодеÑжимое коÑÑежей индекÑа. ÐаконеÑ, amgetbitmap не гаÑанÑиÑÑеÑ, ÑÑо бÑдÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо блокиÑовки Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑаемÑÑ
коÑÑежей, и ÑледÑÑÐ²Ð¸Ñ ÑÑого опиÑÐ°Ð½Ñ Ð² Разделе 61.4.
ÐамеÑÑÑе, ÑÑо меÑод доÑÑÑпа Ð¼Ð¾Ð¶ÐµÑ ÑеализовÑваÑÑ ÑолÑко ÑÑнкÑÐ¸Ñ amgetbitmap, но не amgettuple, и наобоÑоÑ, еÑли его внÑÑÑеннÑÑ ÑеализаÑÐ¸Ñ Ð½ÐµÑовмеÑÑима Ñ Ð¾Ð´Ð½Ð¾Ð¹ из ÑÑиÑ
ÑÑнкÑий.