2016-04-28 7 views
1

テーブルEliには100万レコードあります。私が次の質問をするとき:テーブルから選択カウント(*)を最適化する

Select count(*) from Eli where userId ='my_user' 

結果を得るのに10分以上かかる。私はウェブを検索し、http://dbatipster.blogspot.com/2009/08/get-row-counts-fast.htmlからクエリを最適化するためのより良い方法を見つけました。

私はきちんとテーブルを構築する上で触れることなく、私の上記query-

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 
+4

'userID'のインデックスを作成しましたか? – WillardSolutions

+3

100万行は大きな数ではありません。カバリングインデックスがない場合でも、フルテーブルスキャンを実行するのに10分間は実行しないでください。 Bte、第2セレクトは、WHERE条件なしで行カウントにのみ使用できます。 – dnoeth

答えて

1

に次のクエリを使用しない、私はこのようなものを使用する方法を:

SELECT COUNT(userID) FROM Eli (NOLOCK) 
WHERE userId ='my_user' 

(NOLOCK)ヒントができますコミットされているEliテーブルに対して他のトランザクションを行わずにテーブルから選択することができます。つまり、結果を返す前に他の更新と挿入が完了するのを待っているわけではありません。

+0

申し訳ありませんが、あなたは解雇されるかもしれません。 NOLOCKは、行が複数回含まれる可能性があるため、誤った結果が報告されることがあります。これは、これに起因する読み取り専用テーブルには、ほんのちょうど適切です。 – TomTom

+0

@TomTom質問は具体的には、その最適化されたクエリをどのようにしてより迅速に結果を返すためのクエリに適合させることができたかという問題でした。その最適化されたクエリの一部は、NOLOCKヒントであり、それが何をするかに関する情報を提供します。彼らは、彼らが何をしているのかどうかを判断することができます。 – Jake

-1

あなたのクエリで非常に頻繁にuserIDフィルタを使用する予定がある場合は、改良を見て簡単に修正すると、userIDのテーブルにインデックスが追加されます。もちろん、userIDがテーブルのプライマリキーである場合、インデックスは必要ではなく、改善する必要のある他の方法をチェックする必要があります。今、あなたが提供しているクエリはあなたのためにそれを容易にするために、このように適用されなければならない :

SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count] 
FROM sys.sysindexes i WITH (NOLOCK) 
WHERE i.indid in (0,1) 
AND OBJECT_NAME(i.id) = 'Eli'; 

あなたは掲載元のクエリは、行数の多い順に、データベース内のすべてのオブジェクトの行数を記載されています。

0
CREATE VIEW dbo.vwEli 
WITH SCHEMABINDING 
AS 
    SELECT userId, cnt = COUNT(*) 
    FROM Eli 
GO 

CREATE CLUSTERED INDEX ix ON dbo.vwEli (userId) 
GO 

SELECT cnt 
FROM dbo.vwEli --WITH(NOEXPAND) 
WHERE userId = 'my_user' 
1

検索結果1万行を超えるcoundが、その時間はかかりません

を与えるために10の以上の分を取っています。あなたは間違った木を吠える。完全に。コミカルなレベルで - 燃料が漏れているタンクが壊れている車の燃料消費について不平を言うように。真剣に。

これまで長持ちさせる唯一の理由は、過度に悪いロックです。これは修正する必要があります。 100万行は何もありません。たとえその時代の遅いハードディスクの10歳のコンピュータであっても、あなたの質問をするのに1分もかからないでしょう。ここで何かがブロックされています。有能でないプログラマーが書いた他のコードは、必要以上にロックを保持している可能性があります。

関連する問題