問題タブ [data-warehouse]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - Exchange を SQL Server のパブリッシング テクニックとして使用できますか?
私は、(DW コンテキストで) テーブルへの増分追加を公開するための手法として、Oracle でパーティションを使用するという概念に精通しています。
(この例のように)
例えば。データ マート ファクト テーブルの毎日のスナップショットは、テーブル内のパーティションにバックグラウンドで読み込まれます。たとえば、日付をパーティション キーとして使用します (パーティションが 1 つだけの 1 つのパーティション テーブル)。ロードが完了し、内容が検証されると、ディクショナリ イベントとしてパーティションを真の宛先テーブル (多くのパーティションを持つ 1 つのパーティション テーブル) に「交換」できます。
SQL Server 2008 でこれと同じタイプの発行モデルを使用できますか?
database-design - 多対多次元モデル
皆さん、
顧客から受け取ったファイルの情報を保持する DIM_FILE というディメンション テーブルがあります。各ファイルには、FACT テーブル CUST_DETAIL を構成する詳細レコードがあります。メイン プロセスでは、ファイルはいくつかの段階を経て、各段階でステータスがタグ付けされます。要するに、私は多対多の関係を持っています。スター スキーマのディメンション モデリングに関するアイデア。顧客レコードは単一のファイルにのみ属し、ファイルは複数のステータスを持つことができます。
database - 異なる解像度のデータ
2 つのテーブルがあり、外部ソースからこれらのテーブルにレコードが継続的に挿入されています。これらのテーブルがユーザー インタラクションの統計を保持しているとしましょう。ユーザーがボタンをクリックすると、そのクリックの詳細 (ユーザー、クリック時刻など) がテーブルの 1 つに書き込まれます。ユーザーがそのボタンをマウスオーバーすると、レコードが詳細とともに他のテーブルに追加されます。
多くのユーザーが常にシステムと対話している場合、大量のデータが生成され、それらのテーブルが非常に大きくなります。
データを見たいときは、時間単位または日単位の解像度で見たいです。
要求された解像度で (データが収集されるにつれて) データを段階的に継続的に要約する方法またはベスト プラクティスはありますか?
または、この種の問題に対するより良いアプローチはありますか?
PS。私がこれまでに見つけたのは、Talend のような ETL ツールが生活を楽にすることができるということです。
更新:現在MySQLを使用していますが、DB、環境などに関係なくベストプラクティスが気になります.
sql - タイプ2テーブルから削除されたレコードを効率的に検索する
タイプ2データのデータベーステーブルがあり、最後に同期してから削除されたレコードを検索したいと思います。と列がdate_fromありdate_to、生データにはID列がありますobject_id。 date_to<>nullこれは、現在存在しないことを意味します。したがって、同じobject_idandを持つレコードが他にない場合は、date_to=null削除されています。
ナイーブな実装は次のようになると思います。
しかし、明らかにそれは途方もなく高価になるでしょう。
私が見逃している明らかでより効率的な方法はありますか?ないのではないかと思いますが(つまり、削除されたレコードが比較的少ないと想定し、RDBMSの外部で計算の一部を実行する必要があります)、念のために尋ねると思いました。
ありがとう!
sql - 最適なパフォーマンスを得るために、タイプ 2 の緩やかに変化するディメンションを使用してテーブルにインデックスを付ける方法
タイプ 2 の緩やかに変化するディメンションを持つテーブルがあるとします。
次の列を使用して、このテーブルを次のように表現しましょう。
この例では、[StartDate] が事実上、特定の [Key] の値がシステムに認識されるようになる日付であると仮定します。したがって、主キーは [StartDate] と [Key] の両方で構成されます。
特定の [Key] に対して新しい値のセットが到着すると、[ExpiryDate] を「12/31/9999」などの事前定義された高いサロゲート値に割り当てます。次に、その [Key] の既存の「最新」レコードを、新しい値の [StartDate] と等しい [ExpiryDate] を持つように設定します。結合に基づく単純な更新。
したがって、特定の [キー] の最新のレコードを常に取得したい場合は、次のようなクラスター化インデックスを作成できることがわかります。
キースペースは非常に広い場合がありますが (たとえば、100 万個のキー)、[ExpiryDate] で最初に並べ替えることで、読み取り間のページ数を最小限に抑えることができます。また、特定のキーの最新のレコードの [ExpiryDate] は常に '12/31/9999' であることがわかっているため、これを有利に利用できます。
しかし... 特定の時点ですべての [Key] のポイント イン タイム スナップショットを取得したい場合はどうすればよいでしょうか。理論的には、キースペース全体が同時に更新されるわけではありません。したがって、特定の時点では、[StartDate] と [ExpiryDate] の間のウィンドウは可変であるため、[StartDate] または [ExpiryDate] のいずれかで並べ替えても、探しているすべてのレコードが含まれる結果は得られません。連続。確かに、[StartDate] が定義した時点よりも大きいすべてのレコードをすぐに破棄できます。
本質的に、典型的な RDBMS では、特定の時点のすべてのキーの値を取得するための読み取り回数を最小限に抑える最善の方法を提供するインデックス作成戦略は何ですか? [キー] でテーブルをパーティション分割することで、少なくとも IO を最大化できることはわかっていますが、これは確かに理想的ではありません。
あるいは、この問題をよりパフォーマンスの高い方法で解決する、ゆっくりと変化するディメンションの別のタイプはありますか?
database-design - バージョン番号を保持するデータベーステーブルの列に名前を付ける
特定の「レコードバージョン」へのINTを保持するデータベーステーブルの列を何と呼ぶかを理解しようとしています。私は現在「RecordOrder」を使用していますが、人々はhigher = newerと考えるので、それは好きではありませんが、私が使用している方法では、lower = newer( "1"が現在のレコード、 "2"が現在のレコードです) 2番目に新しい、「3」古い、など)。「RecordVersion」を検討しましたが、同じ問題が発生するのではないかと思います。他に何か提案はありますか?「RecordAge」?
これを行っているのは、テーブルに挿入するときに、次のバージョンを確認する代わりに、書き込む前にその番号が盗まれるリスクを冒すのではなく、「RecordOrder」が0の挿入を挿入するだけだからです。 。テーブルAFTERINSERTには、そのキーのすべての「RecordOrder」番号を1つインクリメントするトリガーがあるため、挿入したばかりのレコードは「1」になり、他のすべてのレコードは1つ増えます。これにより、人の番号を取得できます。 MAX(RecordOrder)を取得して選択する代わりに、RecordOrder=1を選択して現在のレコードを選択します。
PS-私はまた、これがひどい考えである理由についての批判を受け入れており、代わりにこのインデックスを増やす必要があります。これにより、検索がはるかに簡単になりましたが、それが悪い考えである場合は、私に教えてください。
例として、データに関するいくつかの詳細:
次のデータベーステーブルがあります。
私のデータのサブセットは次のようになります。
この例では、顧客100に対して3つの行があります。つまり、100ドル、次に10.05ドルの借金があり、現在は何も借りていません。もう少し明確にする必要がある場合はお知らせください。
アップデート:
「RecordOrder」列と「RecordCreated」列はユーザーが使用できません。これらは内部使用のためにのみ存在し、現在の顧客レコードを特定するのに役立ちます。また、日付を使用して同じように簡単に行うことができましたが、適切に注文された顧客履歴を返すために使用できました。RecordCreatedの日付だけで「レコードバージョン」をインクリメントするのと同じことを実行できると思いますが、これにより、RecordOrder = 1が現在のレコードであることがわかり、サブクエリを実行することに戻ります。最新のレコードを判別するためのDateTimeのMAXまたはMIN。
db2 - Netezza、Teradata、DB2 Parallel/Enterprise、... vs Hadoop など?
現在、Hadoop のような Map/Reduce ソリューションの上に、データ ウェアハウジング/クエリ インフラストラクチャを構築することを検討しています。
しかし、すべての M/R 作業は、RDBMS 関係者が過去 20 年間に並列 SQL データベースで解決してきたことを繰り返しているだけに過ぎないと思います。並列 SQL 実装は、M/R と同様に、ノード間で読み取りと書き込みをスケーリングしますが、通常のデータベース (SQL、既存の統合ライブラリなど) の機能も既に含まれています。
問題は、これらの企業の顧客がオンラインであまり投稿していないように見えることです。それで、ここにいる誰かがそのような種類のソリューションの経験があり、洞察やリンクを教えてくれますか?
data-warehouse - OLAP DB からデータが消去されるのはいつですか?
OLAP は初めてです。
テーブル構造と ETL プロセスを理解しています。
ファクト テーブルからデータを削除するタイミングがわかりません。イベントのレポート アプリケーションを作成しているとします。各イベントには、完了までにかかった時間、終了コード、および読み取られた合計バイト数があります。時間や場所など、いくつかの次元があります。
毎日 100 万件の新しいレコードがファクト テーブルに用意されているとします。合計で 1 GB になります。ETL プロセスがファクト テーブルにデータを追加するだけの場合、そのテーブルは無限に大きくなります。いつファクト テーブルからデータを削除する必要がありますか? データをいくつかのファクト テーブル (月ごとのテーブルなど) に分割する必要がありますか?
経験則はありますか?
ありがとう
java - データウェアハウスプロジェクトのストアドプロシージャとJDO
昔は、ストアドプロシージャを介してデータベースにアクセスしていました。それらは、データを管理するための「より良い」方法と見なされていました。データはデータベースに保持されており、どの言語/プラットフォームでもJDBC / ODBC/etcを介してデータにアクセスできます。
ただし、近年、Hibernate/DataNucleusなどのランタイムリフレクション/メタデータベースのストレージ取得メカニズムが一般的になっています。最初は、余分な手順が必要であり(リフレクションに費用がかかる)、必要なのが1つのフィールドだけの場合に不要なデータ(オブジェクト全体)を取得する方法が原因で、処理が遅くなるのではないかと心配していました。
J2EEを使用した大規模なデータウェアハウスプロジェクトを計画し始めていますが、ストアドプロシージャとJDO/JPAなどのどちらを使用するかが少しわかりません。最近、私はHibernateを使用していますが、正直なところ、CRUDストアドプロシージャを作成することをお見逃しなく!
それは本質的に次のように要約されます:
ストアドプロシージャ
+サーバー上で最適化できます(ただし、クエリのみ)
-テーブルごとに、追加、削除、更新、getByIdなどの1,000を超えるストアドプロシージャが存在する可能性があります。
JDO
+今後数か月はparameters.add( "@ firstNames"、customer.getFirstName());の作成に費やしません。...-
SPよりも遅くなります(ただし、ほとんどの場合、ページングがサポートされています)
私の状況であなたは何のためにふっくらしますか。この場合、それは非常に重要だと思います。
ありがとう、
ジョン