Highload ++ 2017でのPostgres Proクむズタスク

Skolkovoで開催されたHigload ++ 2017で、圓瀟のPostgres Professionalは、ニシュティダクの埓来の配垃でクむズを開催したした。これは、2月のPgConf.Russia 2018のチケットでした。



この蚘事では、クむズの質問を調べたす。







1. SELECT * FROMナヌザヌWHERE lowername= 'vasya'ク゚リを効果的に実行できるのはどのタむプのむンデックスですか



PostgreSQLのlower関数は、文字列を小文字にキャストしたす。



a郚分的

b機胜

cカバヌ

d二次



倚くの人は、このク゚リがク゚リで䜿甚されるlower(name)



匏を䜿甚しお機胜むンデックスを実行するのに圹立぀ず掚枬したした。



 CREATE INDEX ON users ( lower(name) );
      
      





ただし、クむズの勝者の1人だけが、 郚分むンデックス



 CREATE INDEX ON users ( somefield) WHERE lower(name) = 'vasya' ;
      
      





somefield



はusers



テヌブルの任意のフィヌルドでも有効です。



citextデヌタ型を䜿甚しお、コンテキストに䟝存しない文字列を敎理するこずもできたす。



2.次のリストのどのタむプのむンデックスは存圚したせんか



a郚分的

b二次

c閉䌚

d機胜



正解は「閉じる」です。 カバヌするむンデックスはすでに存圚し、クロヌズするむンデックスはただ䜜成者を埅っおいたす。 あなたは䞀぀になれる

リク゚ストのカバリングむンデックスは、このリク゚ストを実行するのに十分なデヌタを含むむンデックスです。

有甚なカバリングむンデックスを簡単に䜜成できるようにするために、 CREATE INDEX...INCLUDE



コンストラクトがPostgreSQL甚に開発されたした。 これに぀いおは、PostgreSQLのこの機胜の䜜成者であるAnastasia LubennikovaずIvan Frolkovのプレれンテヌションで読むこずができたす。 これたでのずころ、コミュニティバヌゞョンには含たれおおらず、Postgres Proでのみ䜿甚できたす。



INCLUDE



コンストラクトの本質は、むンデックスのみのスキャンの適甚性を拡匵する远加のキヌではない情報をむンデックスに远加するこずです。 簡単な䟋で圌の仕事を説明したす。



むンデックスのみのスキャンは、結果を刀断するのに十分な情報がむンデックスにある堎合にク゚リ実行モヌドであり、テヌブル自䜓を調べる必芁はありたせん。



yにフィヌルドずむンデックスが含たれるテヌブルを甚意したす。



 CREATE TABLE users ( name text, score int ); REATE INDEX users_name_score ON users ( name, score );
      
      





ク゚リがテヌブルで実行される堎合



  SELECT name, score FROM users WHERE name = 'vasya';
      
      





このク゚リは、むンデックスのみのスキャンモヌドで実行できたす。



タスクを耇雑にしたしょう。 name



フィヌルドの䞀意性も制埡する必芁がありたす。

このため、 users_name_score



むンデックスusers_name_score



適切でusers_name_score



たせん。 UNIQUE



パラメヌタヌを定矩に远加するず、フィヌルドのペア name, score



の䞀意性が制埡されたす。



名前フィヌルドに別個の䞀意のむンデックスを䜜成できたすが、これはリ゜ヌスを倧量に消費するため、ここではカバヌむンデックスが圹立ちたす。



 CREATE UNIQUE INDEX ON users ( name ) INCLUDE ( score );
      
      





これで、スコアフィヌルドの倀はむンデックスに远加されたすが、キヌ郚分には远加されたせん。これにより、1぀のむンデックスで2぀の問題を解決できたす。



3.次のリストのうち、むンデックスではないものはどれですか



aハッシュ

bゞン

cりむスキヌ

dラム



WHISKEYむンデックスはただありたせん。 これが䜕を意味するのか考えおみおください。 特定のキヌなし ずころで、RUMがどの皋床正確に埩号化されるかはただ決定されおいたせん。



PostgreSQLには長い間Hashのようなむンデックスがありたしたが、実際には、WALログのサポヌトが぀いに登堎した10番目のバヌゞョンからしか䜿甚できたせん。 Bツリヌず比范しお、HASHむンデックスの有効性には倧きな疑問がありたした。



GINGeneralized Inverse iNdexは、Oleg BartunovずFedor Sigaevによっお開発された䞀般化された逆むンデックスです。 圌のデバむスに関する詳现はYegor Rogovの蚘事に曞かれおいたす 。 党文怜玢、むンデックス配列、JSONおよびJSONBに適しおいたす。



RUMは、党文怜玢を高速化するためにPostgres Professionalによっお開発された新しいタむプのむンデックスです。 RUMは Postgres Pro Enterpriseに含たれおいる拡匵機胜に実装されおいたすが、その゜ヌスはオヌプン゜ヌスであり、 githubで入手できたす。 RUMは、デヌタを倉曎する堎合、GINよりわずかに重いですが、むンデックスに远加情報を保存するこずで怜玢を高速化できたす。



4. ACIDで文字Iの実行を保蚌するものは䜕ですか



aトランザクションログ

bMVCC

c倖郚キヌ

d共有ペヌゞキャッシュ



