同じインフラストラクチャで(私が見る限り)SQL Server 2019データベースよりもはるかに優れたSQL Server 2012サーバーがあります。同じSLAを使用して、両方のデータベースをクラウドプラットフォームでホストしています。どちらも180GB RAMおよび16個のプロセッサーを備えています。
ただし、いくつかの重要な違いがあります。
編集:私が気付いたもう一つの大きな違い-1つはWindows Server 2008、もう1つはWindows Server 2019です。それはおそらくサーバー側の設定かもしれません...
すべてのSQLディスクのアロケーションユニットサイズは64kbに設定されています。SQLには、ファイルサイズ自体を制御するための適切な権限があります。サーバーは高パフォーマンスモードに設定されています。他に何かサーバー側を変更する必要がありますか?
その他のデータベース設定は変更されなかったため、次の設定は2019年のデフォルトです。
主に実行するクエリのタイプは、更新と挿入を実行する大規模で複雑なマルチ結合クエリであり、ユーザーからの小さな選択が時々行われます。大きなファイルをデータベースにロードしてから、通常は一度に1つずつ、大きなクエリでデータを処理します。これらの大きな「ロード」の合間に、ユーザーは、将来のロード/プロセスのステップに備えてロード/処理されていない他のデータベーステーブルを選択します。通常、処理のパフォーマンスは30%〜50%低下します。これはMAXDOP設定が原因であると考えましたが、0に変更しても、一連の実行で違いはありませんでした。
主な症状は、処理がビジーなときに2019サーバーに接続しようとすると、ロックタイムアウトが発生するのに対し、2012サーバーはまだ非常にゆっくりと接続にサービスを提供していることです。サーバーの接続タイムアウト設定を高く設定することを考えていましたが、それでもサーバーから応答が得られないのではないかと思います。それは少しでもビジー状態の場合、すべての新しい接続をブロックしているようなものです。
他に試すべきことはありますか?それらのデータベース設定をいじくり回す価値はありますか?
さらに掘り下げてDMVの調査を開始することもできますが、これはパフォーマンスが大幅に低下する「好きなもの」環境のアップグレードに近いようです。より大きな調査を行う前に、他に確認すべきことがないことを確認するだけです。
データベースのアップグレード、クエリストアの有効化、データベースの互換性レベルを上げる前のテストが、推奨されるアップグレードプロセスである理由を発見したと思います。
計画の回帰が多い場合は、次のように、より高いデータベース互換性レベルで古いカーディナリティエスティメータを使い続けることができます。
ALTER DATABASE SCOPED CONFIGURATION
SET LEGACY_CARDINALITY_ESTIMATION = ON;
Sql Server 2012からのアップグレードで同様の問題が発生しました。
SQL Server 2014で導入されたCardinality Estimatorの変更が原因でした。
テスト環境でレガシーカーディナリティ設定をオンに変更して、ワークロードのパフォーマンスを比較してみてください
https://blog.sqlauthority.com/2019/02/09/sql-server-enabling-older-legacy-cardinality-estimation/
SQL Server 2008 R2からSQL Server 2019へのアップグレードで同様の問題がありました(互換性レベル150)。
夜間の更新ジョブの一部は、実行に突然6〜7倍の時間がかかりました(4分から39分、1時間から6時間)。
従来のカーディナリティ設定をON
に設定すると、通常の更新速度に戻りました。
これが私たちがしたことです(ソース: https://blog.sqlauthority.com/2019/02/09/sql-server-enabling-older-legacy-cardinality-estimation/ ):
USE [YourDB]
GO
ALTER DATABASE SCOPED CONFIGURATION
SET LEGACY_CARDINALITY_ESTIMATION = ON;
GO
別の可能性は、グローバルトレースフラグ9481を有効にすることであり、インスタンス内のすべてのワークロードはレガシーCEを使用します