ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Иштеп чыгуучунун DBAга же бизнес ээси PostgreSQL кеңешчисине берген классикалык суроосу дээрлик дайыма бирдей угулат: "Эмне үчүн сурамдарды маалымат базасында толтуруу мынчалык көпкө созулат?"

Себептердин салттуу жыйындысы:

  • натыйжасыз алгоритм
    бир нече он миңдеген жазуулардын үстүнөн бир нече CTEге КОШУЛУУну чечкенде
  • тиешеси жок статистика
    эгерде таблицадагы маалыматтардын иш жүзүндө бөлүштүрүлүшү ANALYZE акыркы жолу чогулткандан такыр башкача болсо
  • ресурстарга "кошуу"
    жана CPU үчүн бөлүнгөн эсептөө күчү жетишсиз, гигабайт эстутум тынымсыз сорулуп турат же диск маалымат базасынын бардык "каалоолоруна" жете албайт
  • бөгөт коюу атаандаш процесстерден

Ал эми бөгөттөөлөрдү кармап, талдоо абдан кыйын болсо, анда бизге керек болгон бардык нерсе үчүн суроо планыколдонуу менен алууга болот EXPLAIN оператору (Албетте, дароо ТҮШҮНДҮРҮҮ (АНАЛИЗ, БУФЕР) жакшыраак ...) же auto_explain модулу.

Бирок, ошол эле документте айтылгандай,

«Планды түшүнүү бул искусство, аны өздөштүрүү үчүн белгилүү бир тажрыйба керек...»

Бирок туура куралды колдонсоңуз, ансыз деле кыла аласыз!

Сурам планы адатта кандай көрүнөт? Ушундай бир нерсе:

Index Scan using pg_class_relname_nsp_index on pg_class (actual time=0.049..0.050 rows=1 loops=1)
  Index Cond: (relname = $1)
  Filter: (oid = $0)
  Buffers: shared hit=4
  InitPlan 1 (returns $0,$1)
    ->  Limit (actual time=0.019..0.020 rows=1 loops=1)
          Buffers: shared hit=1
          ->  Seq Scan on pg_class pg_class_1 (actual time=0.015..0.015 rows=1 loops=1)
                Filter: (relkind = 'r'::"char")
                Rows Removed by Filter: 5
                Buffers: shared hit=1

же ушул сыяктуу:

"Append  (cost=868.60..878.95 rows=2 width=233) (actual time=0.024..0.144 rows=2 loops=1)"
"  Buffers: shared hit=3"
"  CTE cl"
"    ->  Seq Scan on pg_class  (cost=0.00..868.60 rows=9972 width=537) (actual time=0.016..0.042 rows=101 loops=1)"
"          Buffers: shared hit=3"
"  ->  Limit  (cost=0.00..0.10 rows=1 width=233) (actual time=0.023..0.024 rows=1 loops=1)"
"        Buffers: shared hit=1"
"        ->  CTE Scan on cl  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.021..0.021 rows=1 loops=1)"
"              Buffers: shared hit=1"
"  ->  Limit  (cost=10.00..10.10 rows=1 width=233) (actual time=0.117..0.118 rows=1 loops=1)"
"        Buffers: shared hit=2"
"        ->  CTE Scan on cl cl_1  (cost=0.00..997.20 rows=9972 width=233) (actual time=0.001..0.104 rows=101 loops=1)"
"              Buffers: shared hit=2"
"Planning Time: 0.634 ms"
"Execution Time: 0.248 ms"

Бирок "барактан" текстте планды окуу абдан кыйын жана түшүнүксүз:

  • түйүнүндө көрсөтүлөт ички дарак ресурстары боюнча сумма
    башкача айтканда, белгилүү бир түйүндү аткарууга канча убакыт кеткенин же таблицадагы бул көрсөткүч дисктен маалымат алып келгенин түшүнүү үчүн, кандайдыр бир жол менен бирин экинчисинен алып салуу керек.
  • түйүн убактысы керек илмек менен көбөйтүү
    ооба, кемитүү "башында" жасалышы керек болгон эң татаал операция эмес - акыры, аткаруу убактысы түйүндүн бир аткарылышы үчүн орточо көрсөткүч катары көрсөтүлөт жана алардын жүздөгөнү болушу мүмкүн.
  • жакшы, жана мунун баары чогуу негизги суроого жооп берүүгө тоскоол болот - анда ким "эң алсыз шилтеме"?

