NHibernateを使用してマップされたオブジェクトを「フェッチ」すると、SELECTクエリがデータベースに出力されます。パラメータを使用してこれを出力します。私はテナントIDと名前に基づいて車のリストを照会する場合は、私が手:このクエリと結果に基づいてパラメータに関するNHIbernate検索クエリの出力の制御
select Name, Location from Car where [email protected] and [email protected]
これが私達のデータベース作成(およびキャッシュ)の素敵な利点を持っているクエリプランしたがって、再度実行すると、キャッシュからプランをロードできるため、クエリがはるかに高速になります。
この問題は、私たちがマルチテナントデータベースであり、私たちのインデックスのほとんどすべてがパーティションアライメントされているということです。当社のテナントは、データセットが大きく異なります。 1台のテナントは5台の車を所有でき、もう1台は5万台の車両を所有することができます。そして、NHibernateはこれを実行するので、データベースを実行しているFIRSTテナントの計画を作成しキャッシュします。この計画は、クエリを実行する後続のテナントにとって効率的ではない可能性があります。
私がしたいことは、NHibernateが特定のパラメータをパラメータ化しないように強制することです。すなわち、テナントID。だから私は、クエリが読みたいと思います:
select Name, Location from Car where tenantID=55 and [email protected]
私はのhbm.xmlマッピングでこれを行う方法を見つけ出すことはできません。どのようにNHibernateにパラメータの使い方を指示できますか?または、パラメータを完全にオフにできますか?
これはパラメータスニッフィングの問題として私に似ています。これは、通常、一部のインデックスが欠落しているか不十分であることを意味します。 IMOでは、パラメータ化しないことで問題を回避するのではなく、これを改善してください。特にSQL Serverはリテラルを自動的にパラメータ化する可能性があるためです。このすべての詳細については、この[blog](http://www.sommarskog.se/query-plan-mysteries.html)をお読みください。 –