タグ付けされた質問 「temporal-tables」

1
緩やかに変化するディメンションに対してSQL Server 2016システムバージョンのテンポラルテーブルを使用したクエリ戦略
使用している場合、システムバージョン管理一時テーブル(SQL Serverの2016年新)が、この機能は大規模なリレーショナルデータウェアハウス内の寸法を変更ゆっくり処理するために使用されるクエリのオーサリングおよびパフォーマンスの意味は何ですか? たとえば、列を含む100,000行のCustomerディメンションと、外部キー列Postal Codeを含む数十億行のSalesファクトテーブルがあるとしCustomerIDます。そして、「顧客の郵便番号別の2014年の総売上」をクエリしたいとします。簡略化されたDDLは次のようなものです(わかりやすくするために多くの列を省略しています)。 CREATE TABLE Customer ( CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, PostalCode varchar(50) NOT NULL, SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON); CREATE …

1
なぜ複数の(関連付けられていない)時系列履歴テーブルがあるのですか?
SQL Server 2017バックエンドを備えた概念実証システムをセットアップしています。 システムはテンポラルテーブルを使用して、資産構成を記録し、時間の経過に伴う変化を追跡します。 履歴テーブルにリンクされているデータテーブルがあります。それをdbo.MSSQL_TemporaryHistoryFor_12345678900と呼びましょう。 ここまでは順調ですね。私には2つの問題があります。 今日、テーブルのバージョニングをオフにして、計算列を追加できるようにしました。これが行われ、エラーなしで再びオンになりました。 変更前の履歴データをクエリできないことがわかりました。新しいデータが履歴に追加されていますが、事前には何もありません。 SSMSの内部を見ると、すべて同じ名前で16進数のサフィックスが付いた複数の履歴テーブルがあることがわかります(例:dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3)。メインデータテーブルの下にリンクされていません。彼らはデータベース内で自分たちだけで浮かんでいるだけです。私がsys.tablesをクエリしたとき、これらは履歴テーブルとして表示されず、メインデータテーブルにリンクされていません。 これらのテーブルには、欠落している履歴データが含まれています。 したがって、私が持っている質問は次のとおりです。 これらの追加の表は何を表していますか? 彼らはどのように作成されましたか? これらをメインの履歴チェーンに何らかの形で再リンクして、履歴レポートを取り戻す方法はありますか? それは非常にイライラするので、あなたが提供できるどんな助けもありがたく受け取られるでしょう。ありがとう。

2
古い値でのテンポラルテーブルのパフォーマンスが低い
テンポラルテーブル内の履歴レコードにアクセスすると、奇妙な問題が発生します。AS OF副次句を介してテンポラルテーブルの古いエントリにアクセスするクエリは、最近の履歴エントリのクエリよりも時間がかかります。 履歴テーブルはSQL Serverによって生成され(日付列にクラスター化インデックスが含まれ、ページ圧縮を使用)、履歴テーブルに5,000万行を追加しました。クエリは約25,000行を取得しました。 問題の根本的な原因を特定しようとしましたが、特定できませんでした。これまでにテストしました: クラスター化インデックスを含む5,000万行のテストテーブルを作成して、速度の低下が単にボリュームによるものかどうかを確認します。一定の時間(約400ミリ秒)で25K行を取得できました。 履歴テーブルからページ圧縮を削除します。これは検索時間には影響しませんでしたが、テーブルのサイズを大幅に増やしました。 ID列と日付列を使用して、履歴テーブルの行に直接アクセスしてみました。ここが少し面白かった場所です。AS OFサブ句の場合と同様に、約1200ミリ秒かかるテーブルの約400ミリ秒で、古い行にアクセスできました。テストテーブルで日付列のフィルタリングを試みたところ、ID列でのフィルタリングと比較して、同様の速度低下に気づきました。これは、日付の比較がいくつかの減速の背後にあると私に信じさせます。 私はこれをもっと見たいのですが、間違った木を吠えないようにしたいのです。まず、テンポラルテーブルの古い履歴データにアクセスするときに、他の誰かがこれと同じ動作を経験しましたか?次に、パフォーマンスの問題の根本原因をさらに特定するために使用できるいくつかの戦略は何ですか(実行プランを調べ始めたばかりですが、それでも私には少し謎めいています)。 実行計画 これらは単純な取得クエリです。最初のクエリは古い行にアクセスし、2番目のクエリは新しい行にアクセスします。 古い行:実行時間〜1200ms 最近の行〜350msの実行時間 テーブルの詳細 これらはテンポラルテーブルの列です。履歴テーブルには同じ列がありますが、(履歴テーブルの要件に従って)主キーはありません。 以下は、履歴テーブルのインデックスです。

3
テンポラルテーブルがトランザクションの開始時間を記録するのはなぜですか?
テンポラルテーブルの行を更新するとき、行の古い値は、トランザクションの開始時刻をとして履歴テーブルに保存されますSysEndTime。現在のテーブルの新しい値には、トランザクションの開始時刻としてがありSysStartTimeます。 SysStartTimeそして、SysEndTimeされているdatetime2行が現在のバージョンであったときに記録する時間テーブルによって使用されるカラム。トランザクション開始時間は、更新を含むトランザクションが開始した時間です。 BOLさんのコメント: システムのdatetime2列に記録される時間は、トランザクション自体の開始時間に基づいています。たとえば、単一のトランザクション内に挿入されたすべての行は、SYSTEM_TIME期間の開始に対応する列に記録された同じUTC時間を持ちます。 例: Ordersテーブルのすべての行の更新を開始20160707 11:00:00し、トランザクションの実行に5分かかります。これにより、履歴テーブルにSysEndTimeas を使用して各行の行が作成され20160707 11:00:00ます。現在のテーブルのすべての行がありますSysStartTimeのを20160707 11:00:00。 誰かが20160707 11:01:00(更新の実行中に)クエリを実行すると、古い値が表示されます(デフォルトの読み取りコミット分離レベルを想定)。 しかし、誰かがAS OF構文を使用してテンポラルテーブルをそのままクエリする20160707 11:01:00と、新しい値が表示されSysStartTimeます20160707 11:00:00。 これは、当時のようにそれらの行が表示されないことを意味します。トランザクションの終了時刻を使用した場合、問題は存在しません。 質問:これは仕様ですか?何か不足していますか? トランザクションの開始時間を使用していると考えることができる唯一の理由は、それがトランザクションの開始時に唯一「既知」であるということです。開始時にトランザクションがいつ終了するかは不明であり、終了時に終了時刻を適用するのに時間がかかり、適用していた終了時刻が無効になります。これは理にかなっていますか? これにより、問題を再現できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.