問題タブ [memory-optimized-tables]
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 - メモリ最適化テーブルの統計と、ネイティブ コンパイル ストアド プロシージャのクエリ プランに関する問題
メモリ最適化テーブル:
メモリ最適化 (MO) テーブルの統計は、テーブルの作成時に作成され、空であり、更新されないことを理解しています。インデックスの MO テーブル統計を更新するには、テーブルにデータがあれば手動で強制的に統計を更新する必要があります。
私の MO テーブルのほとんどは、ストアド プロシージャの #temp テーブルの代わりであり、スキーマのみの持続性で定義されています。
ストアド プロシージャへの各呼び出しには「セッション ID」が与えられ、古い「セッション ID」に基づいて MO テーブルを定期的にクリーンアップするジョブがあります。
そうは言っても、MO テーブルのデータが最も多いのは、クリーンアップの直前です。したがって、クリーンアップ手順内で削除ステートメントの直前にテーブル統計を更新することは理にかなっています。
ネイティブ コンパイル ストアド プロシージャ:
MO テーブルと同様に、ネイティブ コンパイル (NC) ストアド プロシージャのクエリ プランは、プロシージャの作成時に生成され、SQL Server の再起動時にのみ更新されます。プロシージャが作成されたとき、または SQL Server が再起動されたとき、MO テーブルはスキーマのみの持続性で定義されているため空です。クエリ プランを再作成する唯一の方法は、NC ストアド プロシージャを削除し、MO テーブルにデータがある場合にそれらを再作成することです。つまり、プロシージャは、適切なクエリ プランなしで少なくとも 1 回は実行する必要があります。これは受け入れられません。適切なクエリ プランなしでプロシージャを 1 回実行する必要も、通常の操作中に NC プロシージャを再作成する必要もありません。
もう 1 つのオプションは、インデックス ヒントを使用し、NC ストアド プロシージャ内のすべてのクエリで順序を強制することです。これにより、開発者はクエリ プランを作成し、SQL Server を無視する必要があります。その場合は、C++ または C# で作業し、NC 手順に煩わされることはありません。
MO テーブルと NC ストアド プロシージャをより有効に活用するための提案はありますか? 私は SQL Server 2014 を使用していますが、これらは SQL Server の最近のバージョンにも当てはまると思います。