2010-10-15 102 views
0

我正在从SQL数据库执行查询。该表有超过一百万条记录。SQL语句需要超过8小时才能运行

这是我的SQL语句。它需要超过8小时才能运行。有人有主意吗?提前致谢。

Select 
    Count (userID) as DIBWIZHits, Sum (ssnCount) as SSNs 
From 
    tbl_hits10 
Where 
(appName='DIBwiz QMT' or 
    appName like 'DIBwiz-Full%' or 
    appName like 'DIBwiz-Abb%' or 
    appName like 'DIBwiz-Qual%') 
    -- or appName like 'DIBwiz%Open%' or appName like 'DIBwiz%Q%') 
and 
    lu_date between 
    convert (datetime, '2010-09-01 00:00:00', 102) and 
    convert (datetime, '2010-09-30 23:59:59', 102) 
AND 
(userID<>'888888' and 
    userID<>'999999' and 
    userID<>'777777' and 
    userID<>'666666' and 
) 
+3

的数据库引擎是什么? – 2010-10-15 20:23:51

+1

从'convert(datetime,...,102)'位看起来像SQL Server?尽管如此,执行计划或配置必定会有灾难性的错误。一百万条记录上的全表扫描无法持续8个小时。 – 2010-10-15 20:31:10

+1

此查询可能很难看,但没有连接或GROUP BY子句,所以它不应该比表扫描慢得多。我无法理解,在这样大小的桌子上进行扫描会花费8个小时的数量级。你的配置有什么奇怪的地方吗?你的桌子可怕地分裂了吗?它是否存储在软盘的RAID阵列上? – zinglon 2010-10-15 21:17:36

回答

0

你有你的表的索引?如果没有,你应该至少添加一个索引到用户ID字段,不要添加一个索引到appName字段,因为你使用'喜欢'它将没有任何效果。

鉴于你有这么多的记录,如果你还没有在userID上的索引,它也可能需要一些时间来添加索引,但应该提高性能很多。

+1

对于'LIKE'没有从索引中受益的评论是错误的,至少在SQL Server 2005中是如此。安东尼如何使用'LIKE'(即最终的通配符),他将受益。以下文章说明了这一点 - 很容易在mgmt studio express(免费)中尝试自己。 http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx – Matt 2010-10-16 02:23:05

4

我对优化有几条建议。

1)你绝对应该使用正则表达式来搜索appname。

2)你应该在用户ID(用户ID未在(1,2,3,4,5)进行比较的列表,如“AND)

3)你的数据库表应该有索引。

每个那些应显着提高性能。

+1

如果这是SQL Server(给出'convert'函数的合理假设),那么: 1.绝对不是,那会比较慢。 2.这没有什么区别。 3.是的,这应该是第一件检查。 – 2010-10-18 12:07:14

1

有在那里CONVERT(日期时间,...)功能where子句就会执行解析每一行,你会好起来,宣布一个日期变量设置为CONVERT的结果并使用它。此外,使用“IN”和“NOT IN”比一个<>更好。最后,LIK使用通配符的E运营商通常比精确的运营商慢。

+3

构建查询计划时,CONVERT只会执行一次,因为它使用的是常量值。 (NOT)IN生成与一系列AND子句相同的计划。因为LIKE必须做更多的工作,所以LIKE总是会慢得多,但真正的痛苦来自于在开始处有一个通配符,它​​阻止了索引的使用,这在这个查询中并不是这样。 (尽管我认为appName可能是一个巨大的TEXT列,它会在某种程度上影响他的'stuff%morestuff%'条件的成本。) – zinglon 2010-10-15 21:24:29

0

你有没有索引appName

也考虑@检测的建议,使用userid not in (<coma_separated_values>)

1

嗯,这可能是特定高度的平台,但我会尝试手动打破它在嵌套查询根据什么指标都存在。例如。 (简体),假设有上lu_date指数:

Select Count (userID) as DIBWIZHits, Sum (ssnCount) as SSNs 
From 
    (select * from tbl_hits10 
    where lu_date between 
     convert (datetime, '2010-09-01 00:00:00',  102) 
     and convert (datetime, '2010-09-30 23:59:59', 102) 
) z 
Where (appName like 'DIBwiz%') 
AND userID not in ('016266'....) 

IHTH

相关问题