我正在从SQL数据库进行查询。该表中有超过一百万条记录。
这是我的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
)
答案 0 :(得分:4)
我有几条优化建议。
1)你绝对应该使用正则表达式来搜索appname。
2)您应该将userID与列表进行比较,例如“AND(用户ID不在(1,2,3,4,5)中)
3)您的数据库表应该有索引。
每一项都应该大大提高绩效。
答案 1 :(得分:1)
在where子句中使用CONVERT(datetime,...)函数将对每一行执行解析。最好将声明日期时间变量设置为CONVERT的结果并使用它。另外,使用“IN”和“NOT IN”比一系列&lt;&gt;更好。最后,带有通配符的LIKE运算符通常比精确运算符慢。
答案 2 :(得分: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
答案 3 :(得分:0)
使用IN
和NOT IN
答案 4 :(得分:0)
你的桌子上有索引吗?如果不是,您至少应该为userID字段添加一个索引,不要在appName字段中添加索引,因为您使用'like'它将无效。
鉴于您有这么多记录,如果您还没有在userID上有所述索引,那么也可能还需要一些时间来添加索引,但应该会大大提高性能。
答案 5 :(得分:0)
你有appName
的索引吗?
还要考虑@ Detect建议使用userid not in (< coma_separated_values >)