优化大表上的多选查询

时间:2013-05-17 20:15:24

标签: sql sql-server optimization indexing

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

基本上我有一个包含长字符串(UserAgents)的列表,其中包含“iPhone”或“Android”等关键字,我正在尝试选择这些字符串。以前我使用WHERE useragent LIKE'%iPhone%'从useragent中提取“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,Referrer,EmailClient

在表上添加索引:UserAgent上的唯一聚簇索引,id EmailClient上的非唯一非聚集索引

查看:

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上

1 个答案:

答案 0 :(得分:0)

将此索引放在视图上:HtmlId,EC,UA,MsgId。 这将涵盖您列出的查询,并强制预先计算EC和UA列。 我假设MsgId和Message_Id是相同的。

但是,它可能对其他查询没有帮助。将Ref和Id添加到最后可能对其他人有帮助,但这取决于那些查询。

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