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

SQLite VACUUM

    概要 :このチュートリアルでは、SQLite VACUUMを使用する必要がある理由を説明します コマンドを実行し、それを使用してデータベースファイルを最適化する方法を示します。

    SQLite VACUUMが必要な理由 コマンド

    まず、テーブル、ビュー、インデックス、トリガーなどのデータベースオブジェクトを削除したり、テーブルからデータを削除したりしても、データベースのファイルサイズは変更されません。 SQLiteは削除されたオブジェクトを空きとしてマークし、将来の使用のために予約するためです。その結果、データベースファイルのサイズは常に大きくなります。

    次に、テーブルからデータを挿入または削除すると、特に挿入、更新、削除の数が多いデータベースの場合、インデックスとテーブルが断片化されます。

    第3に、挿入、更新、および削除操作により、個々のデータベースページ内に未使用のデータブロックが作成されます。 1ページに保存できる行数が減ります。したがって、テーブルを保持するページ数が増えます。このため、テーブルのストレージオーバーヘッドが増加し、読み取り/書き込みに時間がかかり、キャッシュパフォーマンスが低下します。

    SQLiteはVACUUMを提供します 上記の3つの問題すべてに対処するコマンド。

    SQLiteはまず、データベースファイル内のデータを一時データベースにコピーします。この操作は、データベースオブジェクトをデフラグし、空き領域を無視して、個々のページを再パックします。次に、SQLiteは一時データベースファイルの内容を元のデータベースファイルにコピーします。元のデータベースファイルは上書きされます。

    VACUUM コマンドはデータベースを再構築します。これを使用して、ページサイズ、ページ形式、デフォルトのエンコーディングなどのデータベース固有の構成パラメーターを変更できます。これを行うには、プラグマを使用して新しい値を設定してから、データベースをバキュームします。

    SQLite VACUUM コマンド

    VACUUM コマンドは、ROWID値を除いてデータベースの内容を変更しません。 INTEGER PRIMARY KEYを使用する場合 列、VACUUM その列の値は変更されません。ただし、エイリアスなしのROWIDを使用する場合は、VACUUM コマンドはROWID値をリセットします。 ROWID値の変更に加えて、VACUUM コマンドは、インデックスを最初から作成します。

    VACUUMを実行することをお勧めします 特にデータベースから大きなテーブルやインデックスを削除する場合は、定期的にコマンドを実行してください。

    VACCUMに注意することが重要です コマンドには、元のファイルとコピーを保持するためのストレージが必要です。また、VACUUM コマンドには、データベースファイルへの排他的アクセスが必要です。つまり、VACUUM データベースに保留中のSQLステートメントまたは開いているトランザクションがある場合、コマンドは正常に実行されません。

    現在、バージョン3.9.2の時点で、VACUUMを実行できます。 mainのコマンド 添付されたデータベースファイルではなく、データベース。

    SQLiteは、いくつかの制限付きでバキュームプロセスを自動的にトリガーする自動バキュームモードを有効にしますが。 VACUUMを実行することをお勧めします 手動でコマンドします。

    SQLite VACUUMを実行する方法 コマンド

    以下に、VACUUMを実行する方法を示します。 コマンド:

    VACUUM;Code language: SQL (Structured Query Language) (sql)

    コマンドの実行中は、開いているトランザクションがないことを確認してください。

    次のステートメントは、完全自動真空モードを有効にします。

    PRAGMA auto_vacuum = FULL;Code language: SQL (Structured Query Language) (sql)

    インクリメンタルバキュームを有効にするには、次のステートメントを使用します。

    PRAGMA auto_vacuum = INCREMENTAL;Code language: SQL (Structured Query Language) (sql)

    次のステートメントは、自動真空モードを無効にします。

    PRAGMA auto_vacuum = NONE;Code language: SQL (Structured Query Language) (sql)

    VACUUM INTOを使用 条項

    VACUUMの構文は次のとおりです INTOを使用 条項:

    VACUUM schema-name INTO filename;Code language: SQL (Structured Query Language) (sql)

    VACUUM INTOを含むステートメント 句は、元のデータベースファイルを変更せずに保持し、指定されたファイル名で新しいデータベースを作成します。新しいデータベースには、元のデータベースと同じ論理コンテンツが含まれますが、完全に真空化されています。

    filename INTOで 句は、文字列に評価される任意のSQL式にすることができます。存在しないファイルまたは空のファイルへのパス、またはVACUUM INTOへのパスである必要があります コマンドを実行するとエラーが発生します。

    VACUUM コマンドは、ライブデータベースのバックアップコピーを生成するのに非常に便利です。トランザクションセーフであり、生成されたデータベースは元のデータベースの一貫したスナップショットです。ただし、計画外のシャットダウンまたは電源喪失によってコマンドが中断されると、生成されたデータベースが破損する可能性があります。

    次のステートメントは、VACUUM INTOを使用しています chinook_backup.dbというファイル名で新しいデータベースを生成するコマンド mainからデータがコピーされた chinookのスキーマ データベース:

    VACUUM main INTO 'c:\sqlite\db\chinook_backup.db';Code language: JavaScript (javascript)

    このチュートリアルでは、SQLite VACUUMを使用する必要がある理由を学びました。 コマンドとそれを実行してデータベースを最適化する方法。


    1. SQL Serverのテーブル名がdboで始まるのはなぜですか?

    2. 修正方法「INSERTステートメントの選択リストには、挿入リストよりも少ない項目が含まれています」

    3. SQLclでクエリ結果をフォーマットする2つの方法(Oracle)

    4. 参加によるPostgresqlアップデート