请教BI高手优化SQl,效率问题,在线等,立马给分!!!!!!

chenkui2008 2010-06-30 02:41:39
SELECT DISTINCT PrI.ProcessInstanceID,ProcessInstanceCreater,ProcessName,LEFT(PrI.ProcessInstanceDesc,20) 
AS ProcessInstanceDesc,PrI.ProcessInstanceStatus,PrI.Deadline AS DeadLine,
ProcessInstanceInitialTime,
DelayType=CASE WHEN PrI.ASAPTime>GETDATE() THEN '0'
WHEN PrI.ASAPTime<=GETDATE() AND PrI.DueTime>GETDATE() THEN '1'
WHEN PrI.DueTime<=GETDATE() AND PrI.DeadLine>GETDATE() THEN '2'
WHEN PrI.DeadLine<=GETDATE() THEN '3' END,
DateDiff(ss,getdate(),PrI.deadline) AS RemainTime
FROM ProcessInstance PrI(nolock),Process P(nolock),ActivityInstance AI(nolock),Organization_User OU(nolock)
WHERE PrI.ProcessID=P.ProcessID AND PrI.Version=P.Version
AND PrI.ProcessInstanceID=AI.ProcessInstanceID AND AI.UserID=OU.UserID
--and exists (Select AI.OrganizationID From Organization(nolock) where Parentorganizationid=3)
AND OU.OrganizationID in (3,58,5,6,8,71)
AND AI.ActivityInstanceStatus!='C' AND AI.ActivityInstanceStatus!='T'
--问题是数据量大的时候因为distinct比较慢,有没有好的优化方案SQl


...全文
136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whb147 2010-07-01
  • 打赏
  • 举报
回复
告诉你一个检测办法
你把你的查询条件一个一个的注销掉,然后执行,
用来记录以下时间,看看那个条件非时间最多,就重点处理某一个
Me_online 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sharon_liu 的回复:]
小道消息说DISTINCT比全部GROUP BY 慢一点,但未验证。

在查询前定义一个时间参数=GETDATE(),然后代替语句中的GETDATE,不然每条记录都会调用一遍GETDATE函数。

最后是老生长谈,合适的索引合适的索引合适的索引合适的索引合适的索引合适的索引
[/Quote]
不错。我再加几个:
1)AND OU.OrganizationID in (3,58,5,6,8,71) 语句中使用跟索引相同的测序,如 in (3,5,6...)
2) AI.ActivityInstanceStatus!='C' AND AI.ActivityInstanceStatus!='T'
如果可能尽可能的不使用 != or <>, 假如 ActivityInstanceStatus 没有几个值的话
3)最重要的一个:使用 ANSI SQL 不要使用旧的JOIN 风格,WHERE 语句只用来过滤记录,如:FROM A INNER JOIN B ON A.Column1=B.Column1....
claro 2010-06-30
  • 打赏
  • 举报
回复
帮顶 。
Sharon_liu 2010-06-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaofeng_cheng 的回复:]

详细说明下:
用EXISTS替换DISTINCT:
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。例子:
(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DE……
[/Quote]
这属于改变语句含义了,需要先确认业务逻辑能否优化。
云中客 2010-06-30
  • 打赏
  • 举报
回复
用DISTINCT效率高不了,而且还有这么多的列

你可以把自己的意图描述下,看有没有其他的方法来实现
xiaofeng_cheng 2010-06-30
  • 打赏
  • 举报
回复
详细说明下:
用EXISTS替换DISTINCT:
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。例子:
(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO
(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

其中X的意思是:
因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段出来差,而某些情况下,select具体的字段出来性能可能比select 一个常量出来要差得多。


下面是我做的一个例子,与上面无关。
低效率:
select distinct hk036_id,hk036_lxmc from hk024,hk036 where hk024_ywllx=hk036_id
高效率:
select hk036_id,hk036_lxmc from hk036 t36 where exists (select 'X' from hk024 t24 where t24.hk024_ywllx=t36.hk036_id)
xiaofeng_cheng 2010-06-30
  • 打赏
  • 举报
回复
用EXISTS替换DISTINCT
you_tube 2010-06-30
  • 打赏
  • 举报
回复
DISTINCT 用其它方法代替,
Sharon_liu 2010-06-30
  • 打赏
  • 举报
回复
小道消息说DISTINCT比全部GROUP BY 慢一点,但未验证。

在查询前定义一个时间参数=GETDATE(),然后代替语句中的GETDATE,不然每条记录都会调用一遍GETDATE函数。

最后是老生长谈,合适的索引合适的索引合适的索引合适的索引合适的索引合适的索引
jaydom 2010-06-30
  • 打赏
  • 举报
回复
个人感觉该注意的地方,都注意了,其他的再怎么优化,就不懂了,帮顶
永生天地 2010-06-30
  • 打赏
  • 举报
回复
有点头晕,让楼下

594

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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