Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
新しいローは、データベースファイルのページサイズよりも小さい場合、常に単一のページに保管されます。現在のページに新しいローを保存する十分な空き領域がない場合、SQL Anywhere はローを新しいページに書き込みます。たとえば、新しいローが 600 バイトの領域を必要とするときに、ページの一部が埋まっていて 500 バイトしか使用できない場合、SQL Anywhere は新しいページにローを配置します。
ディスク上のテーブルページがさらに連続するように、SQL Anywhere はテーブルページを 8 ページのブロック単位で割り付けます。たとえば、1 ページの割り付けが必要な場合は、8 ページを割り付け、必要な 1 ページをブロックに挿入してから、ブロックの残りの 7 ページを埋めます。また、空きページビットマップを使用して、DB 領域内で連続するページブロックを検索します。次に、64 KB のグループを読み込み、ビットマップを使用して関連ページを検索し、逐次スキャンを実行します。このため、逐次スキャンの効率が高まります。
SQL Anywhere はページの領域を検索し、受け取った順序でローを挿入します。それぞれのローを 1 ページに割り当てますが、テーブル内で選択したロケーションは、ローが挿入された順序と一致しない場合があります。たとえば、データベースサーバは、長いローを隣接して保管するためにページを新しくする必要があることがあります。次のローが短い場合、そのローは前のページの空いているロケーションに配置されます。
すべてのテーブルのローには順序が付いていません。ローを受け取ったり処理したりする順序が重要である場合、SELECT 文で ORDER BY 句を使用し、結果に順序を付けます。テーブル内のローの順序に依存するアプリケーションは、警告なしに失敗することがあります。
テーブルのローを特定の順序にすることが頻繁に必要になる場合は、クエリの ORDER BY 句で指定したカラムにインデックスを作成することを検討してください。
デフォルトでは、SQL Anywhere は、ローを挿入する場合は必ず、ローを作成時の値で格納するために必要な領域だけを予約します。NULL 値、またはテキスト文字列などの拡張する可能性のあるフィールドを格納するための追加領域は予約しません。
SQL Anywhere に対して、テーブルの作成時に PCTFREE オプションを使用して領域を予約するよう強制できます。
一度ページ上にホーム位置が割り当てられると、ローは決してそのページから移動しません。更新によりローのいずれかの値が変更され、割り当てられているページに適合しなくなると、ローは分割され、追加情報が別のページに挿入されます。
この特性には注意が必要です。特に、ローの挿入時に SQL Anywhere は追加領域を許可しないためです。たとえば、大量の空のローを 1 つのテーブルに挿入して、UPDATE 文を使用して一度に 1 カラムずつ値を入力するとします。この結果、1 つのローにあるほとんどすべての値は別々のページに保存されます。1 つのローからすべての値を取り出すために、データベースサーバは複数のディスクページを読み込まなければならない場合があります。この簡単な操作にかなりの時間がかかることになります。
新しいローへのデータ配置を挿入時に行うことを検討してください。ローは一度挿入されれば、データを保持するのに十分な領域を確保します。
データベースにローを挿入してから削除すると、SQL Anywhere はローが使用していた領域を自動的に再利用します。したがって、SQL Anywhere は別のローが以前に使用していた領域に新しいローを挿入します。
SQL Anywhere は、各ページの空き領域の量の記録を保持しています。新しいローを挿入するよう要求されると、まず既存のページの領域の記録を検索します。既存のページで十分な領域を見つけると、新しいローをそのページに配置し、必要であればそのページの内容を再編成します。見つけられない場合には、新しいページを開始します。
いくつかのローを削除し、空き領域を使用できる程度の小さなローを新しく挿入しなかった場合、時間の経過とともにデータベース内の情報がまばらになることがあります。その場合は、テーブルを再ロードするか、REORGANIZE TABLE 文を使用してテーブルの断片化を解除できます。