select @mryj1=SUM(isnull(Amount,0)) from 表1
where EmplCode =any (select pmbase_zgbh from PMBASE where PMBASE_ZWLX='产品' AND DeptCode = ANY (select KCBMZD_YBMBH FROM KCBMZD))
and left(convert(varchar(10),RefFinDate,112),6)=@tjnf+@tjyf and (BillType='字段值2' or BillType='字段值3')
and ITEMCODE LIKE '%X' AND DeptCode=@ybmbh
select @mryj2= SUM(isnull(Amount,0)) from 表1
where EmplCode =any (select pmbase_zgbh from PMBASE where PMBASE_ZWLX='产品'AND DeptCode = ANY (select KCBMZD_YBMBH FROM KCBMZD))
and left(convert(varchar(10),RefFinDate,112),6)=@tjnf+@tjyf and (BillType='字段值5' or BillType='字段值6')
AND DeptCode=@ybmbh
--合计
set @mryj = isnull(@mryj1,0) + isnull(@mryj2,0)
...全文
57626打赏收藏
当数据量大的时候这段存储过程执行起来很慢,请问各位哪里需要改进一下
select @mryj1=SUM(isnull(Amount,0)) from 表1 where EmplCode =any (select pmbase_zgbh from PMBASE where PMBASE_ZWLX='产品' AND DeptCode = ANY (select KCBMZD_YBMBH FROM KCBMZD)) and left(convert(varchar(10),RefFinDate,112),6)=@tjnf+@tjyf and (BillType='字段
你真速度啊。你是怎么回复的这么快? 机器人么? 主要是对于sql来说欠缺很多,看到嵌套的sql都头疼。但是我也要恶补sql,推荐一本提高优化性能的书籍看看呗,不多,就一本就ok,多了看不完。[/quote]
我能说我看的是我们以前大版写的那本书么……》《SQL SERVER 性能优化与管理的艺术》[/quote]
大神呀,这一段用上之后速度没变快,反而变慢了几十秒。。。。我查了一下表1,发现表1有5000万条数据。。。。。[/quote]
好尴尬……
试试这个呢?
SELECT @mryj = SUM(ISNULL(Amount, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND ( ( ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X'
)
OR ( BillType = '字段值5'
OR BillType = '字段值6'
)
)
AND DeptCode = @ybmbh
你真速度啊。你是怎么回复的这么快? 机器人么? 主要是对于sql来说欠缺很多,看到嵌套的sql都头疼。但是我也要恶补sql,推荐一本提高优化性能的书籍看看呗,不多,就一本就ok,多了看不完。[/quote]
我能说我看的是我们以前大版写的那本书么……》《SQL SERVER 性能优化与管理的艺术》[/quote]
大神呀,这一段用上之后速度没变快,反而变慢了几十秒。。。。我查了一下表1,发现表1有5000万条数据。。。。。[/quote]
好尴尬……
试试这个呢?
SELECT @mryj = SUM(ISNULL(Amount, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND ( ( ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X'
)
OR ( BillType = '字段值5'
OR BillType = '字段值6'
)
)
AND DeptCode = @ybmbh
你真速度啊。你是怎么回复的这么快? 机器人么? 主要是对于sql来说欠缺很多,看到嵌套的sql都头疼。但是我也要恶补sql,推荐一本提高优化性能的书籍看看呗,不多,就一本就ok,多了看不完。[/quote]
我能说我看的是我们以前大版写的那本书么……》《SQL SERVER 性能优化与管理的艺术》[/quote]
大神呀,这一段用上之后速度没变快,反而变慢了几十秒。。。。我查了一下表1,发现表1有5000万条数据。。。。。[/quote]
好尴尬……
试试这个呢?
SELECT @mryj = SUM(ISNULL(Amount, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND ( ( ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X'
)
OR ( BillType = '字段值5'
OR BillType = '字段值6'
)
)
AND DeptCode = @ybmbh
你真速度啊。你是怎么回复的这么快? 机器人么? 主要是对于sql来说欠缺很多,看到嵌套的sql都头疼。但是我也要恶补sql,推荐一本提高优化性能的书籍看看呗,不多,就一本就ok,多了看不完。[/quote]
我能说我看的是我们以前大版写的那本书么……》《SQL SERVER 性能优化与管理的艺术》[/quote]
大神呀,这一段用上之后速度没变快,反而变慢了几十秒。。。。我查了一下表1,发现表1有5000万条数据。。。。。[/quote]
好尴尬……
试试这个呢?
SELECT @mryj = SUM(ISNULL(Amount, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND ( ( ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X'
)
OR ( BillType = '字段值5'
OR BillType = '字段值6'
)
)
AND DeptCode = @ybmbh
大神,我突然想到一个,是不是我优化的想法不对?这个存储过程,其实整体是一个循环,然后 循环里的begin下才是我贴出的代码,请问,我是不是该从循环这个问题上着重处理。而不是着重处理查询那?
declare MDYJJS cursor for select KCBMZD_BMBH,KCBMZD_BMMC,KCBMZD_YBMBH FROM KCBMZD WHERE KCBMZD_SFMD='1' AND KCBMZD_SFFC='0' ORDER BY KCBMZD_BMBH
open MDYJJS
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
while @@fetch_status=0
begin
//一楼贴出的代码在此处
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
end
close MDYJJS
deallocate MDYJJS[/quote]
我勒个去……当然是了,如果能不循环,肯定不通过循环一条一条的去获取数据……
大神,我突然想到一个,是不是我优化的想法不对?这个存储过程,其实整体是一个循环,然后 循环里的begin下才是我贴出的代码,请问,我是不是该从循环这个问题上着重处理。而不是着重处理查询那?
declare MDYJJS cursor for select KCBMZD_BMBH,KCBMZD_BMMC,KCBMZD_YBMBH FROM KCBMZD WHERE KCBMZD_SFMD='1' AND KCBMZD_SFFC='0' ORDER BY KCBMZD_BMBH
open MDYJJS
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
while @@fetch_status=0
begin
//一楼贴出的代码在此处
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
end
close MDYJJS
deallocate MDYJJS
不能这么说, 你试下去掉下图的那个like也不能快一点:
[/quote]
和我想的一样,不知道楼主有没有建索引。
如果有索引的话, ITEMCODE LIKE '%X' 不会走索引了[/quote]
有索引的,他表里自带两个索引,之前写这个存储过程的人,再这查询里也用到这索引了。我突然想到,是不是我优化的方式不对,这个存储过程,其实整体是一个循环,然后 循环里的begin下才是我贴出的代码,请问,我是不是该从循环这个问题上着重处理。而不是着重处理查询那?
declare MDYJJS cursor for select KCBMZD_BMBH,KCBMZD_BMMC,KCBMZD_YBMBH FROM KCBMZD WHERE KCBMZD_SFMD='1' AND KCBMZD_SFFC='0' ORDER BY KCBMZD_BMBH
open MDYJJS
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
while @@fetch_status=0
begin
//一楼贴出的代码在此处
fetch MDYJJS into @BMBH,@BMMC,@YBMBH
end
close MDYJJS
deallocate MDYJJS
SELECT @mryj = SUM(ISNULL(CASE WHEN ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X' THEN Amount
ELSE 0
END, 0))
+ SUM(ISNULL(CASE WHEN ( BillType = '字段值5'
OR BillType = '字段值6'
) THEN Amount
ELSE 0
END, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND DeptCode = @ybmbh
你真速度啊。你是怎么回复的这么快? 机器人么? 主要是对于sql来说欠缺很多,看到嵌套的sql都头疼。但是我也要恶补sql,推荐一本提高优化性能的书籍看看呗,不多,就一本就ok,多了看不完。[/quote]
我能说我看的是我们以前大版写的那本书么……》《SQL SERVER 性能优化与管理的艺术》[/quote]
大神呀,这一段用上之后速度没变快,反而变慢了几十秒。。。。我查了一下表1,发现表1有5000万条数据。。。。。[/quote]
好尴尬……
试试这个呢?
SELECT @mryj = SUM(ISNULL(Amount, 0))
FROM 表1
WHERE EmplCode =ANY ( SELECT pmbase_zgbh
FROM PMBASE
WHERE PMBASE_ZWLX = '产品'
AND DeptCode = ANY ( SELECT KCBMZD_YBMBH
FROM KCBMZD ) )
AND LEFT(CONVERT(VARCHAR(10), RefFinDate, 112), 6) = @tjnf + @tjyf
AND ( ( ( BillType = '字段值2'
OR BillType = '字段值3'
)
AND ITEMCODE LIKE '%X'
)
OR ( BillType = '字段值5'
OR BillType = '字段值6'
)
)
AND DeptCode = @ybmbh