EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Хөгжүүлэгчийн өөрийн 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"

Гэхдээ "хуудаснаас" текст дэх төлөвлөгөөг унших нь маш хэцүү бөгөөд тодорхойгүй байна:

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

Бид хэдэн зуун хөгжүүлэгчиддээ энэ бүхнийг тайлбарлахыг оролдохдоо гаднаас нь харахад ийм зүйл харагдаж байгааг ойлгосон.

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Энэ нь бидэнд хэрэгтэй гэсэн үг ...

Хэрэгсэл

Үүнд бид төлөвлөгөө, хүсэлтийн дагуу "хэн буруутай, юу хийх ёстойг" ойлгоход туслах бүх гол механикуудыг цуглуулахыг хичээсэн. За тэгээд өөрийн туршлагаасаа олон нийттэй хуваалцаарай.
Уулзаж, ашиглах - тайлбарлах.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

Яг ч тийм биш.

Гэхдээ үүн шиг, товчилсон хэлбэрээрГол үзүүлэлтүүдийг салгавал илүү тодорхой болно:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Гэхдээ төлөвлөгөө нь илүү төвөгтэй байвал тэр аврах ажилд ирнэ Piechart цагийн хуваарилалт зангилаагаар:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

За, хамгийн хэцүү сонголтуудын хувьд тэр туслахаар яарч байна явцын график:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Жишээлбэл, төлөвлөгөө нь нэгээс олон бодит үндэстэй байж болох маш чухал бус нөхцөл байдал байдаг:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэEXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Бүтцийн шинж тэмдгүүд

Хэрэв төлөвлөгөөний бүх бүтэц, түүний гашуун цэгүүд аль хэдийн тавигдаж, харагдахуйц байгаа бол яагаад үүнийг хөгжүүлэгчид онцолж, "орос хэлээр" тайлбарлаж болохгүй гэж?

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэБид хэдэн арван ийм зөвлөмжийн загварыг аль хэдийн цуглуулсан.

Мөр шугамаар асуулгын профайл үүсгэгч

Одоо, хэрэв та анхны асуулгад дүн шинжилгээ хийсэн төлөвлөгөөнд давхарлан оруулбал, тус бүрдээ хэр их цаг зарцуулсаныг харж болно - үүнтэй төстэй зүйл:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

... эсвэл бүр иймэрхүү:

EXPLAIN юуны талаар чимээгүй байна вэ, үүнийг яаж ярих вэ

Хүсэлтэд параметрүүдийг орлуулах

Хэрэв та зөвхөн төлөвлөгөөнд хүсэлтийг төдийгүй түүний параметрүүдийг бүртгэлийн ДЭЛГЭРЭНГҮЙ мөрөнд "хавсгасан" бол та үүнийг сонголтуудын аль нэгэнд нэмж хуулж болно.

  • асуулга дахь утгыг орлуулах
    өөрийн үндсэн дээр шууд гүйцэтгэл болон цаашдын профайл

    SELECT 'const', 'param'::text;
  • БЭЛТГЭХ/ГҮЙЦЭТГЭХ замаар үнэ цэнийг орлуулах
    параметрийн хэсгийг үл тоомсорлож болох үед хуваарийн ажлыг дуурайх, жишээлбэл, хуваасан хүснэгтүүд дээр ажиллах үед.

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

Төлөвлөгөөний архив

Хамтран ажиллагсадтайгаа буулгаж, дүн шинжилгээ хийж, хуваалцаарай! Төлөвлөгөөнүүд архивлагдсан хэвээр байх бөгөөд та дараа нь буцаж болно: тайлбарлах.tensor.ru/archive

Гэхдээ хэрэв та төлөвлөгөөгөө бусдад харуулахыг хүсэхгүй байгаа бол "архивт нийтлэхгүй" гэсэн нүдийг шалгахаа бүү мартаарай.

Дараах нийтлэлүүдэд би төлөвлөгөөнд дүн шинжилгээ хийхэд тулгарч буй бэрхшээл, шийдвэрийн талаар ярих болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх