Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化大型表上的多个Select查询_Sql_Sql Server_Optimization_Indexing - Fatal编程技术网

Sql 优化大型表上的多个Select查询

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 id)查询的性能。目前运行这些查询大约需要9秒钟(大约有14个查询,它们都非常相似)。我查询的表有710万条记录

基本上,我有一个包含长字符串(UserAgents)的表,其中包含我试图选择的关键字,如“iPhone”或“Android”。之前,我使用WHERE useragent(如“%iPhone%”)从useragent中提取“iPhone”。我知道,像通配符一样,计算成本很高,所以我创建了一个视图,可以这样做,并将例如“iPhone”分配给一个整数值,因此现在我可以根据我的视图进行选择,例如,其中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上的唯一聚集索引,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