タグ付けされた質問 「materialized-view」

ビューのように定義されますが、テーブルのような永続的なデータを保持するマテリアライズドビューは、Oracle、DB2、postgresを含む多くのRDBMSの機能です。SQL Serverには、インデックス付きビューと呼ばれる同様の機能があり、このタグの下に十分にあると見なされています。

7
簡単な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか?
単純な銀行データベースのスキーマを書いています。基本的な仕様は次のとおりです。 データベースは、ユーザーと通貨に対するトランザクションを保存します。 すべてのユーザーは通貨ごとに1つの残高を持っているため、各残高は特定のユーザーと通貨に対するすべてのトランザクションの合計です。 残高をマイナスにすることはできません。 銀行のアプリケーションは、ストアドプロシージャを介してデータベースとのみ通信します。 このデータベースは、1日に数十万件の新しいトランザクションを受け入れ、さらに高いレベルでクエリのバランスを取ることを期待しています。残高を非常に迅速に提供するには、事前に集計する必要があります。同時に、残高が取引履歴と矛盾しないことを保証する必要があります。 私のオプションは次のとおりです。 別のbalancesテーブルを用意して、次のいずれかを実行します。 トランザクションをテーブルtransactionsとbalancesテーブルの両方に適用します。TRANSACTIONストアドプロシージャレイヤーのロジックを使用して、残高とトランザクションが常に同期されるようにします。(Jackによるサポート。) transactionsテーブルにトランザクションを適用balancesし、トランザクション量でテーブルを更新するトリガーを使用します。 balancesテーブルにトランザクションを適用transactionsし、トランザクション量とともにテーブルに新しいエントリを追加するトリガーを使用します。 ストアドプロシージャの外部で変更が行われないようにするには、セキュリティベースのアプローチに頼る必要があります。そうしないと、たとえば、一部のプロセスがtransactionsテーブルにトランザクションを直接挿入し、スキーム1.3の下で関連するバランスが同期しなくなる可能性があります。 balancesトランザクションを適切に集約するインデックス付きビューを用意します。残高はトランザクションと同期するようにストレージエンジンによって保証されているため、これを保証するためにセキュリティベースのアプローチに依存する必要はありません。一方、ビュー(インデックス付きビューでも)にCHECK制約を設定することはできないため、バランスを負以外に強制することはできません。(Dennyによるサポート。) transactionsテーブルだけがありますが、そのトランザクションの実行直後に有効な残高を保存するための追加の列があります。したがって、ユーザーと通貨の最新のトランザクションレコードには、現在の残高も含まれます。(Andrewが以下に提案。garikが提案したバリアント。) この問題に最初に取り組んだとき、私はこれら 2つの議論を読み、オプションを決定しました2。参考のために、ここでそれのベアボーン実装を見ることができます。 このようなデータベースを高負荷プロファイルで設計または管理しましたか?この問題の解決策は何ですか? 私が正しいデザインを選んだと思いますか?留意すべきことはありますか? たとえば、transactionsテーブルのスキーマを変更するには、balancesビューを再構築する必要があることを知っています。データベースを小さく保つためにトランザクションをアーカイブしている場合でも(たとえば、他の場所に移動してサマリートランザクションに置き換えることで)、スキーマの更新ごとに数千万のトランザクションからビューを再構築する必要がある場合、展開ごとのダウンタイムが大幅に長くなる可能性があります。 インデックス付きビューを使用する方法がある場合、マイナスの残高がないことをどのように保証できますか? トランザクションのアーカイブ: アーカイブトランザクションと上記の「サマリートランザクション」について少し詳しく説明します。まず、このような高負荷システムでは定期的なアーカイブが必要になります。古い取引を別の場所に移動できるようにしながら、残高と取引履歴の間の一貫性を維持したいと思います。これを行うには、アーカイブされたトランザクションのすべてのバッチを、ユーザーと通貨ごとの金額のサマリーに置き換えます。 したがって、たとえば、このトランザクションのリスト: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 アーカイブされ、これに置き換えられます: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …

1
SQL Server 2017でSNAPSHOT_MATERIALIZATIONを使用してビューを作成するにはどうすればよいですか?
SQL Server 2017には、いくつかの新しいストアドプロシージャがあります。 sp_refresh_single_snapshot_view – @view_name nvarchar(261)、@ rgCode intの入力パラメーター sp_refresh_snapshot_views – @rgCode intの入力パラメーター sys.messagesの新しいエントリ: 10149-ビュー定義にメモリ最適化テーブルが含まれているため、SNAPSHOT_MATERIALIZATIONを持つインデックスをビュー '%。* ls'に作成できません。 10642-SNAPSHOT_MATERIALIZATIONは、ビューのインデックスにのみ適用されるため、 '%。* ls'のインデックス '%。* ls'に設定できません。 10643 – SNAPSHOT_MATERIALIZATIONは、ビューのクラスター化インデックスにのみ適用されるため、 '%。* ls'の '%。* ls'に設定できません。 10648 – SNAPSHOT_MATERIALIZATIONは、 '%。* ls'のパーティションインデックス '%。* ls'に設定できません。 10649-SNAPSHOT_MATERIALIZATIONのクラスター化インデックス '%。* ls'を持つ '%。* ls'には非クラスター化インデックス '%。* ls'を作成できません。 10650 –スナップショットビューを更新するには、データベースでスナップショット分離を有効にする必要があります。 3760 – SNAPSHOT_MATERIALIZATIONを持つビュー '%。* ls'のインデックス …

2
PostgreSQLでマテリアライズドビューを段階的に更新する
PostgreSQLでマテリアライズドビューを段階的に更新することはできますか。つまり、新規または変更されたデータに対してのみですか。 次の表とマテリアライズドビューを検討してください。 CREATE TABLE graph ( xaxis integer NOT NULL, value integer NOT NULL, ); CREATE MATERIALIZED VIEW graph_avg AS SELECT xaxis, AVG(value) FROM graph GROUP BY xaxis 定期的に、新しい値が追加されるgraphか、既存の値が更新されます。graph_avg更新された値についてのみ、数時間ごとにビューを更新します。ただし、PostgreSQL 9.3では、テーブル全体が更新されます。これにはかなり時間がかかります。次のバージョン9.4ではCONCURRENT更新が可能ですが、ビュー全体が更新されます。何億行もあるため、これには数分かかります。 更新された新しい値を追跡し、部分的にのみビューを更新する良い方法は何ですか?

2
集計にインデックス付きビューを使用する-あまりにも良いですか?
かなり大きなレコード数(1000万から2000万行)のデータウェアハウスがあり、特定の日付の間にレコードを数えるクエリや、特定のフラグを持つレコードを数えるクエリを実行することがよくあります。 SELECT f.IsFoo, COUNT(*) AS WidgetCount FROM Widgets AS w JOIN Flags AS f ON f.FlagId = w.FlagId WHERE w.Date >= @startDate GROUP BY f.IsFoo パフォーマンスはそれほど悪くありませんが、比較的遅くなる可能性があります(コールドキャッシュで10秒程度)。 最近、私GROUP BYはインデックス付きビューで使用できることを発見し、次のようなものを試しました CREATE VIEW TestView WITH SCHEMABINDING AS SELECT Date, FlagId, COUNT_BIG(*) AS WidgetCount FROM Widgets GROUP BY Date, FlagId; GO CREATE UNIQUE CLUSTERED …

3
Postgresのマテリアライズドビューを置き換える
マテリアライズドビューがあり、Postgres 9.3新しい列で更新したい。ただし、他のマテリアライズドビューもこのビューに依存しており、エラーメッセージは、他のオブジェクトがそれに依存している場合、ビューの削除が不可能であることを示しています。 エラー:他のオブジェクトに依存しているため、マテリアライズドビューlatest_chargesを削除できません また、ドキュメントから、REPLACEキーワードはマテリアライズドビューに対して有効ではないようです。すべての依存オブジェクトを削除し、各オブジェクトを再構築する以外にショートカットはありますか?

3
Postgresのマテリアライズドビューの定義を照会する
Postgresでマテリアライズドビューの定義をクエリする方法を疑問に思っています。参考までに、私がやりたいことは、通常のビューでできることと非常に似ています。 SELECT * FROM information_schema.views WHERE table_name = 'some_view'; 次の列が表示されます。 table_catalog table_schema table_name view_definition check_option is_updatable is_insertable_into is_trigger_updatable is_trigger_deletable is_trigger_insertable_into マテリアライズドビューでこれは可能ですか? これまでの私の調査から、マテリアライズドビューはinformation_schemaから意図的に除外されているようです。 information_schemaは、SQL標準に存在するオブジェクトのみを表示できます。 (http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us) それらはinformation_schemaから完全に除外されているように見えるので、私はこれについてどうするかわかりませんが、私がやりたいことは2つあります: 特定のマテリアライズドビューが存在するかどうかを照会します。(これまでのところ、これを行うことがわかった唯一の方法は、同じ名前のマットビューを作成し、それが爆発するかどうかを確認することです。) 次に、マテリアライズドビューの定義を照会します(view_definition上の列と同様information_schema.views)。

