帮忙看下这个sql怎么优化,现在执行了5秒,想要它能到2秒以内

wuxiaoqqqq 2008-12-02 04:16:16

INSERT INTO @result
( UserID, ProjectID, CraftCode, CraftDescription, ConstructionTrade, EthnicityCode, Gender, WorkHours, EmployeeNumber, IsForman, FormanEmployeeID)
SELECT @pUserID, CW.ProjectID, CW.CraftCode, CW.CraftDescription,
CW.ConstructionTrade, CW.EthnicityCode, CW.Gender, Sum(CH.RHW+CH.OHW+CH.DHW)
AS Hours, Count(Distinct(CW.EmployeeID)) AS EmployeeNum, 1, FE.FormanEmployeeID
FROM @tblCPRWeekly CW INNER JOIN CPRHourly CH ON CW.CPRWeeklyID = CH.CPRWeeklyID
INNER JOIN FormanEmployee FE ON CW.EmployeeID = FE.EmployeeID
LEFT OUTER JOIN FormanEmployeePeriod FEP ON FE.FormanEmployeeID = FEP.FormanEmployeeID
WHERE CH.DateWorked Between @pStartDate AND @pEndDate and ch.ActiveRecord=1
AND CW.ProjectID = FE.ProjectID AND FE.ActiveRecord = 1
AND (((FEP.StartDate is null or FEP.StartDate = '1900-01-01 00:00:00.000') AND (FEP.EndDate is null or FEP.EndDate = '1900-01-01 00:00:00.000')) OR ((FEP.StartDate is null or FEP.StartDate = '1900-01-01 00:00:00.000') AND CH.DateWorked <= FEP.EndDate)
OR ((FEP.EndDate is null or FEP.EndDate = '1900-01-01 00:00:00.000') AND CH.DateWorked >= FEP.StartDate) OR (CH.DateWorked Between FEP.StartDate AND FEP.EndDate))
GROUP BY CW.ProjectID, CW.ConstructionTrade, CW.CraftCode, CW.CraftDescription, CW.EthnicityCode, CW.Gender, FE.FormanEmployeeID
...全文
261 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2009-01-02
  • 打赏
  • 举报
回复
5s 够快了
fcuandy 2009-01-02
  • 打赏
  • 举报
回复
给datetime列一个'1900-1-1'的默认值,not null.

连这么多表,还group by,能快的起来吗

还有 NSERT INTO @result ,这里@result是表变量?


把多个表变量用临时表代替。

然后用动态语句,以牺牲每次都要的查询计划为代价,以有效利用索引,再试试。
czm168 2009-01-02
  • 打赏
  • 举报
回复
我的也是,很慢,2万多条数据要1分多钟才能够读出了
lizhongheng 2009-01-02
  • 打赏
  • 举报
回复
同意
[Quote=引用 3 楼 dawugui 的回复:]
我能说的只有三点.

1.将相关字段加上索引.
2.优化自己的查询.
3.提高你的硬件配置.

貌似没说.
[/Quote]
starluck 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 szx1999 的回复:]
语句本身没有多大优化的余地。

is null造成无法正常使用索引,效率因此较低。

最好是规整数据库中的数据,将null 和 '1900-01-01 00:00:00.000' 统一一下。
如果时间字段上有合适的索引,可以考虑将or分开,
将各个结果集用union all连起来,但必须保证没有重复数据。

这样优化的效果一般也不是很明显……
[/Quote]

lgy_come_on 2008-12-31
  • 打赏
  • 举报
回复
学习哦!帮顶
snoopyljc 2008-12-31
  • 打赏
  • 举报
回复
and ch.ActiveRecord=1
AND CW.ProjectID = FE.ProjectID AND FE.ActiveRecord = 1

放到where的最后, 先过滤
Zoezs 2008-12-03
  • 打赏
  • 举报
回复
你查看下查询计划,看下资源主要在那些地方消耗,然后看那个字段需要建索引。
chaorenwopashei 2008-12-03
  • 打赏
  • 举报
回复
呵呵进来看到这么恶心的sql我很难过啊,现在中国的软件技术落后到这个地步了啊,伤心
jinjazz 2008-12-03
  • 打赏
  • 举报
回复
秒只是一个量化的参考指标,不能代表真实生产环境的状态。
zxbyhcsdn 2008-12-03
  • 打赏
  • 举报
回复
查询计划粘出来麻!
不然怎么给你优化捏??
dobear_0922 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
上帝在吗?
[/Quote]

谁需要上帝?我马上派他过来,,,
  • 打赏
  • 举报
回复
看看这个帖子,对你是否有帮助
http://topic.csdn.net/u/20080808/14/5c354b26-3556-44f1-a1d7-bbaf53c7ead9.html
http://topic.csdn.net/u/20080509/10/c9bee345-3f57-4632-a84d-1673b1e96bf8.html


http://topic.csdn.net/u/20080829/09/c748e875-3abd-4450-b38d-d8b39b60e79f.html
等不到来世 2008-12-02
  • 打赏
  • 举报
回复
语句本身没有多大优化的余地。

is null造成无法正常使用索引,效率因此较低。

最好是规整数据库中的数据,将null 和 '1900-01-01 00:00:00.000' 统一一下。
如果时间字段上有合适的索引,可以考虑将or分开,
将各个结果集用union all连起来,但必须保证没有重复数据。

这样优化的效果一般也不是很明显……
wuxiaoqqqq 2008-12-02
  • 打赏
  • 举报
回复
我现在把后面的OR去掉的话可以快很多,但关键问题是我这些OR的条件应该怎么转换呢?
等着各位大虾的答案,我继续在做测试。
vliguo 2008-12-02
  • 打赏
  • 举报
回复
查询好复杂啊
lgx0914 2008-12-02
  • 打赏
  • 举报
回复
关注
wuxiaoqqqq 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
我能说的只有三点.

1.将相关字段加上索引.
2.优化自己的查询.
3.提高你的硬件配置.

貌似没说.
[/Quote]

我现在只能从第2点下手,请大家帮忙看看哪个地方能优化的。
中国风 2008-12-02
  • 打赏
  • 举报
回复
在對應的條件列建上索引
dawugui 2008-12-02
  • 打赏
  • 举报
回复
我能说的只有三点.

1.将相关字段加上索引.
2.优化自己的查询.
3.提高你的硬件配置.

貌似没说.
加载更多回复(2)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