11.9. СканиÑование ÑолÑко индекÑа и покÑÑваÑÑие индекÑÑ #
ÐÑе индекÑÑ Ð² Postgres Pro ÑвлÑÑÑÑÑ Ð²ÑоÑиÑнÑми, ÑÑо знаÑиÑ, ÑÑо каждÑй Ð¸Ð½Ð´ÐµÐºÑ Ñ
ÑаниÑÑÑ Ð²Ð½Ðµ облаÑÑи оÑновнÑÑ
даннÑÑ
ÑаблиÑÑ (коÑоÑÐ°Ñ Ð² ÑеÑминологии Postgres Pro назÑваеÑÑÑ ÐºÑÑей ÑаблиÑÑ). ÐÑо знаÑиÑ, ÑÑо пÑи обÑÑном ÑканиÑовании индекÑа Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки необÑ
одимо пÑоÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе и из индекÑа, и из кÑÑи. Ðолее Ñого, Ñогда как ÑлеменÑÑ Ð¸Ð½Ð´ÐµÐºÑа, ÑооÑвеÑÑÑвÑÑÑие Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE, обÑÑно наÑ
одÑÑÑÑ Ð² индекÑе ÑÑдом, ÑÑÑоки ÑаблиÑÑ Ð¼Ð¾Ð³ÑÑ ÑаÑполагаÑÑÑÑ Ð² кÑÑе пÑоизволÑнÑм обÑазом. Таким обÑазом, обÑаÑение к кÑÑе пÑи поиÑке по индекÑÑ Ð²Ð»ÐµÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво опеÑаÑий пÑоизволÑного ÑÑÐµÐ½Ð¸Ñ ÐºÑÑи, коÑоÑÑе могÑÑ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð½ÐµÐ´ÑÑево, оÑобенно на ÑÑадиÑионнÑÑ
вÑаÑаÑÑиÑ
ÑÑ Ð½Ð¾ÑиÑелÑÑ
. (Ðак опиÑано в Разделе 11.5, ÑканиÑование по биÑовой каÑÑе пÑÑаеÑÑÑ ÑнизиÑÑ ÑÑоимоÑÑÑ ÑÑиÑ
опеÑаÑий, ÑпоÑÑдоÑÐ¸Ð²Ð°Ñ Ð´Ð¾ÑÑÑп к кÑÑе, но не более Ñого.)
ЧÑÐ¾Ð±Ñ ÑеÑиÑÑ ÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ, Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑканиÑование ÑолÑко индекÑа, пÑи коÑоÑом ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑен из Ñамого индекÑа, без обÑаÑÐµÐ½Ð¸Ñ Ðº кÑÑе. ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¸Ð´ÐµÑ Ñакого ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð²ÑдаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно из ÑлеменÑа индекÑа, и не обÑаÑаÑÑÑÑ Ðº ÑооÑвеÑÑÑвÑÑÑей запиÑи в кÑÑе. ÐÐ»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑого меÑода еÑÑÑ Ð´Ð²Ð° ÑÑндаменÑалÑнÑÑ Ð¾Ð³ÑаниÑениÑ:
Тип индекÑа должен поддеÑживаÑÑ ÑканиÑование ÑолÑко индекÑа. ÐндекÑÑ-B-деÑевÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÐµÐ³Ð¾ вÑегда. ÐндекÑÑ GiST и SP-GiST могÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÐµÐ³Ð¾ Ñ Ð¾Ð´Ð½Ð¸Ð¼Ð¸ клаÑÑами опеÑаÑоÑов и не поддеÑживаÑÑ Ñ Ð´ÑÑгими. ÐÑÑгие индекÑÑ Ñакое ÑканиÑование не поддеÑживаÑÑ. СÑÑÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñего ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñом, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑизиÑеÑки Ñ ÑаниÑÑ Ð¸Ð»Ð¸ каким-Ñо обÑазом воÑÑÑанавливаÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ðµ знаÑение даннÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа индекÑа. РкаÑеÑÑве конÑÑпÑимеÑа, индекÑÑ GIN неÑпоÑÐ¾Ð±Ð½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ ÑканиÑование ÑолÑко индекÑа, Ñак как в ÑлеменÑÐ°Ñ Ð¸Ð½Ð´ÐµÐºÑа обÑÑно Ñ ÑаниÑÑÑ ÑолÑко ÑаÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐапÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ обÑаÑаÑÑÑÑ ÑолÑко к ÑÑолбÑам, ÑÐ¾Ñ ÑанÑннÑм в индекÑе. ÐапÑимеÑ, еÑли в ÑаблиÑе поÑÑÑоен Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑам
xиy, и в ней еÑÑÑ Ñакже ÑÑолбеÑz, Ñакие запÑоÑÑ Ð±ÑдÑÑ Ð¸ÑполÑзоваÑÑ ÑканиÑование ÑолÑко индекÑа:SELECT x, y FROM tab WHERE x = 'key'; SELECT x FROM tab WHERE x = 'key' AND y < 42;
Ð ÑÑи запÑоÑÑ Ð½Ðµ бÑдÑÑ:
SELECT x, z FROM tab WHERE x = 'key'; SELECT x FROM tab WHERE x = 'key' AND z < 42;
(ÐндекÑÑ Ð¿Ð¾ вÑÑажениÑм и ÑаÑÑиÑнÑе индекÑÑ ÑÑложнÑÑÑ ÑÑо пÑавило, как опиÑано ниже.)
ÐÑли два ÑÑÐ¸Ñ ÑÑндаменÑалÑнÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ, Ñо вÑе даннÑе, ÑÑебÑемÑе Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, ÑодеÑжаÑÑÑ Ð² индекÑе, Ñак ÑÑо ÑканиÑование ÑолÑко по индекÑÑ ÑизиÑеÑки возможно. Ðо в Postgres Pro ÑÑÑеÑÑвÑÐµÑ Ð¸ еÑÑ Ð¾Ð´Ð½Ð¾ ÑÑебование Ð´Ð»Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ: Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑбедиÑÑÑÑ, ÑÑо вÑе возвÑаÑаемÑе ÑÑÑоки «виднÑ» в Ñнимке MVCC запÑоÑа, как опиÑано в Ðлаве 13. ÐнÑоÑмаÑÐ¸Ñ Ð¾ видимоÑÑи Ñ ÑаниÑÑÑ Ð½Ðµ в ÑлеменÑÐ°Ñ Ð¸Ð½Ð´ÐµÐºÑа, а ÑолÑко в кÑÑе; поÑÑÐ¾Ð¼Ñ Ð½Ð° пеÑвÑй взглÑд Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ, ÑÑо Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки вÑÑ Ñавно Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ обÑаÑаÑÑÑÑ Ðº кÑÑе. Ð ÑÑо в Ñамом деле Ñак, еÑли в ÑаблиÑе недавно пÑоизоÑли изменениÑ. Ðднако Ð´Ð»Ñ Ñедко менÑÑÑÐ¸Ñ ÑÑ Ð´Ð°Ð½Ð½ÑÑ ÐµÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±Ð¾Ð¹Ñи ÑÑÑ Ð¿ÑоблемÑ. Postgres Pro оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑаниÑÑ Ð² кÑÑе ÑаблиÑÑ, ÑвлÑÑÑÑÑ Ð»Ð¸ вÑе ÑÑÑоки в ÑÑой ÑÑÑаниÑе доÑÑаÑоÑно ÑÑаÑÑми, ÑÑÐ¾Ð±Ñ Ð¸Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ вÑе ÑекÑÑие и бÑдÑÑие ÑÑанзакÑии. ÐÑо оÑÑажаеÑÑÑ Ð² биÑÐ°Ñ Ð² каÑÑе видимоÑÑи ÑаблиÑÑ. ÐÑоÑедÑÑа ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑолÑко индекÑа, Ð½Ð°Ð¹Ð´Ñ Ð¿Ð¾ÑенÑиалÑно Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² индекÑе, пÑовеÑÑÐµÑ Ð±Ð¸Ñ Ð² каÑÑе видимоÑÑи Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑей ÑÑÑаниÑÑ Ð² кÑÑе. ÐÑли он ÑÑÑановлен, знаÑÐ¸Ñ ÑÑа ÑÑÑока видна, и даннÑе могÑÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ ÑÑазÑ. РпÑоÑивном ÑлÑÑае пÑидÑÑÑÑ Ð¿Ð¾ÑеÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÑÑÑоки в кÑÑе и пÑовеÑиÑÑ, видима ли она, Ñак ÑÑо никакого вÑигÑÑÑа по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑм ÑканиÑованием индекÑа не бÑдеÑ. Ðднако в благопÑиÑÑном ÑлÑÑае обÑаÑение к кÑÑе заменÑеÑÑÑ Ð¾Ð±ÑаÑением к каÑÑе видимоÑÑи; но Ñак как каÑÑа видимоÑÑи на ÑеÑÑÑе поÑÑдка менÑÑе ÑооÑвеÑÑÑвÑÑÑей ей облаÑÑи кÑÑи, Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½ÐµÐ¹ ÑÑебÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ менÑÑе опеÑаÑий ÑизиÑеÑкого ввода-вÑвода. РболÑÑинÑÑве ÑиÑÑаÑий каÑÑа видимоÑÑи пÑоÑÑо вÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² памÑÑи.
Таким обÑазом, Ñогда как ÑканиÑование ÑолÑко по индекÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ лиÑÑ Ð¿Ñи вÑполнении двÑÑ ÑÑндаменÑалÑнÑÑ ÑÑебований, оно даÑÑ Ð²ÑигÑÑÑ, ÑолÑко еÑли Ð´Ð»Ñ Ð·Ð½Ð°ÑиÑелÑной ÑаÑÑи ÑÑÑÐ°Ð½Ð¸Ñ Ð² кÑÑе ÑаблиÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð±Ð¸ÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ видимоÑÑи. Ðо ÑаблиÑÑ, в коÑоÑÑÑ Ð¼ÐµÐ½ÑеÑÑÑ Ð»Ð¸ÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ°Ñ ÑаÑÑÑ ÑÑÑок, вÑÑÑеÑаÑÑÑÑ Ð´Ð¾ÑÑаÑоÑно ÑаÑÑо, ÑÑÐ¾Ð±Ñ ÑÑÐ¾Ñ Ñип ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ñл веÑÑма полезен на пÑакÑике.
ЧÑÐ¾Ð±Ñ ÑÑÑекÑивно иÑполÑзоваÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑолÑко индекÑа, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑоздаваÑÑ Ð¿Ð¾ÐºÑÑваÑÑие индекÑÑ. Такие индекÑÑ ÑпеÑиалÑно пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÑÑолбÑов, коÑоÑÑе ÑÑебÑÑÑÑÑ Ð² опÑеделÑннÑÑ
ÑаÑÑо вÑполнÑемÑÑ
запÑоÑаÑ
. Так как в запÑоÑаÑ
обÑÑно нÑжно полÑÑиÑÑ Ð½Ðµ ÑолÑко ÑÑолбÑÑ, по коÑоÑÑм вÑполнÑеÑÑÑ Ð¿Ð¾Ð¸Ñк, Postgres Pro позволÑÐµÑ ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ, в коÑоÑом некоÑоÑÑе ÑÑолбÑÑ Ð±ÑдÑÑ Ð¿ÑоÑÑо «дополниÑелÑной нагÑÑзкой», но не войдÑÑ Ð² поиÑковÑй клÑÑ. ÐÑо ÑеализÑеÑÑÑ Ð¿Ñедложением INCLUDE, в коÑоÑом пеÑеÑиÑлÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑолбÑÑ. ÐапÑимеÑ, еÑли ÑаÑÑо вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²Ð¸Ð´Ð°
SELECT y FROM tab WHERE x = 'key';
пÑи ÑÑадиÑионном подÑ
оде его можно ÑÑкоÑиÑÑ, Ñоздав Ð¸Ð½Ð´ÐµÐºÑ ÑолÑко по x. Ðднако Ñакой индекÑ:
CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);
Ð¼Ð¾Ð¶ÐµÑ ÑдовлеÑвоÑиÑÑ Ñакие запÑоÑÑ Ð¿Ñи ÑканиÑовании ÑолÑко индекÑа, Ñак как знаÑение y можно полÑÑиÑÑ Ð¸Ð· индекÑа, не обÑаÑаÑÑÑ Ðº даннÑм в кÑÑе.
Так как ÑÑÐ¾Ð»Ð±ÐµÑ y не ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¿Ð¾Ð¸Ñкового клÑÑа, он не обÑзаÑелÑно должен имеÑÑ Ñип даннÑÑ
, воÑпÑинимаемÑй даннÑм индекÑом; он пÑоÑÑо ÑоÑ
ÑанÑеÑÑÑ Ð²Ð½ÑÑÑи индекÑа и никак не обÑабаÑÑваеÑÑÑ Ð¼ÐµÑ
анизмом индекÑа. ÐÑоме Ñого, в ÑлÑÑае Ñ ÑникалÑнÑм индекÑом, напÑимеÑ:
CREATE UNIQUE INDEX tab_x_y ON tab(x) INCLUDE (y);
ÑÑловие ÑникалÑноÑÑи ÑаÑпÑоÑÑÑанÑеÑÑÑ ÑолÑко на ÑÑÐ¾Ð»Ð±ÐµÑ x, а не на x и y в ÑовокÑпноÑÑи. (ÐÑедложение INCLUDE можно Ñакже добавиÑÑ Ð² огÑаниÑÐµÐ½Ð¸Ñ UNIQUE и PRIMARY KEY, ÑÑо позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ñакой Ð¸Ð½Ð´ÐµÐºÑ Ð°Ð»ÑÑеÑнаÑивнÑм обÑазом.)
ÐобавлÑÑÑ Ð² Ð¸Ð½Ð´ÐµÐºÑ Ð½ÐµÐºÐ»ÑÑевÑе дополниÑелÑнÑе ÑÑолбÑÑ ÑледÑÐµÑ Ð¾Ð±Ð´Ñманно, оÑобенно когда ÑÑо болÑÑие ÑÑолбÑÑ. ÐÑли ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑÑежа в индекÑе пÑевÑÑÐ¸Ñ Ð¼Ð°ÐºÑималÑно допÑÑÑимÑй ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð»Ñ Ñипа индекÑов, пÑи добавлении даннÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка. РлÑбом ÑлÑÑае в неклÑÑевÑÑ ÑÑолбÑÐ°Ñ Ð´ÑблиÑÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе из Ñамой ÑаблиÑÑ, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑаздÑÐ²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа, а ÑледÑÑвием ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ðµ запÑоÑов. РпомниÑе, ÑÑо пÑакÑиÑеÑкий ÑмÑÑл вклÑÑаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑолбÑÑ Ð² Ð¸Ð½Ð´ÐµÐºÑ ÐµÑÑÑ ÑолÑко Ñогда, когда ÑаблиÑа менÑеÑÑÑ Ð´Ð¾ÑÑаÑоÑно медленно, и пÑи ÑканиÑовании ÑолÑко индекÑа не пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº кÑÑе. ÐÑли коÑÑеж в лÑбом ÑлÑÑае пÑидÑÑÑÑ Ð¿ÑоÑиÑÑваÑÑ Ð¸Ð· кÑÑи, полÑÑиÑÑ Ð·Ð½Ð°Ñение ÑÑолбÑа из него ниÑего не ÑÑоиÑ. ÐокÑÑваÑÑие индекÑÑ Ð¸Ð¼ÐµÑÑ Ð¸ дÑÑгие огÑаниÑениÑ: в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð² каÑеÑÑве неклÑÑевÑÑ ÑÑолбÑов нелÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð²ÑÑажениÑ, и поддеÑживаÑÑÑÑ Ñакие индекÑÑ ÑолÑко ÑÑÑÑ Ñипов: B-деÑевÑÑ, GiST и SP-GIST.
Ðо поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð² Postgres Pro покÑÑваÑÑиÑ
индекÑов (INCLUDE) полÑзоваÑелÑм иногда пÑиÑ
одилоÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑолбÑÑ ÐºÐ°Ðº обÑÑнÑе ÑÑолбÑÑ Ð¸Ð½Ð´ÐµÐºÑа, Ñо еÑÑÑ Ð¿Ð¸ÑаÑÑ
CREATE INDEX tab_x_y ON tab(x, y);
даже не намеÑеваÑÑÑ ÐºÐ¾Ð³Ð´Ð°-либо иÑполÑзоваÑÑ y в пÑедложении WHERE. ÐÑо ÑабоÑаеÑ, когда дополниÑелÑнÑе ÑÑолбÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² конеÑ; делаÑÑ Ð¸Ñ
наÑалÑнÑми неÑазÑмно по пÑиÑинам, опиÑаннÑм в Разделе 11.3. Ðднако ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од не годиÑÑÑ Ð´Ð»Ñ ÑлÑÑаÑ, когда вам нÑжно обеÑпеÑиÑÑ ÑникалÑноÑÑÑ ÐºÐ»ÑÑевого ÑÑолбÑа (ÑÑолбÑов).
РпÑоÑеÑÑе ÑÑеÑÐµÐ½Ð¸Ñ ÑÑÑÑикÑа Ñ Ð²ÐµÑÑ
ниÑ
ÑÑовней B-деÑева вÑегда ÑдалÑÑÑÑÑ Ð½ÐµÐºÐ»ÑÑевÑе ÑÑолбÑÑ. Так как они ÑодеÑÐ¶Ð°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð½Ð°Ð³ÑÑзкÑ, они никогда не ÑпÑавлÑÑÑ Ð¿Ð¾Ð¸Ñком по индекÑÑ. Ð ÑÑом пÑоÑеÑÑе Ñакже ÑдалÑеÑÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко замÑкаÑÑиÑ
ÑÑолбÑов, еÑли оÑÑаÑÑегоÑÑ Ð¿ÑеÑикÑа клÑÑевÑÑ
ÑÑолбÑов оказÑваеÑÑÑ Ð´Ð¾ÑÑаÑоÑно, ÑÑÐ¾Ð±Ñ Ð¾Ð¿Ð¸ÑаÑÑ ÐºÐ¾ÑÑежи на нижележаÑем ÑÑовне B-деÑева. Ðа пÑакÑике и в покÑÑваÑÑиÑ
индекÑаÑ
без пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ INCLUDE ÑаÑÑо ÑдаÑÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑÑолбÑов, коÑоÑÑе ввеÑÑ
Ñ Ð¿Ð¾ ÑÑÑи ÑвлÑÑÑÑÑ Ð´Ð¾Ð¿Ð½Ð°Ð³ÑÑзкой. Ðднако Ñвное обознаÑение дополниÑелÑнÑÑ
ÑÑолбÑов неклÑÑевÑми гаÑанÑиÑÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑй ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑÑежей на веÑÑ
ниÑ
ÑÑовнÑÑ
.
РпÑинÑипе ÑканиÑование ÑолÑко индекÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¸ Ñ Ð¸Ð½Ð´ÐµÐºÑами по вÑÑажениÑм. ÐапÑимеÑ, пÑи налиÑии индекÑа по f(x), где x â ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ, должно бÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ вÑполниÑÑ
SELECT f(x) FROM tab WHERE f(x) < 1;
как ÑканиÑование ÑолÑко индекÑа; и ÑÑо оÑÐµÐ½Ñ Ð·Ð°Ð¼Ð°Ð½Ñиво, еÑли f() â ÑÐ»Ð¾Ð¶Ð½Ð°Ñ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑиÑ. Ðднако планиÑовÑик Postgres Pro в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð½Ðµ оÑÐµÐ½Ñ ÑазÑмно. Ðн ÑÑиÑаеÑ, ÑÑо запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñо ÑканиÑованием ÑолÑко индекÑа, лиÑÑ ÐºÐ¾Ð³Ð´Ð° из индекÑа могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð²Ñе ÑÑолбÑÑ, ÑÑебÑÑÑиеÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа. Ð ÑÑом пÑимеÑе x ÑигÑÑиÑÑÐµÑ ÑолÑко в конÑекÑÑе f(x), но планиÑовÑик не замеÑÐ°ÐµÑ ÑÑого и ÑеÑаеÑ, ÑÑо ÑканиÑование ÑолÑко по индекÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾. ÐÑли ÑканиÑование ÑолÑко индекÑа заÑлÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñого, ÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обойÑи, добавив x как неклÑÑевой ÑÑолбеÑ, напÑимеÑ:
CREATE INDEX tab_f_x ON tab (f(x)) INCLUDE (x);
ÐÑли ÑÑо делаеÑÑÑ Ñади пÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑнÑÑ
вÑÑиÑлений f(x), ÑледÑÐµÑ Ñакже ÑÑеÑÑÑ, ÑÑо планиÑовÑик не обÑзаÑелÑно ÑвÑÐ¶ÐµÑ ÑÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ f(x), ÑигÑÑиÑÑÑÑие вне индекÑиÑÑемÑÑ
пÑедложений WHERE, Ñо ÑÑолбÑом индекÑа. ÐбÑÑно он Ð´ÐµÐ»Ð°ÐµÑ ÑÑо пÑавилÑно в пÑоÑÑÑÑ
запÑоÑаÑ
, вÑоде показанного вÑÑе, но не в запÑоÑаÑ
Ñ ÑоединениÑми. ÐÑи недоÑÑаÑки могÑÑ Ð±ÑÑÑ ÑÑÑÑÐ°Ð½ÐµÐ½Ñ Ð² бÑдÑÑиÑ
веÑÑиÑÑ
Postgres Pro.
С иÑполÑзованием ÑаÑÑиÑнÑÑ Ð¸Ð½Ð´ÐµÐºÑов пÑи ÑканиÑовании ÑолÑко по индекÑÑ Ñоже ÑвÑÐ·Ð°Ð½Ñ Ð¸Ð½ÑеÑеÑнÑе оÑобенноÑÑи. ÐÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑаÑÑиÑнÑй индекÑ, показаннÑй в ÐÑимеÑе 11.3:
CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
WHERE success;РпÑинÑипе Ñ Ð½Ð¸Ð¼ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑоизвеÑÑи ÑканиÑование ÑолÑко по индекÑÑ Ð¿Ñи вÑполнении запÑоÑа
SELECT target FROM tests WHERE subject = 'some-subject' AND success;
Ðо еÑÑÑ Ð¾Ð´Ð½Ð° пÑоблема: пÑедложение WHERE обÑаÑаеÑÑÑ Ðº ÑÑолбÑÑ success, коÑоÑÑй оÑÑÑÑÑÑвÑÐµÑ Ð² ÑезÑлÑÑиÑÑÑÑиÑ
ÑÑолбÑаÑ
индекÑа. Тем не менее ÑканиÑование ÑолÑко индекÑа возможно, Ñак как Ð¿Ð»Ð°Ð½Ñ Ð½Ðµ нÑжно пеÑепÑовеÑÑÑÑ ÑÑÑ ÑаÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE во вÑÐµÐ¼Ñ Ð²ÑполнениÑ: Ñ Ð²ÑеÑ
запиÑей, найденнÑÑ
в индекÑе, знаÑение success = true, Ñак ÑÑо в плане его не нÑжно пÑовеÑÑÑÑ Ñвно. Postgres Pro веÑÑий 9.6 и новее ÑаÑÐ¿Ð¾Ð·Ð½Ð°ÐµÑ ÑакÑÑ ÑиÑÑаÑÐ¸Ñ Ð¸ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑоизвеÑÑи ÑканиÑование ÑолÑко по индекÑÑ, но ÑÑаÑÑе веÑÑии неÑпоÑÐ¾Ð±Ð½Ñ Ð½Ð° ÑÑо.