sql >> データベース >  >> RDS >> PostgreSQL

postgreSQLの共有ヒットキャッシュ

    shared hit 基本的に、値はコンピュータのメインメモリにすでにキャッシュされており、ハードディスクからこれを読み取る必要がなかったことを意味します。

    メインメモリ(RAM)へのアクセスは非常に ハードディスクから値を読み取るよりも高速です。そのため、シェアヒット数が多いほどクエリが高速になります。

    Postgresを起動した直後は、メインメモリ(RAM)で利用できるデータはなく、すべてをハードディスクから読み取る必要があります。

    実行計画から次のステップを検討してください:

      ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.053..103.958 rows=392273 loops=1)
            Output: product_id, valid_from, valid_to, price
            Buffers: shared read=2818
            I/O Timings: read=48.382
    

    「バッファ:共有読み取り=2818」の部分は、2818ブロック(各8k)をハードディスクから読み取る必要があることを意味します(48ミリ秒かかりました-SSDがあります)。これらの2818ブロックはキャッシュに保存されました( "共有バッファ ")次に必要になったときに、データベースが(遅い)ハードディスクからそれらを(再度)読み取る必要がないようにします。

    そのステートメントを再実行すると、計画は次のように変更されます。

      ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.012..45.690 rows=392273 loops=1)
            Output: product_id, valid_from, valid_to, price
            Buffers: shared hit=2818
    

    つまり、前のステートメントがまだメインメモリ(=RAM)にあり、Postgresがハードディスクからそれらを読み取る必要がなかった2818ブロック。

    「メモリ」とは、「外部ストレージ」とは対照的に、常にコンピュータに組み込まれ、CPUに直接アクセスできるメインメモリ(RAM)を指します。

    Postgresが共有バッファを管理する方法についていくつかのプレゼンテーションがあります:




    1. 自動インクリメント列を参照しますか?

    2. MySQLでINSERT...SELECTを使用して列の値を追加する

    3. 'COPY .. TO ..'中に、指定されたタイムゾーンのタイムスタンプを現地時間に変換します。

    4. json列のデフォルト値を設定する