この記事は、データベース互換性レベルを 120 から 130 にアップグレードするときに発生する問題を解決するのに役立ちます。
元の製品バージョン: SQL Server 2016、Windows 上の SQL Server 2017 (すべてのエディション)
元の KB 番号: 3212023
まとめ
以下のシナリオについて考えてみます。
- 空間クエリを実行するには、SQL Server 2016 または WINDOWS 上の SQL Server 2017 で
STIntersects
などの関数を含むフィルターを使用します。 - データベース互換性レベルは 120 です。
- このクエリでは、並列実行プランが使用されます。
- データベース互換性レベルを 130 にアップグレードすると、実行プランが並列からシリアルに変更されました。
このシナリオでは、クエリから大きな結果セットが返された場合、パフォーマンスが低下します。
解決方法
この問題に対処するには、次のいずれかの方法を試してください。
データベース互換性レベルを 120 に戻します。 これを行うと、データベース互換性レベル 130 の SQL Server 2016 または Windows 上の SQL Server 2017 で使用できる機能の一部を利用できなくなります。 ただし、空間データ型を使用したクエリ操作の全体的なパフォーマンス向上など、データベース互換性レベルにバインドされていない多くの機能強化を実現できます。
データベース互換性レベル 130 を必要とする SQL Server 2016 の拡張機能の一覧については、「 ALTER DATABASE (Transact-SQL) 互換性レベルを参照してください。
パフォーマンスが向上する場合は、データベース互換性レベル 120 で生成されたプランを強制します。
USE PLAN
クエリ ヒントを使用して、データベース互換性レベル 130 で実行中にこのプランを強制できます。 ヒントの使用の詳細については、「 Hints (Transact-SQL) - クエリ」を参照してください。または、クエリ ストアを使用して、特定のプランの選択を特定して修正します。 この目的でクエリ ストアを使用する方法の詳細については、「クエリ ストアの使用シナリオ」を参照してください。
詳細
SQL Server データベース互換性レベル 120 と 130 では、スカラー ユーザー定義関数または特定の T-SQL 関数 (STIntersects など) が定数と比較される述語のカーディナリティを推定するために、さまざまな方法が使用されます。
データベース互換性レベル 130 で使用されるコスト モデルでは、レベル 120 と比較して多くのワークロードのパフォーマンスが向上しますが、クエリ プランの一部のクエリ (使用されるデータと関数に応じて) のパフォーマンスは、レベル 130 で実際に低下する可能性があります。
適用対象
- SQL Server 2017 on Windows (すべてのエディション)
- SQL Server 2016 Service Pack 1
- SQL Server 2016 Developer
- SQL Server 2016 Enterprise
- SQL Server 2016 Express
- SQL Server 2016 Standard
- SQL Server 2016 Web