我正在尝试通过创建索引视图来提高我在网页中运行的一堆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上
答案 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