0

我正在尝试通过创建索引视图来提高我在网页中运行的一堆 SELECT count(DISTINCT id) 查询的性能。目前,这些查询运行大约需要 9 秒(其中大约有 14 个,它们都非常相似)。我正在查询的表有 710 万条记录。

基本上,我有一个表,其中的列包含长字符串(UserAgents),其中包含我试图选择的关键字,如“iPhone”或“Android”。以前我使用 WHERE useragent LIKE '%iPhone%' 从用户代理中提取“iPhone”。知道 LIKE 通配符的计算成本很高,我创建了一个视图来执行此操作并将例如“iPhone”分配给一个整数值,所以现在我可以针对我的视图进行选择,例如 WHERE useragent = 2。哪个应该更快对吧?我什至为视图编制了索引,但这些查询的性能并没有提高。

以下是其中一个查询的示例:

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、Referer、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 回答