データベースのページ・サイズが大きすぎる場合の 解決策とパフォーマンスの問題

概要:データベース・サーバでは、データベース・サーバで実行中のすべてのデータベースで最大のページ・サイズ以上のページ・サイズを使用する必要があります。それよりも小さいサイズを使用すると、”Page size too big” というエラー・メッセージが表示されます。

Adaptive Server Anywhere (SQL Anywhere)でのデータベース・サーバのページ・サイズとデータベースのページ・サイズの関係についての一般的な規則は、次のとおりです。

データベース・サーバでは、データベース・サーバで実行中のすべてのデータベースで最大のページ・サイズ以上のページ・サイズを使用する必要があります。

データベースをデータベース・サーバと同時に起動した場合は、データベース・サーバのページ・サイズは正しく設定されます。ただし、データベース・サーバで実行中のデータベースで最大のページ・サイズよりも大きなページ・サイズを指定して他のデータベースを動的に起動しようとすると、”Page size too big” エラー・メッセージが表示されます。

デフォルトでは、データベースは 1024 バイトのページ・サイズで作成されます (注意:Adaptive Server Anywhere (SQL Anywhere)6.0.3 以降では、デフォルトのページ・サイズは 2048 バイトです)。

解決策 1

特定のデータベース・サーバでどのデータベースが実行されているかを先に特定できる場合は、それらのデータベースで最大のページ・サイズにデータベース・サーバのページ・サイズを設定します。

例:

db1.db、db2.db、db3.db という 3 つのデータベースが named.db1 というサーバのドライブ C;\ にあり、ページ・サイズがそれぞれ 1024、1024、2048 であるとします。

次のコマンドは、いずれもデータベース・サーバ名 db1 のページサイズを 2048 バイトに設定します。

データベース・サーバの名前は、-n スイッチを使用してデータベース・サーバを明示的に指定していない場合は、最初に起動したデータベースと同じ名前になります。データベース・サーバのページ・サイズは、同時に起動したデータベースで最大のページ・サイズに設定します

dbsrv6 c:\db1.db c:\db2.db c:\db3.db

データベース・サーバのページ・サイズは、-gp スイッチをデータベース・サーバの起動コマンドで使用して明示的に 2048 バイトに設定します。

dbsrv6 -gp 2048 c:\db1.db c:\db2.db c:\db3.db

データベース・サーバのページ・サイズは、-gp スイッチをデータベース・サーバの起動コマンドで使用して明示的に 2048 バイトに設定します。データベース (db1) のページ・サイズは、この場合も 1024 バイトです。すべてのデータベース・サーバのページの半分は空白のままになります。

dbsrv6 -gp 2048 -n db1

データベース・サーバの名前は、データベースの指定前に、-n スイッチをデータベース・サーバの起動コマンドで使用して明示的に設定します。c:\db3.db のページ・サイズは 2048 バイトであるため、ページ・サイズは 2048 に設定されます。

dbsrv6 -n db1 c:\db3.db

DBINFO ユーティリティを使用して、データベースのページ・サイズを検証できます。

例:

dbinfo -c “uid=dba;pwd=sql;dbf=c:\db1.db”


解決策 2

データベースのページ・サイズを変更するには、異なるページ・サイズのデータベースを新しく作成し、元のデータベースをアンロードし、新しいページ・サイズの新しいデータベースに再ロードします。

例:

db1.db、db2.db、db3.dbという3つのデータベース名がdb1という named.db1 というサーバのドライブ C;\ にあり、ページ・サイズがそれぞれ 1024、1024、2048 であるとします。また、何らかの理由で、これらのデータベースでページ・サイズを 2048 バイトに統一するとします。db3.db の変更は不要です。db1.db と db2.db については、次のように操作します。このとき、c:\unload ディレクトリが存在するとします。

新しいページ・サイズの新しいデータベースを作成します。
dbinit -p 2048 c:\db1new.db

古いデータベースをアンロードします。
dbunload -c “uid=dba;pwd=sql;dbf=c:\db1.db” -r c:\reload.sql c:\unload

古いデータベースを新しいデータベースにリロードします。
isql -c “uid=dba;pwd=sql;dbf=c:\db1new.db” read c:\reload.sql

c:\db2.db に対して上記の手順を繰り返します。

パフォーマンスの問題

1 つのデータベース・サーバのページに格納できるのは、最大でも 1 つのデータベース・ページです。一方のページ・サイズが 4K、もう一方のページ・サイズが 1K の 2 つのデータベースを起動すると、データベース・サーバは 4K のページ・サイズを使用します。したがって、1K のデータベース・ページはデータベース・サーバのページの 4 分の 1 だけを使用します。データベース・ページのサイズが 512 バイトの場合は、1024 バイトのすべてのキャッシュ・ページの少なくとも半分が無駄になります。上位互換性のため 512 バイトのページ・サイズはサポートされていますが、上記の理由のため、使用はお勧めしません。