Sql 优化大型表上的多个Select查询
我正在尝试通过创建索引视图来提高我在网页中运行的一系列SELECT count(DISTINCT id)查询的性能。目前运行这些查询大约需要9秒钟(大约有14个查询,它们都非常相似)。我查询的表有710万条记录 基本上,我有一个包含长字符串(UserAgents)的表,其中包含我试图选择的关键字,如“iPhone”或“Android”。之前,我使用WHERE useragent(如“%iPhone%”)从useragent中提取“iPhone”。我知道,像通配符一样,计算成本很高,所以我创建了一个视图,可以这样做,并将例如“iPhone”分配给一个整数值,因此现在我可以根据我的视图进行选择,例如,其中useragent=2。哪个应该更快,对吗?我甚至为视图编制了索引,这些查询的性能没有得到任何改善 以下是其中一个查询的示例:Sql 优化大型表上的多个Select查询,sql,sql-server,optimization,indexing,Sql,Sql Server,Optimization,Indexing,我正在尝试通过创建索引视图来提高我在网页中运行的一系列SELECT count(DISTINCT id)查询的性能。目前运行这些查询大约需要9秒钟(大约有14个查询,它们都非常相似)。我查询的表有710万条记录 基本上,我有一个包含长字符串(UserAgents)的表,其中包含我试图选择的关键字,如“iPhone”或“Android”。之前,我使用WHERE useragent(如“%iPhone%”)从useragent中提取“iPhone”。我知道,像通配符一样,计算成本很高,所以我创建了一
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上的唯一聚集索引,id
EmailClient上的非唯一非聚集索引
视图:
视图上的索引:id上唯一聚集,EmailClient上非唯一非聚集将此索引放置在视图上:HtmlId、EC、UA、MsgId。 这将涵盖您列出的查询,并强制预计算EC和UA列。 我假设MsgId和Message_Id是相同的 不过,这可能对其他查询没有帮助。在末尾添加Ref和Id可能有助于其他查询,但这取决于这些查询
另请参见:为什么您认为索引视图会带来神奇的性能优势?如果视图的行数与基表的行数相同,那么使用它并不能真正获得任何好处。我认为索引将允许对索引进行分组/聚集/更有组织,以便在需要预聚合计算(如
计数
)时,可以使用将要快速索引的查询视图。如果它们所做的只是为同一组行创建一个额外的副本,那么它们不太可能起到帮助作用。最好规范化用户代理数据(在查找表中,而不是索引视图中),并确保具有支持where子句的适当索引(甚至可能是筛选索引)。添加准确的架构,包括您添加的任何索引。@Brandon Brown:您的意思是EC!=8
?否则,其他两个条件不会增加任何内容。
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