クエリ定義を実行することで、マテリアライズドビューのデータを初期化または更新します。
REFRESH MATERIALIZED VIEW view-list [ WITH { ISOLATION LEVEL isolation-level | { EXCLUSIVE | SHARE } MODE } ] [ FORCE BUILD ]
view-list : [ owner.]materialized-view-name [, ... ]
isolation-level : READ UNCOMMITTED | READ COMMITTED | SERIALIZABLE | REPEATABLE READ | SNAPSHOT
WITH 句 WITH 句は、基本となるベーステーブルでリフレッシュ中に使用するロックの種類を指定する場合に使用します。ロックの種類によって、マテリアライズドビューの移植方法とトランザクションの同時実行性への影響が決まります。WITH 句の設定は、マテリアライズドビュー自体にかけられるロックの種類には影響しません。このロックは常に排他ロックです。ロックに指定できる句は、次のいずれかです。
ISOLATION LEVEL isolation-level WITH ISOLATION LEVEL は、リフレッシュ操作を実行する場合の独立性レベルを変更する場合に使用します。元の独立性レベルは、文の完了時に接続に対してリストアされます。
即時ビューの場合、isolation-level に指定できるのは SERIALIZABLE のみです。
スナップショットアイソレーションの場合、トランザクションスナップショットレベルのみが REFRESH MATERIALIZED VIEW 文でサポートされています。独立性レベルとして SNAPSHOT を指定してください。statement-snapshot と readonly-statement-snapshot レベルはサポートされていません。
EXCLUSIVE MODE WITH EXCLUSIVE MODE は、独立性レベルを変更しないが、基本となるテーブルにコミットされたデータと矛盾しないようにデータを確実に更新する場合に使用します。WITH EXCLUSIVE MODE を使用すると、基本となるすべてのベーステーブルに排他テーブルロックがかけられます。リフレッシュ操作が完了するまで、他のトランザクションによって、基本となるテーブルに対する問い合わせ、更新、その他のアクションは実行できなくなります。排他テーブルロックを取得できない場合、リフレッシュ操作は失敗し、エラーが返されます。
SHARE MODE WITH SHARE MODE は、リフレッシュ操作の実行中に、基本となるテーブルを他のトランザクションで読み込めるようにするために使用します。この句を指定すると、リフレッシュ操作が実行される前から、リフレッシュ操作が完了するまで、基本となるすべてのベーステーブルの共有テーブルロックが取得されます。
FORCE BUILD 句 デフォルトでは、REFRESH MATERIALIZED VIEW 文を実行すると、データベースサーバーはマテリアライズドビューが古い (つまり、マテリアライズドビューが最後にリフレッシュされた後、基本となるテーブルが変更されている) かどうかをチェックします。マテリアライズドビューが古くない場合、リフレッシュは行われません。FORCE BUILD 句は、マテリアライズドビューが古いかどうかに関係なく、強制的にマテリアライズドビューをリフレッシュするときに指定します。
この文は、view-list にリストされているマテリアライズドビューを初期化またはリフレッシュする場合に使用します。
古くなっていないマテリアライズドビューに対して REFRESH MATERIALIZED VIEW 文を実行した場合、FORCE BUILD 句が指定されていないかぎり、リフレッシュは実行されません。
ロックとデータ同時実行性の、デフォルトのリフレッシュ動作は次のとおりです。
ビューが即時ビューの場合、スナップショットアイソレーションが有効かどうかに関係なく、デフォルトのリフレッシュ動作は WITH SHARE MODE です。
ビューが手動ビューであり、スナップショットアイソレーションを使用している場合、デフォルトは WITH ISOLATION LEVEL SNAPSHOT です。
ビューが手動ビューであり、スナップショットアイソレーションを使用していない場合、デフォルトは WITH SHARE MODE です。
REFRESH MATERIALIZED VIEW が正常に動作する場合、および、最適化にビューを使用する場合は、いくつかのオプションに特定の値が設定されている必要があります。また、マテリアライズドビューを作成するときにマテリアライズドビューごとに格納されるオプションの設定があります。ビューをリフレッシュしたり、ビューを最適化に使用したりするには、これらのオプション設定が現在のオプションと一致している必要があります。
部分的に処理を行った後にリフレッシュが失敗した場合、ビューは初期化されていない状態のままとなり、リフレッシュ開始前の状態にデータをリストアできません。リフレッシュが失敗したときに発生したエラーを調査して、この失敗の原因となった問題を解決し、REFRESH MATERIALIZED VIEW 文を再実行します。
また、ALTER MATERIALIZED VIEW 文の IMMEDIATE REFRESH 句を使用すると、基本となるデータが変更されたときすぐにビューを変更してリフレッシュできます。
接続に WITH HOLD 句を使用して開かれたカーソルがあり、このカーソルで文またはトランザクションのスナップショットを使用している場合、この文は実行できません。
マテリアライズドビューには INSERT パーミッションが必要です。マテリアライズドビュー定義のテーブルには SELECT パーミッションが必要です。
マテリアライズドビューを参照するすべてのオープンカーソルが閉じられます。
チェックポイントは実行の開始時に実行されます。
実行の開始時と終了時に自動コミットが実行されます。
実行中は、接続の blocking オプションを使用してリフレッシュされるマテリアライズドビューに排他スキーマロックがかけれます。また、マテリアライズドビューから参照されるすべてのテーブルにブロックなしで共有スキーマロックがかけられます。WITH 句を指定した場合は、基本となるテーブルに追加のロックを取得することがあります。さらに、リフレッシュが完了するまでマテリアライズドビューは初期化されていない状態になるため、データベースサーバーでクエリ最適化またはクエリ実行に使用できなくなります。
スナップショットアイソレーションを使用して REFRESH MATERIALIZED VIEW 文を実行した場合、データベースのトランザクションログには REFRESH 文のテキストと、マテリアライズドビューに挿入される個々のローのすべてのコピーが含まれます。データベースにリカバリが必要な場合、リカバリ後のビューの内容が REFRESH MATERIALIZED VIEW 文が最初に完了したときのビューの内容と正確に一致するようにするには、個々のローが必要です。さらに、データベースがミラーリングされている場合、トランザクションログ内の個々のローは個別に適用されます。そのため、スナップショットアイソレーションを使用した REFRESH MATERIALIZED VIEW 文の頻度を制限したり、BACKUP 文を使用してトランザクションログを定期的にトランケートしたりして、トランザクションログに必要なディスク領域の量を削減することが必要になる場合があります。
SQL/2008 ベンダー拡張。
EmployeeConfid99 というマテリアライズドビューを作成し、データを移植するとします。この処理は、次の文で実行できます。
CREATE MATERIALIZED VIEW EmployeeConfid99 AS SELECT EmployeeID, Employees.DepartmentID, SocialSecurityNumber, Salary, ManagerID, Departments.DepartmentName, Departments.DepartmentHeadID FROM Employees, Departments WHERE Employees.DepartmentID=Departments.DepartmentID; REFRESH MATERIALIZED VIEW EmployeeConfid99; |
後に、ビューが使用されるようになってから、READ COMMITTED 独立性レベル (独立性レベル 1) を使用してビューをリフレッシュし、ビューを再構築するとします。この処理は、次の文で実行できます。
REFRESH MATERIALIZED VIEW EmployeeConfid99 WITH ISOLATION LEVEL READ COMMITTED FORCE BUILD; |
この例を実行し終わったら、作成したマテリアライズドビューを削除してください。このようにしないと、他の例を試すとき、基本となるテーブル Employees と Departments に対するスキーマ変更を実行できなくなります。有効化されている従属マテリアライズドビューを持つテーブルのスキーマは変更できません。マテリアライズドビューの削除を参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |