sql语句中选取限制字段的不同可能会对运行效率产生质的影响
2010-07-24 20:07
239 查看
做项目遇到的一个问题,稀奇古怪的!发来分享下!
先看下一条sql语句:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t1.corpcode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
其中表1、表2的数据量时相当可观的:分别拥有100000+的数据
注意上面的那条语句:其中有t.encode=t1.corpcode,并且对表2进行了t1.corpcode like '%134754932%'限制,对表1进行了t.recsts='4'限制,其实这里对表2的限制可以改为对表1的限制,因为t.encode=t1.corpcode,但人有时就是有点固定思维,没那么做,以为这样的改动不会影响什么,其实我们这种思维就是错的!
问题出现了:这条语句在数据库中运行不出来结果,出现类死锁现象!
但当我将t1.corpcode like '%134754932%'改为t.encode like '%134754932%',这样很快就能运行出结果。
如下正确写法:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t.encode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
虽然这两条语句表达的意思是一样的,但运行时间是质的差别,上条语句没能在我能忍受的时间内查出来(超过5分钟!!!)!而第二条只需几十秒。
怀疑原因:限制条件只对一张表操作,操作好后的结果,再与另一张表关联,此时只有关联操作而没有了限制操作,所以对于大数据量的表,运行时间就有质的不同!(这只是本人的个人认为,我也不是研究数据库的,不是太了解内部运行机制!)
注意:不是说这里不可以同时对两张表进行限制,万一用户的需求就是那么定的,我们必须对两张表都进行一定的限制的时候,我们就别无办法了。但我们在选择限制的时候,特别是对那些对两张表相等关联的字段,同时又要对这些字段进行像上面语句那样的like限制时,我们就得考虑清楚了,是否给数据操作添加了复杂度了!换个字段试试,或许效果就不一样了!
望给遇到类似问题的兄弟们,有所帮助!
先看下一条sql语句:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t1.corpcode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
其中表1、表2的数据量时相当可观的:分别拥有100000+的数据
注意上面的那条语句:其中有t.encode=t1.corpcode,并且对表2进行了t1.corpcode like '%134754932%'限制,对表1进行了t.recsts='4'限制,其实这里对表2的限制可以改为对表1的限制,因为t.encode=t1.corpcode,但人有时就是有点固定思维,没那么做,以为这样的改动不会影响什么,其实我们这种思维就是错的!
问题出现了:这条语句在数据库中运行不出来结果,出现类死锁现象!
但当我将t1.corpcode like '%134754932%'改为t.encode like '%134754932%',这样很快就能运行出结果。
如下正确写法:
select t1.safecode,t1.corpcode,t1.corpname,sum(t.zxamtusd)
from 表1 as t,表2 as t1 where t1.safecode like '32%' and t.encode like '%134754932%' and t.encode=t1.corpcode and t.recsts='4'
group by t1.safecode,t1.corpcode,t1.corpname
虽然这两条语句表达的意思是一样的,但运行时间是质的差别,上条语句没能在我能忍受的时间内查出来(超过5分钟!!!)!而第二条只需几十秒。
怀疑原因:限制条件只对一张表操作,操作好后的结果,再与另一张表关联,此时只有关联操作而没有了限制操作,所以对于大数据量的表,运行时间就有质的不同!(这只是本人的个人认为,我也不是研究数据库的,不是太了解内部运行机制!)
注意:不是说这里不可以同时对两张表进行限制,万一用户的需求就是那么定的,我们必须对两张表都进行一定的限制的时候,我们就别无办法了。但我们在选择限制的时候,特别是对那些对两张表相等关联的字段,同时又要对这些字段进行像上面语句那样的like限制时,我们就得考虑清楚了,是否给数据操作添加了复杂度了!换个字段试试,或许效果就不一样了!
望给遇到类似问题的兄弟们,有所帮助!
相关文章推荐
- 统计某一字段等于不同值的个数的sql语句
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
- mysql过滤两个不同字段的sql语句
- 用不同的SQL语句查出多个结果存入一个数据集的同一个字段的代码例子
- sql语句中的数字不需要用引号,会影响效率
- 准确的SQL语句运行时间(效率)检测办法
- 查询某个字段不同值各自最新的一条数据记录SQL语句
- 当执行SQL(ORACLE)时判段另一个字段的值去执行不同SQL,及 CASE WHEN 语句的使用
- sql语句——不同的表根据相同的字段值将两个表指定的字段合并为一个表
- 如果在一个SQL语句中有两个来自不同表的字段,有相同的字段名怎么办?
- 不同数据库sql查询表字段以及结构的语句
- 【数据库】同一字段根据不同条件更新的sql语句的写法
- 关于不同sql语句执行效率的问题
- 统计某一字段等于不同值的个数的sql语句(分享)
- 同一字段根据不同条件更新的sql语句的写法
- sql语句 一个表 用户产生两条不同类型的数据 拼接成一条数据
- oracle DDLsql语句字段效率&索引
- sql语句简单解决同个字段不同标识的具体意义
- 优化oracle中的sql语句,提高运行效率
- SQL语句增加虚拟字段,并根据情况显示不同的数据。。。(已阅。。。未阅。。)