Мунун бардыгын бир нече жүздөгөн иштеп чыгуучуларыбызга түшүндүрүүгө аракет кылганыбызда, анын сырттан караганда мындай көрүнүшүн түшүндүк:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Бул бизге керек дегенди билдирет ...

курал

Анда биз планга жана суроо-талапка ылайык "ким күнөөлүү жана эмне кылуу керек" түшүнүүгө жардам берген бардык негизги механикаларды чогултууга аракет кылдык. Коомчулук менен тажрыйбаңыздын бир бөлүгүн бөлүшүңүз.
Жолугушуу жана колдонуу - description.tensor.ru

Пландардын көрүнүшү

План ушундай болуп турганда аны түшүнүү оңойбу?

Seq Scan on pg_class (actual time=0.009..1.304 rows=6609 loops=1)
  Buffers: shared hit=263
Planning Time: 0.108 ms
Execution Time: 1.800 ms

Анча эмес.

Бирок бул сыяктуу, кыскартылган түрдөнегизги көрсөткүчтөр бөлүнгөндө, бул алда канча айкын болот:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Бирок план татаалыраак болсо, ал жардамга келет Piechart убакыт бөлүштүрүү түйүндөр боюнча:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Эң кыйын варианттар үчүн ал жардам берүүгө шашат прогресс диаграммасы:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Мисалы, пландын бирден ашык түпкү тамыры болушу мүмкүн болгон анча маанилүү эмес жагдайлар бар:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керекТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Структуралык белгилери

Эгер пландын бүт структурасы жана анын ооруган жерлери мурунтан эле түзүлүп, көрүнүп турган болсо, анда аларды иштеп чыгуучуга бөлүп көрсөтүп, аларды "орус тилинде" түшүндүрүп берүүгө эмне үчүн болбосун?

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керекБиз буга чейин бир нече ондогон сунуш шаблондорун чогултканбыз.

Сап-сап суроо профили

Эми, эгерде сиз түпнуска суроо-талапты талданган планга кошсоңуз, анда ар бир жеке билдирүүгө канча убакыт сарпталганын көрө аласыз - ушул сыяктуу:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

...же бул сыяктуу:

ТҮШҮНДҮРҮҮ эмне жөнүндө унчукпай жатат жана аны кантип сүйлөшүү керек

Сурамга параметрлерди алмаштыруу

Эгерде сиз планга суроо-талапты гана эмес, ошондой эле журналдын DETAIL сабынан анын параметрлерин "тиркесеңиз", сиз аны кошумча варианттардын бирине көчүрүп алсаңыз болот:

  • суроодо маанини алмаштыруу менен
    Сиздин базаңызда түз аткаруу жана андан ары профилдештирүү үчүн

    SELECT 'const', 'param'::text;
  • ДАЯРДОО/АТКАРУУ аркылуу маанини алмаштыруу менен
    Параметрдик бөлүккө көңүл бурбай коюуга мүмкүн болгондо - мисалы, бөлүштүрүлгөн таблицаларда иштөөдө пландаштыруучунун ишин эмуляциялоо

    DEALLOCATE ALL;
    PREPARE q(text) AS SELECT 'const', $1::text;
    EXECUTE q('param'::text);
    

Пландардын архиви

Коюңуз, анализдеңиз, кесиптештериңиз менен бөлүшүңүз! Пландар архивде кала берет жана аларга кийинчерээк кайрылсаңыз болот: izah.tensor.ru/archive

Бирок планыңызды башкалар көрүшүн каалабасаңыз, "архивге жарыялабаңыз" кутучасын белгилөөнү унутпаңыз.

Кийинки макалаларда мен планды талдоодо пайда болгон кыйынчылыктар жана чечимдер жөнүндө сөз кылам.

Source: www.habr.com

Комментарий кошуу