SQL语句需要8个多小时才能运行

时间:2010-10-15 20:06:23

标签: sql

我正在从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 
  )

6 个答案:

答案 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)

使用INNOT IN

答案 4 :(得分:0)

你的桌子上有索引吗?如果不是,您至少应该为userID字段添加一个索引,不要在appName字段中添加索引,因为您使用'like'它将无效。

鉴于您有这么多记录,如果您还没有在userID上有所述索引,那么也可能还需要一些时间来添加索引,但应该会大大提高性能。

答案 5 :(得分:0)

你有appName的索引吗?

还要考虑@ Detect建议使用userid not in (< coma_separated_values >)