3. 即時マテリアライズドビュー
部署ごとの従業員リストの作成に使われるマテリアライズドビューの例を以下に示します。
CREATE MATERIALIZED VIEW DeptList AS SELECT Departments.DepartmentID, Employees.EmployeeID, Departments.DepartmentName, Employees.GivenName, Employees.Surname, Employees.Phone FROM Departments INNER JOIN Employees ON Employees.DepartmentID = Departments.DepartmentID;
マテリアライズドビューは、使用する前に必ず初期化する必要があります。
REFRESH MATERIALIZED VIEW DeptList;
通常の(手動の)マテリアライズドビューでは、ベーステーブルを変更しても、その後でREFRESHを実行しなければ、古いデータが表示されます。
UPDATE Employees SET DepartmentID = 400 WHERE EmployeeID = 1336; SELECT * FROM DeptList ORDER BY DepartmentName, Surname, GivenName; DepartmentID EmployeeID DepartmentName GivenName Surname Phone ============ ========== ============== ========= ======= ========== 300 1336 Finance Janet Bigelow 6175551493
SQL Anywhere 11からは、ベーステーブルに対して行ったすべての更新がマテリアライズドビュー内のデータに直ちに適用されるようにビューを変更することができます。これを行うための手順を以下に示します。
TRUNCATE TABLE DeptList; CREATE UNIQUE INDEX xid ON DeptList ( DepartmentID, EmployeeID ); ALTER MATERIALIZED VIEW DeptList IMMEDIATE REFRESH; REFRESH MATERIALIZED VIEW DeptList;
手動のビューに既にデータが挿入されている場合は、TRUNCATE TABLEが必要です。ビューを即時ビューに変更するには、ビューを空にする必要があります。CREATE UNIQUE INDEXも即時ビューの要件です。SQL Anywhereがローを更新するときに、目的のローを見つけ出せるようにしなければならないからです。上記のALTER文では、ビューのリフレッシュモードをIMMEDIATEに変更しています。また、最初にデータをビューに挿入するためにREFRESHが1回必要です。確かにステップ数は多くなりますが、1回だけ実行すれば済みます。
ベーステーブルを更新してからビューをクエリすると、明示的なREFRESHを新たに実行しなくても、新しいデータが直ちに表示されます。
UPDATE Employees SET DepartmentID = 400 WHERE EmployeeID = 1336; SELECT * FROM DeptList ORDER BY DepartmentName, Surname, GivenName; DepartmentID EmployeeID DepartmentName GivenName Surname Phone ============ ========== ============== ========= ======= ========== 400 1336 Marketing Janet Bigelow 6175551493
マテリアライズドビューがクールである本当の理由は、そのビューが存在するかどうかわからなくても利用できることです。次のクエリではベーステーブルを使用していますが、図2は、SQL Anywhereがベーステーブルの代わりにDeptListビューを使用したことを示しています。
SELECT Departments.DepartmentName, Employees.GivenName, Employees.Surname, Employees.Phone FROM Departments INNER JOIN Employees ON Employees.DepartmentID = Departments.DepartmentID;