1
選択されているインデックス付きビューのクラスター化インデックスに含まれる要因は何ですか?
簡単に言えば、 オプティマイザによるインデックス付きビューのインデックスの選択をクエリする要因は何ですか? 私にとって、インデックス付きビューは、オプティマイザーがインデックスを選択する方法について理解していることに反しているようです。私が見てきた、これは前に尋ねたが、OPはあまり好評ではなかったです。 私は本当に道しるべを探していますが、擬似的な例を作成してから、多くのDDL、出力、例を含む実際の例を投稿します。 私はEnterprise 2008+を使用していると仮定し、理解します with(noexpand) 疑似の例 この擬似的な例を見てみましょう。22個の結合、17個のフィルター、1000万行のテーブルを横断するサーカスポニーを含むビューを作成します。このビューは、実現するのに高価です(ええ、大文字のE)。SCHEMABINDとビューのインデックスを作成します。それから SELECT a,b FROM AnIndexedView WHERE theClusterKeyField < 84。私を回避するオプティマイザーロジックでは、基になる結合が実行されます。 結果: ヒントなし:720行で4825の読み取り、76ミリ秒で47 CPU、0.30523の推定サブツリーコスト。 ヒントあり:17読み取り、720行、4ミリ秒で15 CPU、0.007253の推定サブツリーコスト ここで何が起こっているのでしょうか?Enterprise 2008、2008 -R2、および2012で試してみました。ビューのインデックスを使用すると考えられるすべてのメトリックで、はるかに効率的です。これはアドホックであるため、パラメータスニッフィングの問題やデータの偏りはありません。 実際の(長い)例 あなたが自虐的なタッチでない限り、おそらくこの部分を読む必要はないでしょう。 バージョン うん、企業。 Microsoft SQL Server 2012-11.0.2100.60(X64)2012年2月10日19:39:15 Copyright(c)Microsoft Corporation Enterprise Edition(64-bit)on Windows NT 6.2(Build 9200:)(ハイパーバイザー) 景色 CREATE VIEW dbo.TimelineMaterialized WITH SCHEMABINDING AS SELECT TM.TimelineID, …

3
MySQLでマテリアライズドビューを作成する最良の方法
MySQL 5.6を使用しています。Oracleのようにマテリアライズドビューを作成することはできません。Flexviewのような1つまたは2つのソリューションを見てきました。 MySQLでマテリアライズドビュー(Oracleのような自動更新)を最小限の複雑さで作成する最良の方法を教えていただけますか?

