SQL语句 Sum 效率的问题(有100万条数据),应如何优化以获得更高的执行效率

时间:2022-11-23 14:46:18
SQL语句 Sum 效率的问题(有100万条数据)
语句如下,应如何优化以获得更高的执行效率
谢谢

select sum(CJRec_Sub_Receive_SL) AS RSL from CJRec_Sub where CJRec_Sub_WL_BM like '30041'
  and CJRec_Sub_CBZX_R like 'C11902'
   and CJRec_Sub_IS_OK=1 and CJRec_Sub_Type like 'I'
    and (CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59')

22 个解决方案

#1


好像原来剪刀哥有说过like 和charindex 的效率问题

#2


像你这个like 后面, '30041'    'I'

没加%,用了等于没用啊

#3


该回复于2010-07-28 09:27:17被版主删除

#4


select 
        sum(CJRec_Sub_Receive_SL) AS RSL 
from 
      CJRec_Sub 
where 
  CJRec_Sub_WL_BM ='30041' 
  and CJRec_Sub_CBZX_R ='C11902' 
  and CJRec_Sub_IS_OK=1 
  and CJRec_Sub_Type ='I' 
  and CJRec_Sub_Month >='2009-11-1' AND CJRec_Sub_Month<'2009-11-11'

在各条件上加索引

#5


如果那LIKE没有%转成=如果有是后面有'GFS%'请加索引,如果两者有那加索引也没用

#6


select sum(CJRec_Sub_Receive_SL) AS RSL 
from CJRec_Sub 
where charindex('30041',CJRec_Sub_WL_BM)>0
  and  charindex('C11902',CJRec_Sub_CBZX_R)>0
  and CJRec_Sub_IS_OK=1 
  and charindex('I',CJRec_Sub_Type)>0 
  and 
  CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59'

#7


引用 6 楼 ws_hgo 的回复:
SQL codeselectsum(CJRec_Sub_Receive_SL)AS RSLfrom CJRec_Subwherecharindex('30041',CJRec_Sub_WL_BM)>0andcharindex('C11902',CJRec_Sub_CBZX_R)>0and CJRec_Sub_IS_OK=1andcharindex('I',CJRec_Sub_Type)>0and ?-

CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE 


请参见 全文索引,

#8


引用 7 楼 sql77 的回复:
引用 6 楼 ws_hgo 的回复:
SQL codeselectsum(CJRec_Sub_Receive_SL)AS RSLfrom CJRec_Subwherecharindex('30041',CJRec_Sub_WL_BM)>0andcharindex('C11902',CJRec_Sub_CBZX_R)>0and CJRec_Sub_IS_OK=1andcharindex('I',CJRec_Sub_Type)>0and ?-

CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE


请参见全文索引,

en

#9


SQL77正解

#10


select
 sum(CJRec_Sub_Receive_SL) AS RSL 
from
 CJRec_Sub where CJRec_Sub_WL_BM like '30041' 
and
 CJRec_Sub_CBZX_R like 'C11902' 
and
 CJRec_Sub_IS_OK=1 and CJRec_Sub_Type like 'I' 
and
 (CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59')


--------CJRec_Sub_WL_BM 、CJRec_Sub_CBZX_R、CJRec_Sub_IS_OK、CJRec_Sub_Type 字段 都可以根据需求加索引

#11


如果是like '30041%'可以加索引  like '%30041'索引有可能失效

一般来说索引都是加在连接字段

具体的楼主自己去参考下索引的使用

#12


有偿支持

#13


like里无通配符,和等号一样。

#14


解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197 

#15


引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197

以前那个优化大师???

#16


引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197
1秒?

#17


学习 优化大师
引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197


这个要在你查询的where后面的查询条件上加上索引应该会好些

#18


单从语句来看,没有可优化的地方。

#19


100万应该是主表吧,
 CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59' 
这个条件段内的数据不会是100万吧。如果这样的话1秒以内不会有问题。

#20


所以说语句上没什么可优话的地方,如果date是聚集索引,就很好办了。

#21


哈哈,用like的话,有索引也是无效的,好好看看你的条件,把结果集最小的条件放在前面,由于没有数据,所以不知道你的条件中那个是限制性最强的,。。。。

#22


select sum(CJRec_Sub_Receive_SL) AS RSL from   CJRec_Sub where 
  CJRec_Sub_WL_BM ='30041' 
  and CJRec_Sub_CBZX_R ='C11902' 
  and CJRec_Sub_IS_OK=1 
  and CJRec_Sub_Type ='I' 
  and CJRec_Sub_Month between '2009-11-1' AND '2009-11-11'
  
再加上一定的索引,会提高一写的速度

#1


好像原来剪刀哥有说过like 和charindex 的效率问题

#2


像你这个like 后面, '30041'    'I'

没加%,用了等于没用啊

#3


该回复于2010-07-28 09:27:17被版主删除

#4


select 
        sum(CJRec_Sub_Receive_SL) AS RSL 
from 
      CJRec_Sub 
where 
  CJRec_Sub_WL_BM ='30041' 
  and CJRec_Sub_CBZX_R ='C11902' 
  and CJRec_Sub_IS_OK=1 
  and CJRec_Sub_Type ='I' 
  and CJRec_Sub_Month >='2009-11-1' AND CJRec_Sub_Month<'2009-11-11'

在各条件上加索引

#5


如果那LIKE没有%转成=如果有是后面有'GFS%'请加索引,如果两者有那加索引也没用

#6


select sum(CJRec_Sub_Receive_SL) AS RSL 
from CJRec_Sub 
where charindex('30041',CJRec_Sub_WL_BM)>0
  and  charindex('C11902',CJRec_Sub_CBZX_R)>0
  and CJRec_Sub_IS_OK=1 
  and charindex('I',CJRec_Sub_Type)>0 
  and 
  CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59'

#7


引用 6 楼 ws_hgo 的回复:
SQL codeselectsum(CJRec_Sub_Receive_SL)AS RSLfrom CJRec_Subwherecharindex('30041',CJRec_Sub_WL_BM)>0andcharindex('C11902',CJRec_Sub_CBZX_R)>0and CJRec_Sub_IS_OK=1andcharindex('I',CJRec_Sub_Type)>0and ?-

CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE 


请参见 全文索引,

#8


引用 7 楼 sql77 的回复:
引用 6 楼 ws_hgo 的回复:
SQL codeselectsum(CJRec_Sub_Receive_SL)AS RSLfrom CJRec_Subwherecharindex('30041',CJRec_Sub_WL_BM)>0andcharindex('C11902',CJRec_Sub_CBZX_R)>0and CJRec_Sub_IS_OK=1andcharindex('I',CJRec_Sub_Type)>0and ?-

CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE


请参见全文索引,

en

#9


SQL77正解

#10


select
 sum(CJRec_Sub_Receive_SL) AS RSL 
from
 CJRec_Sub where CJRec_Sub_WL_BM like '30041' 
and
 CJRec_Sub_CBZX_R like 'C11902' 
and
 CJRec_Sub_IS_OK=1 and CJRec_Sub_Type like 'I' 
and
 (CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59')


--------CJRec_Sub_WL_BM 、CJRec_Sub_CBZX_R、CJRec_Sub_IS_OK、CJRec_Sub_Type 字段 都可以根据需求加索引

#11


如果是like '30041%'可以加索引  like '%30041'索引有可能失效

一般来说索引都是加在连接字段

具体的楼主自己去参考下索引的使用

#12


有偿支持

#13


like里无通配符,和等号一样。

#14


解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197 

#15


引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197

以前那个优化大师???

#16


引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197
1秒?

#17


学习 优化大师
引用 14 楼 hyqok 的回复:
解决了吗?如果没有解决的话联系我吧。1秒以内可以完成 qq 56616197


这个要在你查询的where后面的查询条件上加上索引应该会好些

#18


单从语句来看,没有可优化的地方。

#19


100万应该是主表吧,
 CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59' 
这个条件段内的数据不会是100万吧。如果这样的话1秒以内不会有问题。

#20


所以说语句上没什么可优话的地方,如果date是聚集索引,就很好办了。

#21


哈哈,用like的话,有索引也是无效的,好好看看你的条件,把结果集最小的条件放在前面,由于没有数据,所以不知道你的条件中那个是限制性最强的,。。。。

#22


select sum(CJRec_Sub_Receive_SL) AS RSL from   CJRec_Sub where 
  CJRec_Sub_WL_BM ='30041' 
  and CJRec_Sub_CBZX_R ='C11902' 
  and CJRec_Sub_IS_OK=1 
  and CJRec_Sub_Type ='I' 
  and CJRec_Sub_Month between '2009-11-1' AND '2009-11-11'
  
再加上一定的索引,会提高一写的速度