Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

スナップショットアイソレーションとマテリアライズドビュー

原文: Snapshot isolation and materialized views

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/07/08 14:00

 スナップショットアイソレーションとマテリアライズドビューは、2006年9月のバージョン10の初出荷以来、SQL Anywhereサーバの一部となっている重要な機能です。(原文:Snapshot isolation and materialized views、2011/02/02投稿)

目次

 本稿はデータベースソフトウェア「SQL Anywhere」およびデータベース全般に関する英語ドキュメントを翻訳する形で提供しています。図など、部分的に英語のままになっていますが、製品のSQL Anywhere自体は完全に日本語化されていますのでご安心ください。

 私は以前の記事で、スナップショットアイソレーションの使用に関するトレードオフについて解説し、マテリアライズドビューの時間空間トレードオフに関する資料を紹介しました。スナップショットアイソレーションについての記事では、私は次のように書きました。

 もちろん、スナップショットアイソレーションもタダではありません。データベースシステムは、新規のスナップショットトランザクションを見越して、変更されたデータのアーカイブコピーを作成しなければならないのです。SQL Anywhereでは、スナップショットのローのコピーは自動的に管理され、必要に応じて一時ファイルに書き込まれます(一時ファイルのサイズは必要に応じて増加)。管理上の影響はほぼゼロですが、クエリのパフォーマンスには影響が出る可能性があります。スナップショットのローを、トランザクションのスナップショットセマンティクスに従って、一時ファイルに保存されているスナップショットのローから個別にフェッチしなければならないためです。パフォーマンスがどの程度低下するかは、ひとえにアプリケーションとそのワークロードに依ります。更新量が多い場合には、パフォーマンスの低下はひどくなるでしょう。

 今回の記事では、特にSQL Anywhereサーバのトランザクションログとの関連で、スナップショットアイソレーションとマテリアライズドビューの関係を解説し、そのトレードオフについても取り上げようと思います。

マテリアライズドビューをリフレッシュする

 遅延メンテナンス型のマテリアライズドビューの場合、マテリアライズドビューの基となるベーステーブルへの変更は、追加のロックや(即時)メンテナンスのオーバヘッドなしに進行していきます。つまり、更新トランザクションはベーステーブルの値またはローを変更し、COMMITの時点でその変更を確定します。しかしこの状態では、マテリアライズドビューの内容は古くなってしまいます。このようなマテリアライズドビューの古い内容をSQL文が利用できるかどうかは、そのクエリの接続に関するオプション設定に左右されます。ビューの内容をリフレッシュするには、そのビューに対してREFRESH MATERIALIZED VIEW文を発行します。このSQL文は、事実上、対象のビューを含んでいるベーステーブルに対してTRUNCATE TABLEを実行した後、すぐさまINSERT ... FROM SELECTを実行してマテリアライズドビューにデータを挿入します。

 一方、即時メンテナンス型のマテリアライズドビューの場合には、最初にビューにデータを挿入する時にだけREFRESH MATERIALIZED VIEW文が必要です。それ以降は、基となるベーステーブルに変更を加えたときに、同じトランザクション内で、そのベーステーブルを参照している即時メンテナンス型のマテリアライズドビューに変更が適用されます。このトランザクションは、完了時にCOMMITを実行して変更を確定するか、ROLLBACKを発行して変更を取り消します。

 ここで、簡単な例を考えてみましょう。サンプルデータベースDEMOのProductsテーブルを基にして、簡単な単一テーブルの即時メンテナンス型マテリアライズドビューを作成します。

CREATE MATERIALIZED VIEW groupo.shirt_products( prod_id, prod_name, prod_description, prod_size, prod_color, prod_quantity, prod_unit_price)
AS
SELECT "id", "name", "description", "size", color, quantity, unitprice 
FROM Products
WHERE "name" LIKE '%shirt%'

 ビューを即時メンテナンス型にするには、まずビューをインスタンス化したテーブルに対して一意のインデックスを作成します。

CREATE UNIQUE INDEX products ON groupo.shirt_products (prod_id ASC);

 次に、このビューに即時メンテナンスが適用されるように設定します。

ALTER MATERIALIZED VIEW groupo.shirt_products IMMEDIATE REFRESH

 そして最後にマテリアライズドビューを初期化します。

REFRESH MATERIALIZED VIEW groupo.shirt_products

 マテリアライズドビューの作成が完了したので、新規のトランザクションを開始し、Productsベーステーブルの基となるローをいくつか変更してみます。

UPDATE products 
SET DESCRIPTION = 'Modified' 
WHERE "name" LIKE '%Tee Shirt%';
COMMIT

 マテリアライズドビューの内容を見ると、基になるProductsテーブルに対して行った変更がビューに反映されていることがわかります。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • Glenn Paulley(Glenn Paulley)

    カナダ オンタリオ州 ウォータールー R&DセンターにてSQL Anywhere 開発における Director of Engineering としてクエリ・オプティマイザなどの開発をリードしている。 ・IvanAnywhere

バックナンバー

連載:Glenn Paulley氏 データベース関連ブログ 翻訳記事

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5