0

インデックス付きビューを作成して、Web ページで実行している一連の SELECT count(DISTINCT id) クエリのパフォーマンスを向上させようとしています。現在、これらのクエリの実行には約 9 秒かかります (クエリは約 14 あり、すべて非常に似ています)。クエリを実行しているテーブルには 710 万件のレコードがあります。

基本的に、選択しようとしている「iPhone」や「Android」などのキーワードを持つ長い文字列 (UserAgents) を含む列を持つテーブルがあります。以前は、WHERE useragent LIKE '%iPhone%' を使用して、useragent から "iPhone" を抽出していました。LIKE ワイルドカードは計算コストが高いことを知っていたので、これを行い、たとえば "iPhone" を整数値に割り当てるビューを作成したので、たとえば WHERE useragent = 2 などのビューに対して選択できるようになりました。ビューにインデックスを付けましたが、これらのクエリのパフォーマンスは向上しません。

クエリの 1 つの例を次に示します。

SELECT COUNT(DISTINCT message_id) AS Amount
FROM emailClientUsageView
WHERE HTMLID = 4736 AND (EC = 8 AND UA != 2 AND UA != 3);

テーブル、ビュー、データベース、および/またはクエリを最適化して、これらのクエリを妥当な時間 (< 2 秒) で実行するにはどうすればよいですか?

編集: 表: 列: id、htmlid、msgid、dt、UserAgent、Referrer、EmailClient

テーブルに追加されたインデックス: UserAgent の一意のクラスター化インデックス、EmailClient の id 非一意の非クラスター化インデックス

意見:

SELECT id, msgid, HTMLID,
    CASE
        WHEN Referrer LIKE '%aol%' THEN 1
        WHEN Referrer = '' THEN 99
        ELSE 0
        END AS ref, 
    CASE
        WHEN UserAgent LIKE '%iPhone%' THEN 1
        WHEN UserAgent LIKE '%iPad%' THEN 2
        WHEN UserAgent LIKE '%iPod%' THEN 3
        WHEN UserAgent LIKE '%Microsoft Office%' THEN 4
        WHEN UserAgent LIKE '%Mozilla%' THEN 5
        WHEN UserAgent LIKE '%Android%' THEN 6
        ELSE 0
        END AS UA, 
    CASE
        WHEN EmailClient LIKE '%iPhone%' THEN 1
        WHEN EmailClient LIKE 'internet explorer%' THEN 2
        WHEN EmailClient LIKE '%Outlook%' THEN 3
        WHEN EmailClient LIKE '%yahoo%' THEN 4
        WHEN EmailClient LIKE '%safari%' THEN 5
        WHEN EmailClient LIKE '%Android%' THEN 6
        WHEN EmailClient LIKE '%gmail%' THEN 7
        WHEN EmailClient LIKE '%Windows%' THEN 8
        WHEN EmailClient LIKE '%AOL%' THEN 9
        WHEN EmailClient LIKE '%Thunderbird%' THEN 10
        WHEN EmailClient LIKE '%Lotus Notes%' THEN 11
        WHEN EmailClient LIKE '%Palm%' THEN 12
        WHEN EmailClient LIKE '%Entourage%' THEN 13
        WHEN EmailClient LIKE '' THEN 99
        ELSE 0
        END AS EC
FROM store_openEmail AS emailClientUsageView

ビューのインデックス: ID でクラスター化された一意、EmailClient でクラスター化されていない非一意

4

1 に答える 1

0

ビューに次のインデックスを配置します: HtmlId、EC、UA、MsgId。これにより、リストしたクエリがカバーされ、EC および UA 列が事前に計算されます。MsgId と Message_Id は同じであることを意図していると思います。

ただし、他のクエリでは役に立たない場合があります。最後に Ref と Id を追加すると、他のクエリに役立つ場合がありますが、それはそれらのクエリによって異なります。

参照: http://msdn.microsoft.com/en-us/library/dd171921%28SQL.100%29.aspx

于 2013-05-18T02:37:41.130 に答える