11.12. ÐонÑÑÐ¾Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов
ХоÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð² Postgres Pro не ÑÑебÑÑÑ ÐºÐ°ÐºÐ¾Ð³Ð¾-либо обÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ наÑÑÑойки, ÑÑо не избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи пÑовеÑÑÑÑ, как и какие индекÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ð½Ð° Ñамом деле в ÑеалÑнÑÑ ÑÑловиÑÑ . УзнаÑÑ, как оÑделÑнÑй запÑÐ¾Ñ Ð¸ÑполÑзÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ, можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN; ÐµÑ Ð¿Ñименение Ð´Ð»Ñ ÑÑÐ¸Ñ Ñелей опиÑÑваеÑÑÑ Ð² Разделе 14.1. Также возможно ÑобÑаÑÑ Ð¾Ð±ÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¾Ð± иÑполÑзовании индекÑов на ÑабоÑаÑÑем ÑеÑвеÑе, как опиÑано в Разделе 26.2.
ÐÑвеÑÑи ÑнивеÑÑалÑнÑÑ ÑоÑмÑлÑ, опÑеделÑÑÑÑÑ, какие индекÑÑ Ð½Ñжно ÑоздаваÑÑ, доволÑно Ñложно, еÑли вообÑе возможно. РпÑедÑдÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ ÑаÑÑмаÑÑивалиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑиповÑе ÑиÑÑаÑии, иллÑÑÑÑиÑÑÑÑие Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ Ðº ÑÑÐ¾Ð¼Ñ Ð²Ð¾Ð¿ÑоÑÑ. ЧаÑÑо найÑи оÑÐ²ÐµÑ Ð½Ð° него помогаÑÑ ÑкÑпеÑименÑÑ. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ ÐµÑÑ Ð½ÐµÑколÑко ÑовеÑов:
ÐÑегда наÑинайÑе иÑÑледование Ñ ANALYZE. ÐÑа команда ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑиÑеÑкие даннÑе о ÑаÑпÑеделении знаÑений в ÑаблиÑе, коÑоÑÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾ÑÐµÐ½Ð¸Ð²Ð°Ð½Ð¸Ñ ÑиÑла ÑÑÑок, возвÑаÑаемÑÑ Ð·Ð°Ð¿ÑоÑов. Ð ÑÑо ÑиÑло, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, нÑжно планиÑовÑикÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑениÑÑ ÑеалÑнÑе заÑÑаÑÑ Ð´Ð»Ñ Ð²ÑевозможнÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. Ðе Ð¸Ð¼ÐµÑ ÑеалÑной ÑÑаÑиÑÑики, планиÑовÑик бÑÐ´ÐµÑ Ð²ÑнÑжден пÑинÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, коÑоÑÑе поÑÑи навеÑнÑка не бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑи. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð½ÑÑÑ, как Ð¸Ð½Ð´ÐµÐºÑ Ð¸ÑполÑзÑеÑÑÑ Ð¿Ñиложением без пÑедваÑиÑелÑного запÑÑка
ANALYZE, пÑакÑиÑеÑки невозможно. ÐодÑобнее ÑÑо ÑаÑÑмаÑÑиваеÑÑÑ Ð² ÐодÑазделе 23.1.3 и ÐодÑазделе 23.1.6.ÐÑполÑзÑйÑе в ÑкÑпеÑименÑÐ°Ñ ÑеалÑнÑе даннÑе. ÐнализиÑÑÑ ÑабоÑÑ ÑиÑÑÐµÐ¼Ñ Ñ ÑеÑÑовÑми даннÑми, Ð²Ñ Ð¿Ð¾Ð¹Ð¼ÑÑе, какие индекÑÑ Ð½ÑÐ¶Ð½Ñ Ð´Ð»Ñ ÑеÑÑовÑÑ Ð´Ð°Ð½Ð½ÑÑ , но не более Ñого.
ÐÑобенно ÑилÑно иÑкажаÑÑ ÐºÐ°ÑÑÐ¸Ð½Ñ Ð¾ÑÐµÐ½Ñ Ð¼Ð°Ð»ÐµÐ½Ñкие набоÑÑ ÑеÑÑовÑÑ Ð´Ð°Ð½Ð½ÑÑ . Тогда как Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ 1000 ÑÑÑок из 100000 Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑименÑн индекÑ, Ð´Ð»Ñ Ð²ÑбоÑа 1 из 100 он вÑÑд ли поÑÑебÑеÑÑÑ, Ñак как 100 ÑÑÑок ÑкоÑее вÑего ÑмеÑÑÑÑÑÑ Ð² Ð¾Ð´Ð½Ñ ÑÑÑаниÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½Ð° диÑке и никакой дÑÑгой план не бÑÐ´ÐµÑ Ð»ÑÑÑе обÑÑного ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ 1 ÑÑÑаниÑÑ.
Тем не менее, пока пÑиложение не ÑкÑплÑаÑиÑÑеÑÑÑ, ÑоздаваÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо ÑеÑÑовÑе даннÑе вÑÑ Ñавно нÑжно, и ÑÑо нÑжно делаÑÑ Ð¾Ð±Ð´Ñманно. ÐÑли Ð²Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÑеÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¾ÑÐµÐ½Ñ Ð±Ð»Ð¸Ð·ÐºÐ¸Ð¼Ð¸, или наобоÑоÑ, ÑлÑÑайнÑми знаÑениÑми, либо добавлÑеÑе ÑÑÑоки в оÑÑоÑÑиÑованном поÑÑдке, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе ÑовÑем не ÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ ÑаÑпÑеделениÑ, ÑÑо дадÑÑ ÑеалÑнÑе даннÑе.
Ðогда индекÑÑ Ð½Ðµ иÑполÑзÑÑÑÑÑ, Ñади ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ подклÑÑиÑÑ Ð¸Ñ Ð¿ÑинÑдиÑелÑно. ÐÐ»Ñ ÑÑого можно воÑполÑзоваÑÑÑÑ Ð¿Ð°ÑамеÑÑами вÑполнениÑ, позволÑÑÑими вÑклÑÑаÑÑ ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð¿Ð»Ð°Ð½Ð¾Ð² (Ñм. ÐодÑаздел 18.7.1). ÐапÑимеÑ, вÑклÑÑив наиболее пÑоÑÑÑе планÑ: поÑледоваÑелÑное ÑканиÑование (
enable_seqscan) и ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми Ñиклами (enable_nestloop), Ð²Ñ ÑможеÑе заÑÑавиÑÑ ÑиÑÑÐµÐ¼Ñ Ð²ÑбÑаÑÑ Ð´ÑÑгой план. ÐÑли же ÑиÑÑема пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð²ÑполнÑÑÑ ÑканиÑование или Ñоединение Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми Ñиклами, веÑоÑÑно, Ñ Ð½ÐµÑ ÐµÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑеÑÑÑÐ·Ð½Ð°Ñ Ð¿ÑиÑина не иÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ; напÑимеÑ, Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. (Ðакие индекÑÑ ÑабоÑаÑÑ Ð² запÑоÑÐ°Ñ ÑазнÑÑ Ñипов, обÑÑждалоÑÑ Ð² пÑедÑдÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ .)ÐÑли ÑиÑÑема наÑÐ¸Ð½Ð°ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ ÑолÑко под пÑинÑждением, ÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð²Ðµ пÑиÑинÑ: либо ÑиÑÑема пÑава и пÑименÑÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð² Ñамом деле неÑÑÑекÑивно, либо оÑенка ÑÑоимоÑÑи пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа не ÑооÑвеÑÑÑвÑÐµÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑи. Ð ÑÑом ÑлÑÑае вам ÑледÑÐµÑ Ð·Ð°Ð¼ÐµÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¸Ð½Ð´ÐµÐºÑами и без Ð½Ð¸Ñ . Ранализе ÑÑой ÑиÑÑаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° команда
EXPLAIN ANALYZE.ÐÑли вÑÑÑнÑеÑÑÑ, ÑÑо оÑенка ÑÑоимоÑÑи невеÑна, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ñоже два обÑÑÑнениÑ. ÐбÑÐ°Ñ ÑÑоимоÑÑÑ Ð²ÑÑиÑлÑеÑÑÑ ÐºÐ°Ðº пÑоизведение ÑÐµÐ½Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки и оÑенки избиÑаÑелÑноÑÑи Ñзла плана. Ð¦ÐµÐ½Ñ Ñзлов пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно измениÑÑ Ð¿Ð°ÑамеÑÑами вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (опиÑаннÑми в ÐодÑазделе 18.7.2). С дÑÑгой ÑÑоÑонÑ, оÑенка избиÑаÑелÑноÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑоÑной из-за некаÑеÑÑвенной ÑÑаÑиÑÑики. УлÑÑÑиÑÑ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾, наÑÑÑоив паÑамеÑÑÑ ÑбоÑа ÑÑаÑиÑÑики (Ñм. ALTER TABLE).
ÐÑли ваÑи попÑÑки ÑкоÑÑекÑиÑоваÑÑ ÑÑоимоÑÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² не ÑвенÑаÑÑÑÑ ÑÑÐ¿ÐµÑ Ð¾Ð¼, возможно вам оÑÑанеÑÑÑ ÑолÑко Ñвно заÑÑавиÑÑ ÑиÑÑÐµÐ¼Ñ Ð¸ÑполÑзоваÑÑ Ð½ÑжнÑй индекÑ. ÐеÑоÑÑно, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл Ñакже ÑвÑзаÑÑÑÑ Ñ ÑазÑабоÑÑиками Postgres Pro, ÑÑÐ¾Ð±Ñ Ð¿ÑоÑÑниÑÑ ÑиÑÑаÑиÑ.