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

PostgreSQLでNULLを使用していなくても、ヘッダーでNULLビットマップを使用しますか?

    実際にはそれよりも複雑です。

    nullビットマップには、行の列ごとに1ビットが必要であり、フルバイトに切り上げられます。実際の行に少なくとも1つのNULL値が含まれている場合にのみ存在し、その場合は完全に割り当てられます。 NOT NULL 制約はそれに直接影響しません。 (もちろん、テーブルのすべてのフィールドがNOT NULLの場合 、nullビットマップは存在できません。)

    「ヒープタプルヘッダー」(行ごと)の長さは23バイトです。実際のデータは、MAXALIGNの倍数で始まります (最大データアライメント )その後、これは通常64ビットOSでは8バイト(32ビットOSでは4バイト)です。ルートとしてPostgreSQLバイナリディレクトリから次のコマンドを実行して、決定的な答えを取得します。

    ./pg_controldata /path/to/my/dbcluster
    

    Postgres 12の典型的なDebianベースのインストールでは、次のようになります。

    sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
    

    いずれにせよ、ヘッダーとデータの整列された開始の間に1バイトの空きバイトがあり、これをnullビットマップが利用できます。テーブルに8列以下がある限り 、NULLストレージは事実上完全に無料 (ディスク容量に関する限り)

    その後、別のMAXALIGN (通常8バイト)は、別の(通常)64フィールドをカバーするためにヌルビットマップに割り当てられます。など

    これは少なくともバージョン8.4〜12で有効であり、ほとんどの場合変更されません。



    1. その緊急のとき

    2. 日付から曜日の名前を取得するにはどうすればよいですか?

    3. ORA-00054:リソースがビジーで、NOWAITを指定して取得します

    4. 列のデータ型をシリアルに変更