1

クライアントが切り替えを決めた後、他社のウェブサイトを引き継ぎました。

1日に約25kレコード増加するテーブルがあり、現在は15MMレコードです。

テーブルは次のようになります。

id (PK, int, not null)
member_id (int, not null)
another_id (int, not null)
date (datetime, not null)

SELECT COUNT(id) FROM tbl 最大15秒かかる場合があります。

'another_id'での単純な内部結合には30秒以上かかります。

なぜこんなに時間がかかるのか想像がつきません。何かアドバイス?

SQL Server 2005 Express

4

3 に答える 3

3

行数が必要であるが、概算値で生きることができる場合(100%正確であるとは限りませんが、ボールパークが得られます)、SQL Serverのシステムカタログビューを使用して、次のように実現できます。

SELECT 
    t.Name AS TableName,
    sum(p.rows) as RowCounts
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE 
    t.Name = 'Your Table Name'
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 

データベース内の任意のテーブルを指定すると、これにより、そのテーブル内の行数の概算が得られ、非常に高速です(測定不能-0.01秒未満)。

于 2010-04-09T07:22:08.837 に答える
1

COUNT(id)通常は全表スキャンになるため、カウントを取得するにはテーブル全体を読み取る必要があることに注意してください。カウントが本当に重要な場合は、カウントの結果を他のテーブルに格納するトリガーを作成することを検討してください。

クエリがないと、についてはあまり言えinner joinませんが、どちらにもインデックスがないのではないかと思いますidanother_id

于 2010-04-09T00:12:44.497 に答える
0

15 millionで実行されている行SQL Server 2005 Express

どんなハードウェアを使っていますか?データベースは適切に設定できますが、RAMがたくさんある優れた専用サーバーを使用していない場合、そのような大きなテーブルでのクエリは遅くなります。

于 2010-04-09T11:55:20.950 に答える