既存のDBを新しいSQL Server 2019インスタンスに移動しています。
互換性レベルを150に変更しても、何も機能しません。タスクマネージャーは、SQLサーバーサービスがすべての利用可能なメモリを消費し、すべてのクエリが次のエラーでタイムアウトすることを示しています
このクエリを実行するには、内部のリソースプールにシステムメモリが不足しています
RAMは、クエリを実行できなくなるまで完全に消費されます(前述の前のエラーですべてが終了します)。16、32、および64 GBのRAMを試しました。
誰もがこれをデバッグする方法に関するヒントを与えることができますか?
これはクエリの問題ではないことに注意してください。SQLがメモリを使い果たすには、互換レベルを変更するだけで十分です。
単純なスカラー関数(内部ではいくつかのサブストリングとキャストの呼び出しを使用します-テーブルまたはビューの選択なし)を実行しても、使用可能なメモリをすべて消費するのに十分です。
スカラーUDFインライン化で既知のバグが発生しています。ここでの方法の1つを使用して(または、自分で発見したように、より低い互換レベルを使用して)インラインを無効にできます。
互換性レベルを変更せずにスカラーUDFインライン化を無効にする
または、恒久的な修正のためにCU2をインストールします。
...単純なスカラー関数(内部では複数のサブストリングとキャストの呼び出しを使用-テーブルまたはビューの選択なし)を実行するだけでも、使用可能なメモリをすべて消費するのに十分です...
問題のこの部分を読むと、sqL_handLeからのこの非常に興味深いブログ投稿を思い出しました。
SQL Server 2019スカラーUDFインライン化-場合によってはOOM
彼は、データアクセスを行わないスカラUDFを示しますが、ボックス上のすべてのメモリを消費します(RAMがほぼTB)の場合でも):
自分自身をクラッシュさせるだけではありません。メモリを割り当てようとしていたインスタンスで他のクエリをクラッシュさせます(クエリメモリの許可を盗むなど)。
これは SQL Server 2019 CU2 で修正する必要があります。これはKBのようです。
FIX:SQL Server 2019のスカラーUDFインライン化の問題
この累積的な更新プログラムには、スカラーUDFインライン化を使用するクエリがエラーまたは予期しない結果を返す可能性があるシナリオの以下の領域にわたるいくつかの修正が含まれています。
- ...
- 非常に大きなスカラーUDFによるメモリ不足状態とメモリリーク
- ...
何らかの理由でCU2をインストールできない場合は、次のようにデータベースレベルでスカラーUDFインリングを無効にする限り、新しい互換性レベルを使用できます。
ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;
または、以前にリンクしたドキュメントの記事で説明されているように、クエリレベルで。