帮忙看下这个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
...全文
268 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,582

社区成员

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

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