Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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查询方法_Sql_Sql Server - Fatal编程技术网

更有效的sql查询方法

更有效的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

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 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秒与百万行不同。为了提高性能,您需要修复数据结构,以便在相关子查询中摆脱
类似