2012-03-19 11 views
1

各カテゴリのメンバー数をカウントする必要があるため、読み込みに時間がかかりすぎるページがあります。高速なSQLカウント

http://www.storeboard.com/counties/default.asp?cou=1196は、さらなる調査の際に、私はこのページにつまずい:私は引用されたページの溶液4中に提案中に、

SELECT COUNT(MemberID) AS MembersInCountyCat 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND (
    NYKACatID = @NYKACatID 
OR NYKACatIDExtra1 = @NYKACatID 
OR NYKACatIDExtra2 = @NYKACatID 
OR NYKACatIDExtra3 = @NYKACatID 
OR NYKACatIDExtra4 = @NYKACatID 
OR NYKACatIDExtra5 = @NYKACatID 
OR NYKACatIDExtra6 = @NYKACatID 
OR NYKACatIDExtra7 = @NYKACatID 
OR NYKACatIDExtra8 = @NYKACatID 
OR NYKACatIDExtra9 = @NYKACatID 
OR NYKACatIDExtra10 = @NYKACatID 
) 
AND ProfileTypeID <> 1 

http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx

私が持っている問題は、私はこれを変更するにはどうすればよいです。

ご提供いただけるご支援があれば幸いです。

多くのおかげで、ポール・

+3

それらMemberIdsが一意になり、することはできません条件を適用する - サンプルページは各カテゴリのXをカウントするように見えるが、クエリサンプルはそれらのセットには当てはまらないように見える、使用するSQL全体は何か –

答えて

2

あなたは本当に、それらが適切にインデックス、これらすべてのフィールドを検索する必要がある場合 - 良い出発点のためのプロファイラとデータベースエンジンチューニングアドバイザを使用します。

これらの10個のNYKACatIDExtraフィールドを別々のテーブルに抽出し、それらを1対多の関係として配置することもできます。次に、項目のカテゴリを検索するためにjoinを使用してください。

3

あなたはあなたのdbを正規化する必要があります。すなわち、NYKACatID、NYKACatIDExtra1 .. NYKACatIDExtra1 ..を別のテーブルに移動する必要があります。そのテーブルの適切なインデックスを定義し、joinを使用してクエリを書き換えます。 (あなたがいずれかを持っている場合)、おそらくインデックスを利用するには、このような

+1

Vitaliyが述べているように、データモデルを非正規化しました。今度は、一連のORを使用する必要があります。または、DBMSが索引を使用するのが困難になります。その問題とあなたのパフォーマンスの問題にも対処してください。データモデルを正規化する必要はありません。 SQLを微調整して、正規化されたデータモデルでは動作しないようにすることができます。しかし、それは困難で遅いでしょう。 Go with The Flow、SQLは、正規化されたデータモデルで最も効果的です。 – Wim

-1

何か:

select MembersInCountyCat = count(*) 
from (
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatID = @NYKACatID 
AND ProfileTypeID <> 1 
union 
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatIDExtra1 = @NYKACatID 
AND ProfileTypeID <> 1 
union 
... 
union 
SELECT MemberID 
FROM Member 
WHERE NYKACountyID = @NYKACountyID 
AND NYKACatIDExtra10 = @NYKACatID 
AND ProfileTypeID <> 1 
) t 

unionは、テーブルのためのこれらの例は、クエリオブジェクト/索引レベルの統計情報を

+0

残念ながら、これは私の解決策よりもさらに遅いことが判明しました。 – neojakey

+0

@neojakeyこのメソッドを利用するには、これらの列に「列を含むフィルタリングされたインデックス」を別にする必要があります。 '非クラスタ化インデックスを作成するメンバー(nykacountyid、nycacatidextra1)上のix_m_nykacid_nykacide1は(memberid)profiletypeid <> 1'(10個) –