正解はMVCCMultiVersion Concurrency Controlです。 ACID-DBMSデバむスの原則。アトミック性、䞀貫性、分離、耐久性を意味する略語。 この問題では、I-トランザクション分離に興味があり、それを実珟するためにマルチバヌゞョン性が䜿甚されたす。 各時点で、必芁な数のデヌタベヌス内の各レコヌドのバヌゞョンがあるため、各トランザクションはそれに察しお正しいバヌゞョンを芋るこずができたす。 たずえば、MVCCのおかげで、レコヌドを倉曎するUPDATEのトランザクションは、他の党員が同じレコヌドを読み取るこずを劚げたせん。 誰も必芁ずしない叀いバヌゞョンは、特別なバキュヌムプロセス 真空 で削陀されたす。 ほずんどのリレヌショナルデヌタベヌスシステムでは 、 競争力のあるデヌタアクセスによるトランザクション分離を保蚌するマルチバヌゞョン性が 䜿甚されおいたす。



5.論理耇補は同期できたすか



PostgreSQL 10は論理耇補を公​​匏に導入したした。 同期モヌドで機胜するには、 CREATE SUBSCRIPTION



コマンドで定矩されたサブスクリプション名をりィザヌドのsynchronous_standby_names



パラメヌタヌで指定する必芁がありたす。



6.ナヌザヌXは、ナヌザヌYが䜜成した䞀時テヌブルを芋぀けるこずができたすか もしそうなら、どのように、そうでなければ-なぜ



たぶん 䞀時テヌブルは通垞のテヌブルずほが同じ方法で配眮され、特別なスキヌムのみが割り圓おられたすナヌザヌセッションごずに1぀。



  SELECT nspname, ( SELECT json_agg(json_build_object('name',relname, 'owner', rolname)) FROM pg_class JOIN pg_roles ON pg_roles.oid = relowner WHERE relnamespace = pg_namespace.oid ) FROM pg_namespace WHERE nspname LIKE 'pg_temp%';
      
      





このク゚リを䜿甚するず、システム内のすべおの䞀時テヌブルずそれらの䜜成者を確認できたす。



7.ストアドプロシヌゞャを最も迅速に実行するために、どの蚀語で蚘述する必芁がありたすか



トリックの質問。 もちろん、最速はCです。しかし、SQLの方が速い堎合がありたす。 SQLの関数は、それを呌び出すク゚リに含めお、最適化するこずができたす。 Ivan Frolkovの蚘事で、SQLの関数のこのプロパティの詳现PL / PGSQLず混同しないでくださいを読むこずができたす。



䞀般的な手続き型蚀語の䞭で、PL / PgSQLは最速ではありたせん。 堎合によっおは、PL / PerlたたはPL / Python、さらにはPL / v8が著しく高速です。 プロシヌゞャがデヌタベヌスの操䜜だけでなく、コンピュヌティングやデヌタ凊理にも関䞎しおいる堎合、違いは特に顕著に芋えたす。



手続き型蚀語の比范に関する質問に぀いおは、それらのドキュメント PL / Perl 、 PL / Python 、 PL / v8 およびIvan Panchenkoのレポヌトを参照できたす。



8.芁求で関数Fが呌び出される回数

SELECT F(a%a) FROM generate_series(-1,1) a







正解は1回です。 匏a%a



は、倉数a



をそれ自䜓で割った䜙りを取埗a%a



こずを意味したす。 れロで陀算するこずは䞍可胜であるため、2回目の反埩で芁求は倱敗したす。 したがっお、倉数a



最初の倀のみが関数F



マむナス1になりたす。 ドキュメントで generate_series



関数に぀いお読むこずができたす 。



9. SELECT t.abc FROM tを芁求したす。 成功したすが、テヌブルtには列abcがありたせんtは実際にはテヌブルです。 これはどのように可胜であり、サンプルのabc列に䜕が衚瀺されたすか



これは、関数abc(t%rowtype)



いる堎合に可胜です。 この堎合の衚蚘t.abc



は、衚蚘abc(t)



ず同等です。 これは文曞化された機䌚であり、postgresにおける客芳性の痕跡です。



10. PostgreSQLむンスタンスはfsync = offパラメヌタヌを䜿甚しお動䜜しこれを行うこずはお勧めしたせん、デヌタベヌスにアクティブに曞き蟌みを行うセッションを提䟛したす。 OOMの最䞭に、キラヌがバック゚ンドの1぀を殺し、それに応じおポストマスタヌがむンスタンス党䜓を殺したした。 その埌、PostgreSQLむンスタンスが再起動されたした。 回埩プロセスはどのように終了したすか



ほずんどの参加者は、 fsync=off



が非垞に悪いこずを知っおいたした。倱敗するず、デヌタを倱う可胜性がありたす。 しかし、どのような倱敗で fsync



はOSバッファをディスクにフラッシュしおいたす。 OSバッファヌをディスクにフラッシュできないのはい぀ですか もちろん、OSのカヌネルの機胜が䞭断されたずき。 たずえば、ハヌドりェア障害䞭。 タスクの状態では、OSは正垞に機胜したす。したがっお、ディスク䞊のデヌタがフラッシュされ、次にpostgresが開始されるず、デヌタベヌスがWALから埩元されるこずを期埅するあらゆる理由がありたす。



謝蟞



Ivan Frolov、Alexander Alekseev、Arseniy Sher、Ivan Panchenkoが質疑応答の準備に参加したした。 そしお、もちろん、HighLoad ++ずそのオヌガナむザヌに向けられた称賛を歌うこずは避けられたせん。 い぀ものように、よくやったこずは最高でした。 本圓の䌑日。







クむズ結果



クむズの質問には50人のHighload参加者が回答したした。 その結果、2018幎2月5〜7日にモスクワで予定されおいるPgConf.Russia 2018䌚議ぞの7぀の無料招埅が行われたした。



All Articles