1
インデックス付きビューを介してのみ関連する2つのテーブルのデッドロックを解決する
デッドロックが発生している状況があり、犯人を絞り込んだと思いますが、それを修正するために何ができるかはよくわかりません。 これは、SQL Server 2008 R2を実行している運用環境です。 状況を少し簡略化して表示するには: 以下に定義する3つのテーブルがあります。 TABLE activity ( id, -- PK ... ) TABLE member_activity ( member_id, -- PK col 1 activity_id, -- PK col 2 ... ) TABLE follow ( id, -- PK follower_id, member_id, ... ) member_activityテーブルには主キーのように定義する化合物を持っているmember_id, activity_id私は今まで、そのテーブル途中その上でデータを検索する必要があるため、。 また、非クラスタ化インデックスがありfollowます: CREATE NONCLUSTERED INDEX [IX_follow_member_id_includes] ON follow ( …

1
Postgres:マテリアライズドビューが使用するディスク容量を確認しますか?
Postgresでインデックスとテーブルのサイズを確認する方法を知っています(バージョン9.4を使用しています)。 SELECT relname AS objectname, relkind AS objecttype, reltuples AS "#entries", pg_size_pretty(relpages::bigint*8*1024) AS size FROM pg_class WHERE relpages >= 8 ORDER BY relpages DESC; しかし、これには具体化されたビューは表示されません。使用しているディスク容量を確認するにはどうすればよいですか?

2
DBCC CHECKDBの修復不可能な破損:インデックス付きビューには、ビュー定義によって生成されなかった行が含まれています
TL; DR:インデックス付きビューに修正不可能な破損があります。詳細は次のとおりです。 ランニング DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS 私のデータベースのいずれかで次のエラーが生成されます: メッセージ8907、レベル16、状態1、行1空間インデックス、XMLインデックス、またはインデックス付きビュー 'ViewName'(オブジェクトID 784109934)には、ビュー定義によって生成されなかった行が含まれています。これは、必ずしもこのデータベース内のデータの整合性の問題を表しているわけではありません。(...) CHECKDBは、テーブル 'ViewName'で0個の割り当てエラーと1個の一貫性エラーを検出しました。 repair_rebuildは最小修復レベル(...)です。 このメッセージは、インデックス付きビュー「ViewName」の具体化されたデータが、基になるクエリが生成するものと同一ではないことを示していることを理解しています。ただし、データを手動で検証しても矛盾は発生しません。 SELECT * FROM ViewName WITH (NOEXPAND) EXCEPT SELECT ... from T1 WITH (FORCESCAN) join T2 on ... SELECT ... from T1 WITH (FORCESCAN) join T2 on ... EXCEPT SELECT * FROM ViewName …

3
2つのプロセスが同時にマテリアライズドビューを同時にリフレッシュしようとするとどうなりますか?
ドキュメントによると: マテリアライズドビューの同時選択をロックアウトせずに、マテリアライズドビューを同時に更新します。(...) ...その他のコンテンツ... でも、このオプションを使用して一度に一つだけREFRESHは、任意のに対して実行可能 マテリアライズド・ビューは1。 私が持っていたそれをリフレッシュするマテリアライズド・ビューの最後のリフレッシュ時間を確認機能をして、60秒以上が経過した場合、それがでしょう。 しかし、2つの別々のプロセスから同時にマテリアライズドビューを更新しようとするとどうなりますか?彼らはキューに入れますか、それともエラーを上げますか? MATERIALIZED VIEWが更新されていることを検出して、触れないようにする方法はありますか? 現在、私は(設定リフレッシュする前に、テーブルのレコードを移入するために頼ってきたrefreshingしtrue)、その後にそれを設定するfalseプロセスが終了したとき。 EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET refreshing=false WHERE id=$1' USING refresh_id; その後、このプロシージャを呼び出すたびに、最新の値last_updateとそのrefreshing値を確認します。refreshingtrueの場合、マテリアライズドビューを更新しようとしないでください。 EXECUTE 'SELECT extract(epoch FROM now() - (last_update))::integer, refreshing FROM refresh_status ORDER …

2
ARITHABORT ONに変更するリスク
私はベンダーとコアアプリケーションを提供する取り決めで作業しており、コアアプリケーションを変更しない限り、独自の拡張機能を構築できます。SQL Server 2005データベースに接続するColdFusionに組み込まれています。 私が作成したレポートの一部は、コアテーブルから計算された関数を使用するビューに依存しており、テーブルが大きくなるとレポートが非常に遅くなります。レポートを高速化するために、インデックス付きビューを使用します。しかし、テスト環境でインデックス付きビューを作成した後、コアアプリケーションはコアテーブルに挿入できなくなりました(インデックス付きビューを使用ARITHABORTするONときに必要なエラーメッセージが返されました)。 そのため、インデックス付きビューを使用SET ARITHABORT ONするには、コアテーブルを挿入/更新するたびにコアアプリケーションが必要になるようです。テスト環境でこれを実行しました: ALTER DATABASE MyDatabase SET ARITHABORT ON; そして、それはうまくいくようです。しかし、私のベンダーは、アプリケーションには何千ものクエリがあるため、この設定がこれらのクエリのいずれかを破壊するリスクがある可能性があり、将来の予期しないデータベースの問題がある場合、デフォルト設定を復元すると主張します。 壊れる実際のクエリはありSET ARITHABORT ONますか?保管した方が良い状況はありますOFFか? TL; DR新しいインデックス付きビューを機能さARITHABORT ONせるには、データベース全体を設定する必要がありますが、ベンダーは自分の責任でそれを行うと警告しています。実際にリスクはありますか?

2
インデックス付きビューが一意でないクラスター化インデックスを許可しないのはなぜですか?
インデックス付きビューを使用して、最もよく使用されるいくつかのビューのパフォーマンスを向上させることを検討してきました。 ただし、インデックス付きビューは、一意ではないクラスター化インデックスをサポートしていません。これは、データベース構造の残りの部分によって設定された優先順位に少し影響します。 たとえば、ここにいくつかのテーブルの簡略化したバージョンがあります。 -Groups- Group ID GroupName -Users- UserKey UserName FullName GroupID インデックスは、Groups.GroupID(非クラスター化)およびUsers.GroupID(クラスター化)にあります。クラスター化されたキーは、最も一般的には特定のグループの一連のユーザーが取得されるため、UsersテーブルのGroupIDにあります。当然、グループごとに複数のユーザーがいるため、このクラスター化インデックスは一意ではありません。 このため、この例のようにビューにインデックスを付けるときに、この優先順位に従う方法が少し不確かになります。これは、一意でないクラスター化インデックスを持つことができないためです。 ConsumableID ConsumableVariantID AllowThresholdOverwrite FullPath GroupID ManufacturerID Type ModelID 101 29 1 0.1.2.4. 4 3 3 2 実際には、常に一意であるこのビューの唯一の値はConsumableID列です。そのため、インデックスを配置する場所についてほとんど選択肢がありません。 通常のテーブルで許可されているのに、ビューが一意でないクラスター化インデックスを許可しないのはなぜですか?

2
SQL Serverのインデックス付きビュー
私はテーブルとそれにインデックス付きビューを持っています Create table mytable1 (ID int identity(1,1), Name nvarchar(100)) Create table mytable2 (ID int identity(1,1), Name nvarchar(100)) Create view myview with schemabinding as select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id 次のクエリを実行すると select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.