更有效的sql查询方法
RGN->区域名称,NPR->每个区域需要计数的事件,RGF->区域过滤器。所以在NPR中,我有一个关于汽车牌照的活动,我需要计算每个地区的车牌数量,并将其分为每周7天。我的解决办法如下:更有效的sql查询方法,sql,sql-server,Sql,Sql Server,RGN->区域名称,NPR->每个区域需要计数的事件,RGF->区域过滤器。所以在NPR中,我有一个关于汽车牌照的活动,我需要计算每个地区的车牌数量,并将其分为每周7天。我的解决办法如下: SELECT DISTINCT a.NAME, COUNT(CASE WHEN DATEPART(dw,b.TM) = 1 THEN 1 ELSE null END) as MON, COUNT(CASE WHEN DATEPART(dw,b.TM) = 2 THEN 1 ELSE null END) as
SELECT DISTINCT a.NAME,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 1 THEN 1 ELSE null END) as MON,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 2 THEN 1 ELSE null END) as TUE,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 3 THEN 1 ELSE null END) as WED,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 4 THEN 1 ELSE null END) as THU,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 5 THEN 1 ELSE null END) as FRI,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 6 THEN 1 ELSE null END) as SAT,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 7 THEN 1 ELSE null END) as SUN
FROM RGN a
LEFT JOIN NPR b
ON a.ID IN (
SELECT c.RGID
FROM RGF c
WHERE RTRIM(b.NUM) like RTRIM((REPLACE(c.RGFLT,'?','_')))
)
Group by a.NAME;
在过滤器中,我需要将?
替换为。
以获得like()
表达式
这个查询给了我很好的结果,但由于数据库中有4 mil条记录,需要20分钟才能得到它。你知道如何做到完全相同但更有效吗
另外,我试着用SUM()代替count,但它没有改变任何东西
@编辑我的下一次尝试是从NPR选择
和加入RGN
,虽然有点快,但还不够
SELECT a.NAME,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 1 THEN 1 ELSE null END) as MON,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 2 THEN 1 ELSE null END) as TUE,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 3 THEN 1 ELSE null END) as WED,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 4 THEN 1 ELSE null END) as THU,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 5 THEN 1 ELSE null END) as FRI,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 6 THEN 1 ELSE null END) as SAT,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 7 THEN 1 ELSE null END) as SUN
FROM RGN a, RGF c
left JOIN NPR b
ON RTRIM(b.NUM) like RTRIM((REPLACE(c.RGFLT,'?','_')))
WHERE a.ID = c.RGID AND b.TM BETWEEN
Group by a.RGNAME
执行时间为100k行~4s,足够好,因为它是~12s您可以在此处删除DISTINCT,因为您的组将返回不同的行。使用DISTINCT比不使用DISTINCT工作更快。它会吗???哪种数据库管理系统?ms sql server 2008,只有10万行,12682秒与
不同
,12761秒与百万行不同。为了提高性能,您需要修复数据结构,以便在相关子查询中摆脱类似
。