ホームページ >データベース >mysql チュートリアル >SQL Server で遅い COUNT クエリを最適化するにはどうすればよいですか?

SQL Server で遅い COUNT クエリを最適化するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-29 04:32:11851ブラウズ

How Can I Optimize Slow COUNT Queries in SQL Server?

SQL パフォーマンスの最適化: クエリのカウント

大規模なデータセットを操作する場合、行をカウントするクエリは計算コストが高くなり、パフォーマンスが低下する可能性があります。この記事では、カウント クエリのパフォーマンスへの影響を調査し、SQL Server でクエリを最適化するためのソリューションを提供します。

カウント クエリのパフォーマンスの違い

テーブルに対する次の SQL クエリを考えてみましょう。 2,000 万行を超える場合:

if (select count(*) from BookChapters) = 0

このクエリは実行されますSQL Server は、

if exists(select * from BookChapters)

に最適化するため、迅速に、行を数えるのではなく、行の存在を確認します。ただし、クエリが次のように変更された場合:

if (select count(*) from BookChapters) = 1

または

if (select count(*) from BookChapters) > 1

実行時間は 10 分を超えて大幅に増加します。

パフォーマンス ギャップについて

パフォーマンスの違いは、条件付きの count クエリの場合に発生します。 (例: = 1, > 1)、SQL Server は異なるアプローチを採用しています。最も狭い非クラスター化インデックスを使用して行をカウントします。この例のテーブルには非クラスター化インデックスがないため、SQL Server はテーブル全体のスキャンに頼る必要があり、パフォーマンスの低下につながります。

最適化テクニック

最適化するにはクエリをカウントするには、次の手法を検討してください:

  • EXISTS を使用する(INSTEAD OF COUNT = 0): テーブルが空かどうかを判断するだけでよいクエリの場合は、COUNT = 0 の代わりに EXISTS を使用します。
  • 非クラスター化インデックスの作成: WHERE 句で使用される列に非クラスター化インデックスを作成して、行の検索を改善し、完全なテーブルの必要性を減らします。
  • SysIndexes システム テーブルを使用します: 次のクエリを使用して行数を簡単に取得します:
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
  • SUM Rowsパーティション内 (SQL 2005 ): 次のクエリを使用して、おおよその行数を取得します:
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
  • SysIndex の最大行数 (SQL 2000): 古い SQL バージョンの場合は、次を使用します:
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)

以上がSQL Server で遅い COUNT クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。