Fluent-NHibernate (自動マッピング付き) を使用してテーブルを生成していますが、デフォルトで使用される ID フィールドとは異なるクラスター化インデックスを選択したいと考えています。Fluent NHibernate を使用して、デフォルトの主キー フィールド以外のフィールドにクラスター化インデックスを作成するにはどうすればよいですか?
この背後にある主な理由は単純です。主キー フィールドに Guid を使用しています。デフォルトでは、NHibernate は主キー フィールドにクラスター化インデックスを作成します。通常、Guid は連続していないため、主キー フィールドでクラスタリングを行うとパフォーマンスの問題が発生します。
ご存知のように、テーブルの最後にレコードを追加する方が、テーブル内にレコードを挿入するよりもはるかに安価な操作です。また、テーブル内のレコードは、クラスター化インデックス内のアイテムの順序で物理的に格納されます。Guid はいくぶん「ランダム」であり、シーケンシャルではないため、テーブルに既に存在する他の Id Guid の値よりも小さい新しい Guid が生成される場合があります。その結果、追加ではなくテーブルの挿入が行われます。
これを最小限に抑えるために、DateTime 型の CreatedOn という列があります。すべての新しいレコードが挿入されるのではなく追加されるように、この CreatedOn 列でテーブルをクラスター化する必要があります。
これを達成する方法についてのアイデアは大歓迎です!!!
注: Sequential Guid を使用できることはわかっていますが、セキュリティ上の理由から、そのパスをたどりたくありません。
注: この投稿に対する回答はまだありませんが、現時点で考えているアイデアがいくつかあります。
Fluent なしで NHibernate を使用すると、クラスター化されたインデックスを NHibernate で直接作成できる可能性があると思います。これを行う方法を知るには、NHibernate についてまだ十分に知りません。私はかなり(ほぼ絶対に)それができると確信しています。
Fluent-NHibernate には、最近の書き直しの前に、SQL オブジェクトに属性 (クラスター化インデックスなど) を設定する方法が含まれていました。現在、そのオプションはなくなっているようです。そのオプションがまだ利用可能かどうかを確認するために、おそらくどこかに質問を投稿します。もしそうなら、おそらくそれを使用してクラスター化インデックスを設定できます。
Fluent-NHibernate は、構成が流暢に構築されたら、手動編集用に構成を公開する機能を提供します。この機能を試したことはありませんが、クラスター化インデックスを設定するために必要なレベルの粒度が提供される可能性があると期待しています。
最悪のシナリオでは、生成されたすべてのテーブルのクラスター化インデックスを変更する SQL スクリプトを作成できます。ただし、このアプローチに関していくつか質問があります。A. 自動スキーマ生成を使用しているため、NHibernate は次に構成を評価するときにクラスター化インデックスの変更を「元に戻す」ことはできますか? 2. クラスタ化インデックスが変更されたことを検出した場合、NHibernate はエラーになりますか? これをテストする必要がありますが、まだ行っていません。しかし、私はこのソリューションが本当に嫌いです。SQLServer2008 および MySQL に対して DB をテストしています。NHibernate の優れた点の 1 つは、データベースに依存しないことです。スクリプトを導入すると、すべての賭けがオフになります。
このインターフェイスから継承する IPropertyInstance クラスには、フィールドにインデックスを作成できるようにする Index プロパティがあります。問題は、クラスター化されたインデックスを作成できるようにするフラグやその他のオプションがないことです。最も簡単な解決策は、このメソッドにプロパティを追加して、クラスター化インデックスを作成できるようにすることです。これを Fluent-NHibernate 開発者に提案できると思います。