14.2. СÑаÑиÑÑика, иÑполÑзÑÐµÐ¼Ð°Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑиком
Ðак бÑло показано в пÑедÑдÑÑем Ñазделе, планиÑовÑик запÑоÑов должен оÑениÑÑ ÑиÑло ÑÑÑок, возвÑаÑаемÑÑ Ð·Ð°Ð¿ÑоÑов, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¿ÑавилÑнÑй вÑÐ±Ð¾Ñ Ð² оÑноÑении плана запÑоÑа. Ð ÑÑом Ñазделе кÑаÑко опиÑÑваеÑÑÑ ÑÑаÑиÑÑика, коÑоÑÑÑ Ð¸ÑполÑзÑÐµÑ ÑиÑÑема Ð´Ð»Ñ ÑÑÐ¸Ñ Ð¾Ñенок.
Ð ÑаÑÑноÑÑи, ÑÑаÑиÑÑика вклÑÑÐ°ÐµÑ Ð¾Ð±Ñее ÑиÑло запиÑей в каждой ÑаблиÑе и индекÑе, а Ñакже ÑиÑло диÑковÑÑ
блоков, коÑоÑÑе они занимаÑÑ. ÐÑа инÑоÑмаÑÐ¸Ñ ÑодеÑжиÑÑÑ Ð² ÑаблиÑе 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 и, возможно, ÑвелиÑÐµÐ½Ð¸Ñ Ð²Ñемени ÑаÑÑÑÑа ÑÑой ÑÑаÑиÑÑики. РнапÑоÑив, Ð´Ð»Ñ ÑÑолбÑов Ñ Ð¿ÑоÑÑÑм ÑаÑпÑеделением даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾ÑÑаÑоÑно менÑÑего пÑедела.
ÐодÑобнее иÑполÑзование ÑÑаÑиÑÑики планиÑовÑиком опиÑÑваеÑÑÑ Ð² Ðлаве 63.