14.2. СÑаÑиÑÑика, иÑполÑзÑÐµÐ¼Ð°Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑиком
14.2.1. СÑаÑиÑÑика по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ
Ðак бÑло показано в пÑедÑдÑÑем Ñазделе, планиÑовÑик запÑоÑов должен оÑениÑÑ ÑиÑло ÑÑÑок, возвÑаÑаемÑÑ Ð·Ð°Ð¿ÑоÑов, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¿ÑавилÑнÑй вÑÐ±Ð¾Ñ Ð² оÑноÑении плана запÑоÑа. Ð ÑÑом Ñазделе кÑаÑко опиÑÑваеÑÑÑ ÑÑаÑиÑÑика, коÑоÑÑÑ Ð¸ÑполÑзÑÐµÑ ÑиÑÑема Ð´Ð»Ñ ÑÑÐ¸Ñ Ð¾Ñенок.
Ð ÑаÑÑноÑÑи, ÑÑаÑиÑÑика вклÑÑÐ°ÐµÑ Ð¾Ð±Ñее ÑиÑло запиÑей в каждой ÑаблиÑе и индекÑе, а Ñакже ÑиÑло диÑковÑÑ
блоков, коÑоÑÑе они занимаÑÑ. ÐÑа инÑоÑмаÑÐ¸Ñ ÑодеÑжиÑÑÑ Ð² ÑаблиÑе pg_class, в ÑÑолбÑаÑ
reltuples и relpages. ÐолÑÑиÑÑ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾, напÑÐ¸Ð¼ÐµÑ Ñак:
SELECT relname, relkind, reltuples, relpages
FROM pg_class
WHERE relname LIKE 'tenk1%';
relname | relkind | reltuples | relpages
----------------------+---------+-----------+----------
tenk1 | r | 10000 | 358
tenk1_hundred | i | 10000 | 30
tenk1_thous_tenthous | i | 10000 | 30
tenk1_unique1 | i | 10000 | 30
tenk1_unique2 | i | 10000 | 30
(5 rows)
ÐдеÑÑ Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо tenk1 ÑодеÑÐ¶Ð¸Ñ 10000 ÑÑÑок даннÑÑ
и ÑÑолÑко же ÑÑÑок в индекÑаÑ
, но обÑÑм индекÑов гоÑаздо менÑÑе ÑаблиÑÑ (ÑÑо неÑдивиÑелÑно).
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑей ÑÑÑекÑивноÑÑи reltuples и relpages не пеÑеÑÑиÑÑваÑÑÑÑ Â«Ð½Ð° леÑÑ», Ñак ÑÑо они обÑÑно ÑодеÑÐ¶Ð°Ñ Ð½ÐµÑколÑко ÑÑÑаÑевÑие знаÑениÑ. ÐÑ
обновлÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM, ANALYZE и неÑколÑко команд DDL, Ñакие как CREATE INDEX. VACUUM и ANALYZE могÑÑ Ð½Ðµ ÑканиÑоваÑÑ Ð²ÑÑ ÑаблиÑÑ (и обÑÑно Ñак и делаÑÑ), а ÑолÑко вÑÑиÑлиÑÑ Ð¿ÑиÑаÑение reltuples по ÑаÑÑи ÑаблиÑÑ, Ñак ÑÑо ÑезÑлÑÑÐ°Ñ Ð¾ÑÑаÑÑÑÑ Ð¿ÑиблизиÑелÑнÑм. РлÑбом ÑлÑÑае планиÑовÑик пеÑеÑÑиÑÑÐ²Ð°ÐµÑ Ð·Ð½Ð°ÑениÑ, полÑÑеннÑе из pg_class, в пÑопоÑÑии к ÑекÑÑÐµÐ¼Ñ ÑизиÑеÑÐºÐ¾Ð¼Ñ ÑазмеÑÑ ÑаблиÑÑ Ð¸ Ñаким обÑазом ÑÑоÑнÑÐµÑ Ð¿Ñиближение.
ÐолÑÑинÑÑво запÑоÑов возвÑаÑаÑÑ Ð½Ðµ вÑе ÑÑÑоки ÑаблиÑÑ, а ÑолÑко немногие из ниÑ
, огÑаниÑеннÑе ÑÑловиÑми WHERE. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑÐ¸ÐºÑ Ð½Ñжно оÑениÑÑ Ð¸Ð·Ð±Ð¸ÑаÑелÑноÑÑÑ ÑÑловий WHERE, Ñо еÑÑÑ Ð¾Ð¿ÑеделиÑÑ, какой пÑоÑÐµÐ½Ñ ÑÑÑок бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð² пÑедложении WHERE. ÐÑÐ¶Ð½Ð°Ñ Ð´Ð»Ñ ÑÑого инÑоÑмаÑÐ¸Ñ Ñ
ÑаниÑÑÑ Ð² ÑиÑÑемном каÑалоге pg_statistic. ÐнаÑÐµÐ½Ð¸Ñ Ð² pg_statistic обновлÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ ANALYZE и VACUUM ANALYZE и никогда не бÑваÑÑ ÑоÑнÑми, даже ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле обновлениÑ.
ÐÐ»Ñ Ð¸ÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑаÑиÑÑики лÑÑÑе обÑаÑаÑÑÑÑ Ð½Ðµ непоÑÑедÑÑвенно к ÑаблиÑе pg_statistic, а к пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ pg_stats, пÑедназнаÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³ÑÐµÐ½Ð¸Ñ Ð²Ð¾ÑпÑиÑÑÐ¸Ñ ÑÑой инÑоÑмаÑии. ÐÑоме Ñого, пÑедÑÑавление pg_stats доÑÑÑпно Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð²Ñем, Ñогда как pg_statistic â ÑолÑко ÑÑпеÑполÑзоваÑелÑм. (ÐÑо Ñделано Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð½ÐµÐ¿ÑивилегиÑованнÑе полÑзоваÑели не могли ниÑего ÑзнаÑÑ Ð¾ ÑодеÑжимом ÑÐ°Ð±Ð»Ð¸Ñ Ð´ÑÑгиÑ
лÑдей из ÑÑаÑиÑÑики. ÐÑедÑÑавление pg_stats ÑÑÑÑоено Ñак, ÑÑо оно показÑÐ²Ð°ÐµÑ ÑÑÑоки ÑолÑко Ð´Ð»Ñ ÑеÑ
ÑаблиÑ, коÑоÑÑе Ð¼Ð¾Ð¶ÐµÑ ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñй полÑзоваÑелÑ.) ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполниÑÑ:
SELECT attname, inherited, n_distinct,
array_to_string(most_common_vals, E'\n') as most_common_vals
FROM pg_stats
WHERE tablename = 'road';
attname | inherited | n_distinct | most_common_vals
---------+-----------+------------+------------------------------------
name | f | -0.363388 | I- 580 Ramp+
| | | I- 880 Ramp+
| | | Sp Railroad +
| | | I- 580 +
| | | I- 680 Ramp
name | t | -0.284859 | I- 880 Ramp+
| | | I- 580 Ramp+
| | | I- 680 Ramp+
| | | I- 580 +
| | | State Hwy 13 Ramp
(2 rows)
ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа показÑваÑÑÑÑ Ð´Ð²Ðµ ÑÑÑоки: одна ÑооÑвеÑÑÑвÑÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ иеÑаÑÑ
ии наÑледованиÑ, поÑÑÑоенной Ð´Ð»Ñ ÑаблиÑÑ road (inherited=t), и дÑÑÐ³Ð°Ñ Ð¾ÑноÑиÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно к ÑаблиÑе road (inherited=f).
ÐбÑÑм инÑоÑмаÑии, ÑоÑ
ÑанÑемой в pg_statistic командой ANALYZE, в ÑаÑÑноÑÑи макÑималÑное ÑиÑло запиÑей в маÑÑиваÑ
most_common_vals (ÑамÑе попÑлÑÑнÑе знаÑениÑ) и histogram_bounds (гÑаниÑÑ Ð³Ð¸ÑÑогÑамм) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа, можно огÑаниÑиÑÑ Ð½Ð° ÑÑовне ÑÑолбÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TABLE SET STATISTICS или глобалÑно, ÑÑÑановив паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии default_statistics_target. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð³ÑаниÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ñавно 100 запиÑÑм. УвелиÑÐ¸Ð²Ð°Ñ ÑÑÐ¾Ñ Ð¿Ñедел, можно повÑÑиÑÑ ÑоÑноÑÑÑ Ð¾Ñенок планиÑовÑика, оÑобенно Ð´Ð»Ñ ÑÑолбÑов Ñ Ð½ÐµÑегÑлÑÑнÑм ÑаÑпÑеделением даннÑÑ
, Ñеной ÑоÑÑа ÑазмеÑа pg_statistic и незнаÑиÑелÑного ÑвелиÑÐµÐ½Ð¸Ñ Ð²Ñемени ÑаÑÑÑÑа ÑÑиÑ
оÑенок. РнапÑоÑив, Ð´Ð»Ñ ÑÑолбÑов Ñ Ð¿ÑоÑÑÑм ÑаÑпÑеделением даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾ÑÑаÑоÑно менÑÑего пÑедела.
ÐодÑобнее иÑполÑзование ÑÑаÑиÑÑики планиÑовÑиком опиÑÑваеÑÑÑ Ð² Ðлаве 67.
14.2.2. РаÑÑиÑÐµÐ½Ð½Ð°Ñ ÑÑаÑиÑÑика
ЧаÑÑо наблÑдаеÑÑÑ ÐºÐ°ÑÑина, когда медленное вÑполнение запÑоÑов обÑÑÑнÑеÑÑÑ Ð¿Ð»Ð¾Ñ Ð¸Ð¼ вÑбоÑом плана из-за Ñого, ÑÑо неÑколÑко ÑÑолбÑов, ÑигÑÑиÑÑÑÑÐ¸Ñ Ð² ÑÑловиÑÑ Ð·Ð°Ð¿ÑоÑа, оказÑваÑÑÑÑ ÑвÑзаннÑми. ÐбÑÑно планиÑовÑик полагаеÑ, ÑÑо неÑколÑко ÑÑловий не завиÑÑÑ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга, а ÑÑо пÑедположение оказÑваеÑÑÑ Ð½ÐµÐ²ÐµÑнÑм, когда знаÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ ÑÑолбÑов коÑÑелиÑÑÑÑ. ÐбÑÑÐ½Ð°Ñ ÑÑаÑиÑÑика, коÑоÑÐ°Ñ Ð¿Ð¾ пÑиÑоде Ñвоей ÑÑÑоиÑÑÑ Ð¿Ð¾ оÑделÑнÑм ÑÑолбÑам, не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑвиÑÑ ÐºÐ¾ÑÑелÑÑии Ð¼ÐµÐ¶Ð´Ñ ÑÑолбÑами. Ðднако Postgres Pro Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑÑиÑлÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð²Ð°ÑианÑнÑÑ ÑÑаÑиÑÑикÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ ÑÑого инÑоÑмаÑиÑ.
Так как ÑиÑло возможнÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий ÑÑолбÑов оÑÐµÐ½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾, авÑомаÑиÑеÑки вÑÑиÑлÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð²Ð°ÑианÑнÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð½ÐµÐ¿ÑакÑиÑно. ÐмеÑÑо ÑÑого можно ÑоздаÑÑ Ð¾Ð±ÑекÑÑ ÑаÑÑиÑенной ÑÑаÑиÑÑики, ÑаÑе назÑваемÑе пÑоÑÑо обÑекÑами ÑÑаÑиÑÑики, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ ÑобиÑал ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ некоÑоÑÑм набоÑам ÑÑолбÑов, пÑедÑÑавлÑÑÑим инÑеÑеÑ.
ÐбÑекÑÑ ÑÑаÑиÑÑики ÑоздаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE STATISTICS. ÐÑи Ñоздании Ñакого обÑекÑа пÑоÑÑо добавлÑеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² каÑалоге, вÑÑажаÑÑÐ°Ñ Ð²Ð¾ÑÑÑебованноÑÑÑ ÑÑой ÑÑаÑиÑÑики. СобÑÑвенно ÑÐ±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
вÑполнÑеÑÑÑ Ð¿ÑоÑедÑÑой ANALYZE (запÑÑкаемой вÑÑÑнÑÑ Ð¸Ð»Ð¸ авÑомаÑиÑеÑки в Ñоновом пÑоÑеÑÑе). ÐзÑÑиÑÑ ÑобÑаннÑе знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в каÑалоге pg_statistic_ext_data.
Ðоманда ANALYZE вÑÑиÑлÑÐµÑ ÑаÑÑиÑеннÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ Ñой же вÑбоÑке ÑÑÑок ÑаблиÑÑ, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¸ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑной ÑÑаÑиÑÑики по оÑделÑнÑм ÑÑолбÑам. Так как ÑÐ°Ð·Ð¼ÐµÑ Ð²ÑбоÑки ÑвелиÑиваеÑÑÑ Ñ ÑвелиÑением Ñелевого огÑаниÑÐµÐ½Ð¸Ñ ÑÑаÑиÑÑики Ð´Ð»Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ лÑбÑÑ
ÐµÑ ÑÑолбÑов (как опиÑано в пÑедÑдÑÑем Ñазделе), пÑи болÑÑем Ñелевом огÑаниÑении обÑÑно полÑÑаеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑÐ½Ð°Ñ ÑаÑÑиÑÐµÐ½Ð½Ð°Ñ ÑÑаÑиÑÑика, но и вÑемени на ÐµÑ Ð²ÑÑиÑление ÑÑебÑеÑÑÑ Ð±Ð¾Ð»ÑÑе.
Ð ÑледÑÑÑÐ¸Ñ Ð¿Ð¾Ð´ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð²Ð¸Ð´Ñ ÑаÑÑиÑенной ÑÑаÑиÑÑики, поддеÑживаемÑе в наÑÑоÑÑее вÑемÑ.
14.2.2.1. ФÑнкÑионалÑнÑе завиÑимоÑÑи
ÐÑоÑÑейÑий вид ÑаÑÑиÑенной ÑÑаÑиÑÑики оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑнкÑионалÑнÑе завиÑимоÑÑи (ÑÑо понÑÑие иÑполÑзÑеÑÑÑ Ð² опÑеделении ноÑмалÑнÑÑ
ÑоÑм баз даннÑÑ
). ÐÑ Ð½Ð°Ð·Ñваем ÑÑÐ¾Ð»Ð±ÐµÑ b ÑÑнкÑионалÑно завиÑимÑм Ð¾Ñ ÑÑолбÑа a, еÑли Ð·Ð½Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ a доÑÑаÑоÑно Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ b, Ñо еÑÑÑ Ð½Ðµ ÑÑÑеÑÑвÑÐµÑ Ð´Ð²ÑÑ
ÑÑÑок Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми знаÑениÑми a, но ÑазнÑми знаÑениÑми b. РполноÑÑÑÑ Ð½Ð¾Ñмализованной базе даннÑÑ
ÑÑнкÑионалÑнÑе завиÑимоÑÑи Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑеÑÑвоваÑÑ ÑолÑко в пеÑвиÑнÑÑ
клÑÑаÑ
и ÑÑпеÑклÑÑаÑ
. Ðднако на пÑакÑике многие набоÑÑ Ð´Ð°Ð½Ð½ÑÑ
не ноÑмализÑÑÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¿Ð¾ ÑазнÑм пÑиÑинам; напÑимеÑ, деноÑмализаÑÐ¸Ñ ÑаÑÑо пÑоизводиÑÑÑ Ð½Ð°Ð¼ÐµÑенно по ÑообÑажениÑм пÑоизводиÑелÑноÑÑи.
СÑÑеÑÑвование ÑÑнкÑионалÑнÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑей напÑÑмÑÑ Ð²Ð»Ð¸ÑÐµÑ Ð½Ð° ÑоÑноÑÑÑ Ð¾Ñенок в опÑеделÑннÑÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ . ÐÑли запÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ ÐºÐ°Ðº по незавиÑимÑм, Ñак и по завиÑимÑм ÑÑолбÑам, ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾ завиÑимÑм ÑÑолбÑам дополниÑелÑно не ÑокÑаÑаÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑезÑлÑÑаÑа. Ðднако без Ð·Ð½Ð°Ð½Ð¸Ñ Ð¾ ÑÑнкÑионалÑной завиÑимоÑÑи планиÑовÑик запÑоÑов бÑÐ´ÐµÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑ, ÑÑо вÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑ, и недооÑÐµÐ½Ð¸Ñ ÑÐ°Ð·Ð¼ÐµÑ ÑезÑлÑÑаÑа.
ÐÐ»Ñ Ð¸Ð½ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика о ÑÑнкÑионалÑнÑÑ
завиÑимоÑÑÑÑ
команда ANALYZE Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñели завиÑимоÑÑей Ð¼ÐµÐ¶Ð´Ñ ÑÑолбÑами. ÐÑениÑÑ ÑÑÐµÐ¿ÐµÐ½Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи Ð¼ÐµÐ¶Ð´Ñ Ð²Ñеми набоÑами ÑÑолбÑов обоÑлоÑÑ Ð±Ñ Ð½ÐµÐ¿Ð¾Ð·Ð²Ð¾Ð»Ð¸ÑелÑно доÑого, поÑÑÐ¾Ð¼Ñ ÑÐ±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
огÑаниÑиваеÑÑÑ ÑолÑко Ñеми гÑÑппами ÑÑолбÑов, коÑоÑÑе ÑигÑÑиÑÑÑÑ Ð²Ð¼ÐµÑÑе в обÑекÑе ÑÑаÑиÑÑики, опÑеделÑнном Ñо ÑвойÑÑвом dependencies. Ðо избежание ненÑжнÑÑ
издеÑжек пÑи вÑполнении ANALYZE и поÑледÑÑÑем планиÑовании запÑоÑов ÑÑаÑиÑÑÐ¸ÐºÑ Ñ dependencies ÑекомендÑеÑÑÑ ÑоздаваÑÑ ÑолÑко Ð´Ð»Ñ Ð³ÑÑпп ÑилÑно коÑÑелиÑÑÑÑиÑ
ÑÑолбÑов.
ÐзглÑниÑе на пÑÐ¸Ð¼ÐµÑ ÑбоÑа ÑÑаÑиÑÑики ÑÑнкÑионалÑной завиÑимоÑÑи:
CREATE STATISTICS stts (dependencies) ON city, zip FROM zipcodes;
ANALYZE zipcodes;
SELECT stxname, stxkeys, stxddependencies
FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid)
WHERE stxname = 'stts';
stxname | stxkeys | stxddependencies
---------+---------+------------------------------------------
stts | 1 5 | {"1 => 5": 1.000000, "5 => 1": 0.423130}
(1 row)Рпоказанном ÑлÑÑае ÑÑÐ¾Ð»Ð±ÐµÑ 1 (код zip) полноÑÑÑÑ Ð¾Ð¿ÑеделÑÐµÑ ÑÑÐ¾Ð»Ð±ÐµÑ 5 (city), Ñак ÑÑо коÑÑÑиÑÐ¸ÐµÐ½Ñ Ñавен 1.0, Ñогда как гоÑод (ÑÑÐ¾Ð»Ð±ÐµÑ city) опÑеделÑÐµÑ ÐºÐ¾Ð´ ZIP ÑолÑко в 42% вÑÐµÑ ÑлÑÑаев, ÑÑо ознаÑаеÑ, ÑÑо многие гоÑода (58%) пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½ÐµÑколÑкими кодами ZIP.
ÐÑи вÑÑиÑлении избиÑаÑелÑноÑÑи запÑоÑа, в коÑоÑом задейÑÑÐ²Ð¾Ð²Ð°Ð½Ñ ÑÑнкÑионалÑно завиÑимÑе ÑÑолбÑÑ, планиÑовÑик коÑÑекÑиÑÑÐµÑ Ð¾Ñенки избиÑаÑелÑноÑÑи по ÑÑловиÑм, иÑполÑзÑÑ ÐºÐ¾ÑÑÑиÑиенÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑей, ÑÑÐ¾Ð±Ñ Ð½Ðµ допÑÑÑиÑÑ Ð½ÐµÐ´Ð¾Ð¾Ñенки ÑазмеÑа ÑезÑлÑÑаÑа.
14.2.2.1.1. ÐгÑаниÑÐµÐ½Ð¸Ñ ÑÑнкÑионалÑнÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑей
ФÑнкÑионалÑнÑе завиÑимоÑÑи в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿ÑименÑÑÑÑÑ ÑолÑко пÑи ÑаÑÑмоÑÑении пÑоÑÑÑÑ
ÑÑловий Ñ ÑавенÑÑвами, ÑÑавниваÑÑиÑ
знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов Ñ ÐºÐ¾Ð½ÑÑанÑами, и ÑÑловиÑми IN Ñ ÐºÐ¾Ð½ÑÑанÑами. Ðни не иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¾Ñенок пÑи пÑовеÑке ÑавенÑÑва двÑÑ
ÑÑолбÑов или ÑÑавнении ÑÑолбÑа Ñ Ð²ÑÑажением, а Ñакже в ÑÑловиÑÑ
Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼, ÑÑловиÑÑ
LIKE или лÑбÑÑ
дÑÑгиÑ
видаÑ
ÑÑловий.
РаÑÑмаÑÑÐ¸Ð²Ð°Ñ ÑÑнкÑионалÑнÑе завиÑимоÑÑи, планиÑовÑик пÑедполагаеÑ, ÑÑо ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾ задейÑÑвованнÑм ÑÑолбÑам ÑовмеÑÑÐ¸Ð¼Ñ Ð¸ Ñаким обÑазом избÑÑоÑнÑ. ÐÑли ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½ÐµÑовмеÑÑимÑ, пÑавилÑной оÑенкой должен бÑÑÑ Ð½Ð¾Ð»Ñ ÑÑÑок, но ÑÑа возможноÑÑÑ Ð½Ðµ ÑаÑÑмаÑÑиваеÑÑÑ. ÐапÑимеÑ, Ñ Ñаким запÑоÑом
SELECT * FROM zipcodes WHERE city = 'San Francisco' AND zip = '94105';
планиÑовÑик оÑбÑоÑÐ¸Ñ ÑÑловие Ñ city, Ñак как оно не влиÑÐµÑ Ð½Ð° избиÑаÑелÑноÑÑÑ, ÑÑо веÑно. Ðднако он ÑÐ´ÐµÐ»Ð°ÐµÑ Ñо же пÑедположение и в Ñаком ÑлÑÑае:
SELECT * FROM zipcodes WHERE city = 'San Francisco' AND zip = '90210';
Ñ Ð¾ÑÑ Ð½Ð° Ñамом деле ÑÑÐ¾Ð¼Ñ Ð·Ð°Ð¿ÑоÑÑ Ð±ÑÐ´ÐµÑ ÑдовлеÑвоÑÑÑÑ Ð½Ð¾Ð»Ñ ÑÑÑок. Ðо ÑÑаÑиÑÑика ÑÑнкÑионалÑной завиÑимоÑÑи не даÑÑ Ð´Ð¾ÑÑаÑоÑно инÑоÑмаÑии, ÑÑÐ¾Ð±Ñ Ð¿ÑийÑи к ÑÐ°ÐºÐ¾Ð¼Ñ Ð·Ð°ÐºÐ»ÑÑениÑ.
Ðо Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð¿ÑакÑиÑеÑÐºÐ¸Ñ ÑиÑÑаÑиÑÑ ÑÑо пÑедположение обÑÑно ÑдовлеÑвоÑÑеÑÑÑ; напÑимеÑ, гÑаÑиÑеÑкий инÑеÑÑÐµÐ¹Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего ÑоÑмиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ допÑÑкаÑÑ Ð²ÑÐ±Ð¾Ñ Ð½ÐµÑовмеÑÑимого ÑоÑеÑÐ°Ð½Ð¸Ñ Ð³Ð¾Ñода и кода ZIP. Ðо когда ÑÑо не Ñак, ÑÑаÑиÑÑика ÑÑнкÑионалÑной завиÑимоÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ подойÑи.
14.2.2.2. ÐноговаÑианÑное ÑиÑло ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений
СÑаÑиÑÑика по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ ÑодеÑÐ¶Ð¸Ñ ÑиÑло ÑазлиÑнÑÑ
знаÑений в каждом оÑделÑном ÑÑолбÑе. ÐÑенки ÑиÑла ÑазлиÑнÑÑ
знаÑений в ÑоÑеÑании неÑколÑкиÑ
ÑÑолбÑов (напÑимеÑ, в GROUP BY a, b) ÑаÑÑо оказÑваÑÑÑÑ Ð¾ÑибоÑнÑми, когда планиÑовÑик Ð¸Ð¼ÐµÐµÑ ÑÑаÑиÑÑиÑеÑкие даннÑе ÑолÑко по оÑделÑнÑм ÑÑолбÑам, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº вÑбоÑÑ Ð¿Ð»Ð¾Ñ
иÑ
планов.
ÐÐ»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑакиÑ
оÑенок опеÑаÑÐ¸Ñ ANALYZE Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ ÑазлиÑнÑм знаÑениÑм Ð´Ð»Ñ Ð³ÑÑÐ¿Ð¿Ñ ÑÑолбÑов. Ðак и Ñанее, ÑÑо непÑакÑиÑно делаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ возможной гÑÑÐ¿Ð¿Ñ ÑÑолбÑов, Ñак ÑÑо даннÑе ÑобиÑаÑÑÑÑ ÑолÑко по Ñем гÑÑппам ÑÑолбÑов, коÑоÑÑе ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² опÑеделении обÑекÑа ÑÑаÑиÑÑики, Ñоздаваемого Ñо ÑвойÑÑвом ndistinct. ÐаннÑе бÑдÑÑ ÑобиÑаÑÑÑÑ Ð¿Ð¾ вÑем возможнÑм ÑоÑеÑаниÑм из двÑÑ
или неÑколÑкиÑ
ÑÑолбÑов из пеÑеÑиÑленнÑÑ
в опÑеделении.
РпÑодолжение пÑедÑдÑÑего пÑимеÑа, колиÑеÑÑва ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений в ÑаблиÑе ZIP-кодов могÑÑ Ð²ÑглÑдеÑÑ Ñак:
CREATE STATISTICS stts2 (ndistinct) ON city, state, zip FROM zipcodes;
ANALYZE zipcodes;
SELECT stxkeys AS k, stxdndistinct AS nd
FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid)
WHERE stxname = 'stts2';
-[ RECORD 1 ]------------------------------------------------------â--
k | 1 2 5
nd | {"1, 2": 33178, "1, 5": 33178, "2, 5": 27435, "1, 2, 5": 33178}
(1 row)Ðак видно, еÑÑÑ ÑÑи комбинаÑии ÑÑолбÑов, имеÑÑÐ¸Ñ 33178 ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений: код ZIP и ÑÑаÑ; код ZIP и гоÑод; код ZIP, гоÑод и ÑÑÐ°Ñ (Ñо, ÑÑо вÑе ÑÑи ÑиÑла ÑавнÑ, ожидаемÑй ÑакÑ, Ñак как Ñам по Ñебе код ZIP в ÑÑой ÑаблиÑе Ñникален). С дÑÑгой ÑÑоÑонÑ, ÑоÑеÑание гоÑода и ÑÑаÑа даÑÑ ÑолÑко 27435 ÑазлиÑнÑÑ Ð·Ð½Ð°Ñений.
ÐбÑÐµÐºÑ ÑÑаÑиÑÑики ndistinct ÑекомендÑеÑÑÑ ÑоздаваÑÑ ÑолÑко Ð´Ð»Ñ ÑеÑ
ÑоÑеÑаний ÑÑолбÑов, коÑоÑÑе дейÑÑвиÑелÑно иÑполÑзÑÑÑÑÑ Ð¿Ñи гÑÑппиÑовке, и ÑолÑко когда непÑавилÑÐ½Ð°Ñ Ð¾Ñенка ÑиÑла гÑÑпп Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к вÑбоÑÑ Ð¿Ð»Ð¾Ñ
иÑ
планов. РпÑоÑивном ÑлÑÑае ÑÑилиÑ, поÑÑаÑеннÑе на вÑполнение ANALYZE, бÑдÑÑ Ð½Ð°Ð¿ÑаÑнÑми.
14.2.2.3. ÐноговаÑианÑнÑе ÑпиÑки MCV
ÐÑÑ Ð¾Ð´Ð¸Ð½ Ñип ÑÑаÑиÑÑики, ÑÐ¾Ñ ÑанÑемой Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа, пÑедÑÑавлÑÑÑ ÑпиÑки ÑаÑÑÑÑ Ð·Ð½Ð°Ñений. Такие ÑпиÑки позволÑÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¾ÑÐµÐ½Ñ ÑоÑнÑÑ Ð¾ÑÐµÐ½ÐºÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ ÑÑолбÑов, но Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, ÑодеÑжаÑÐ¸Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ñ Ð½ÐµÑколÑкими ÑÑолбÑами, полÑÑÐµÐ½Ð½Ð°Ñ Ð¿Ð¾ ним оÑенка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð½Ð°ÑиÑелÑно иÑкажена.
ÐÐ»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑакиÑ
оÑенок опеÑаÑÐ¸Ñ ANALYZE Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ ÑпиÑки MCV по комбинаÑиÑм ÑÑолбÑов. Ðодобно ÑÑаÑиÑÑике ÑÑнкÑионалÑнÑÑ
завиÑимоÑÑей и ÑазлиÑнÑÑ
знаÑений, ÑакÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð½ÐµÐ¿ÑакÑиÑно ÑобиÑаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ возможной гÑÑппиÑовки ÑÑолбÑов. Рданном ÑлÑÑае ÑÑо еÑÑ Ð±Ð¾Ð»ÐµÐµ акÑÑалÑно, Ñак как ÑпиÑки MCV (в оÑлиÑие Ð¾Ñ Ð´Ð²ÑÑ
ÑпомÑнÑÑÑÑ
ÑÑаÑиÑÑик) ÑодеÑÐ¶Ð°Ñ ÑаÑпÑоÑÑÑанÑннÑе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñе Ð´Ð»Ñ Ð½Ð¸Ñ
ÑобиÑаÑÑÑÑ ÑолÑко по Ñем гÑÑппам ÑÑолбÑов, коÑоÑÑе ÑигÑÑиÑÑÑÑ Ð² обÑекÑе ÑÑаÑиÑÑики, опÑеделÑнном Ñ Ñказанием mcv.
РпÑодолжение пÑедÑдÑÑего пÑимеÑа, ÑпиÑок MCV Ð´Ð»Ñ ÑаблиÑÑ ZIP-кодов Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ ÑледÑÑÑим обÑазом (в оÑлиÑие Ð¾Ñ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑÑ Ñипов ÑÑаÑиÑÑики, Ð´Ð»Ñ ÐµÐ³Ð¾ анализа ÑÑебÑеÑÑÑ Ð¿ÑимениÑÑ ÑÑнкÑиÑ):
CREATE STATISTICS stts3 (mcv) ON city, state FROM zipcodes;
ANALYZE zipcodes;
SELECT m.* FROM pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid),
pg_mcv_list_items(stxdmcv) m WHERE stxname = 'stts3';
index | values | nulls | frequency | base_frequency
-------+------------------------+-------+-----------+----------------
0 | {Washington, DC} | {f,f} | 0.003467 | 2.7e-05
1 | {Apo, AE} | {f,f} | 0.003067 | 1.9e-05
2 | {Houston, TX} | {f,f} | 0.002167 | 0.000133
3 | {El Paso, TX} | {f,f} | 0.002 | 0.000113
4 | {New York, NY} | {f,f} | 0.001967 | 0.000114
5 | {Atlanta, GA} | {f,f} | 0.001633 | 3.3e-05
6 | {Sacramento, CA} | {f,f} | 0.001433 | 7.8e-05
7 | {Miami, FL} | {f,f} | 0.0014 | 6e-05
8 | {Dallas, TX} | {f,f} | 0.001367 | 8.8e-05
9 | {Chicago, IL} | {f,f} | 0.001333 | 5.1e-05
...
(99 rows)ÐÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑ, ÑÑо наиболее ÑаÑпÑоÑÑÑанÑннÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑÐ¸Ñ Ð³Ð¾Ñода и ÑÑаÑа обÑазÑÐµÑ Washington и DC, Ñ ÑаÑÑоÑой около 0.35% (в обÑÑме вÑбоÑки). ÐÐ°Ð·Ð¾Ð²Ð°Ñ ÑаÑÑоÑа ÑÑой комбинаÑии (вÑÑиÑÐ»ÐµÐ½Ð½Ð°Ñ Ð¸Ð· ÑаÑÑÐ¾Ñ Ð·Ð½Ð°Ñений в оÑделÑнÑÑ ÑÑолбÑÐ°Ñ ) ÑоÑÑавлÑÐµÑ Ð²Ñего 0.0027%, Ñо еÑÑÑ ÑÑа оÑенка оказÑваеÑÑÑ Ð·Ð°Ð½Ð¸Ð¶ÐµÐ½Ð½Ð¾Ð¹ на два поÑÑдка.
ÐбÑекÑÑ ÑÑаÑиÑÑики MCV ÑекомендÑеÑÑÑ ÑоздаваÑÑ ÑолÑко Ð´Ð»Ñ ÑеÑ
ÑоÑеÑаний ÑÑолбÑов, коÑоÑÑе дейÑÑвиÑелÑно иÑполÑзÑÑÑÑÑ Ð² ÑÑловиÑÑ
вмеÑÑе, и ÑолÑко когда непÑавилÑÐ½Ð°Ñ Ð¾Ñенка ÑиÑла гÑÑпп Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к вÑбоÑÑ Ð¿Ð»Ð¾Ñ
иÑ
планов. РпÑоÑивном ÑлÑÑае ÑÑилиÑ, поÑÑаÑеннÑе на вÑполнение ANALYZE и планиÑование, бÑдÑÑ Ð½Ð°Ð¿ÑаÑнÑми.