SQL Server で遅い COUNT クエリを最適化するにはどうすればよいですか?
Dec 29, 2024 am 04:32 AMSQL パフォーマンスの最適化: クエリのカウント
大規模なデータセットを操作する場合、行をカウントするクエリは計算コストが高くなり、パフォーマンスが低下する可能性があります。この記事では、カウント クエリのパフォーマンスへの影響を調査し、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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか?

Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし)

MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド

共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか?

MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか?
