语句如下,应如何优化以获得更高的执行效率
谢谢
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
#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
CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE
请参见 全文索引,
#8
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
以前那个优化大师???
#16
1秒?
#17
学习 优化大师
这个要在你查询的where后面的查询条件上加上索引应该会好些
这个要在你查询的where后面的查询条件上加上索引应该会好些
#18
单从语句来看,没有可优化的地方。
#19
100万应该是主表吧,
CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59'
这个条件段内的数据不会是100万吧。如果这样的话1秒以内不会有问题。
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'
再加上一定的索引,会提高一写的速度
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
#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
CHARINDEX是函数,如果有索引还是会失效,呵呵,如果楼主真的用LIKE
请参见 全文索引,
#8
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
以前那个优化大师???
#16
1秒?
#17
学习 优化大师
这个要在你查询的where后面的查询条件上加上索引应该会好些
这个要在你查询的where后面的查询条件上加上索引应该会好些
#18
单从语句来看,没有可优化的地方。
#19
100万应该是主表吧,
CJRec_Sub_Month between '2009-11-1 0:00:01' and '2009-11-10 23:59:59'
这个条件段内的数据不会是100万吧。如果这样的话1秒以内不会有问题。
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'
再加上一定的索引,会提高一写的速度
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'
再加上一定的索引,会提高一写的速度