KB3180087 - INT を実行するとパフォーマンスが低下します。 Windows 上の SQL Server 2016 または SQL Server 2017 での SELECT 操作

適用先
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use)

現象

Windows 上の Microsoft SQL Server 2016 または SQL Server 2017 では、次の条件でパフォーマンスが低下する場合があります。

  • テンポラリ・テーブルに対して複数の INSERTSELECT 操作を同時に実行する場合。
  • sys.dm_os_waiting_tasksをクエリする場合。 この状況では、 resource_description 列には、複数の要求に対するページ空き領域 (PFS) ページの待機が表示されます。

原因

INSERTSELECT 操作の INSERT 並列処理は、Windows 上の SQL Server 2016 または SQL Server 2017 で導入されました。 ローカル一時テーブル (# プレフィックスで識別されるもののみ、## プレフィックスで識別されるグローバル一時テーブルではない) への INSERT は、非一時テーブルに必要な TABLOCK ヒントを指定しなくても、並列処理が自動的に有効になりました。 

通常、INSERT 並列処理はクエリのパフォーマンスを向上させますが、多数の一時テーブルの INSERTSELECT 操作が同時に存在する場合、PFS ページに対して重大な競合が発生する可能性があります。 場合によっては、これにより全体的なパフォーマンスが低下することがあります。

解決策

この問題は、SQL Server 2016 Service Pack 1 で最初に修正されます。 SQL Server 2016 SP1 を適用した後、INSERT で並列 INSERT..SELECT to local temporary tables は既定で無効になっています。これにより、PFS ページの競合が減少し、同時ワークロードの全体的なパフォーマンスが向上します。 ローカル一時テーブルへの並列 INSERT が必要な場合、ユーザーはローカル一時テーブルに挿入するときに TABLOCK ヒントを使用する必要があります。

回避策のセクションで説明したトレース フラグ 9495 を有効にしている場合は、SQL Server 2016 SP1 を適用した後、トレース フラグを無効にして削除することをお勧めします。トレース フラグ 9495 は TABLOCK ヒントに関係なく並列挿入を無効にします。

累積的な更新プログラムの情報

この問題は、次の SQL Server 2016 の累積的な更新プログラムで修正されました。

SQL Server 用の累積的な更新プログラムについて