锁定老帖子 主题:低效的where 1=1
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-13
qchong 写道 ywlqi 写道 Das_flamen 写道 superyang 写道 抛出异常的爱 写道 StringBuffer buffer = new StringBuffer("select * from T where 1=1 "); for(Map.Enty e : map){ buffer .appand ("and "+ e.getKey()+" = '"+e.getValue()+"'"); } String hql = "select e.id,e.name,e.provice,e.city,e.total,date_format(e.addtime,'%Y-%m-%d'),a.name,date_format(e.sendtime,'%Y-%m-%d') from email e,admin a where e.add_admin_id=a.id"; if (!this.isNull(email_type)) { hql += " and e.name like '%" + email_type + "%'"; } if (!this.isNull(provice)) { hql += " and e.provice like '%" + provice + "%'"; } if (!this.isNull(city)) { hql += " and e.city like '%" + city + "%'"; } if (!this.isNull(name)) { hql += " and e.name like '%" + name + "%'"; } if (!this.isNull(add_admin_id)) { hql += " and e.adminByAddAdminId.id='" + add_admin_id + "'"; } if (!this.isNull(order_type)) { String arr[] = order_type.split("_"); hql += " order by e." + arr[0] + " " + arr[1]; hql += ",e.addtime desc"; } else { hql += " e.addtime desc"; } 这样写可不可以?? 为什么很多人用StringBuffer的..??? 你可以去试下,StringBuffer的效率不是String能比的,拼接的时候String多了严重影响性能。当然,如果就几条那也没什么,不过强烈推荐不要用String,不是个好习惯。 我记得有帖子说过jdk1.5以后对字符串相加做了优化,效率和StringBuffer一样了啊,我没做过实验,谁做过实验的来说两句 在编译的时候,确实会适时的将字符串拼接转成StringBuilder 对于生命周期跨越分支判断和循环体的String,编译器是无法编译优化。 |
|
返回顶楼 | |
发表时间:2010-07-13
maozj 写道 1. 插入10000000条数据到mytable
2. 比较: select * from mytable select * from mytable where 1=1 3. 看看执行时间 这根本就是个伪命题,大数据量实际怎么会这样抓取数据,要证明是否影响索引的时候,就应该加一个字段索引,然后如下对比测试: 比较: select * from mytable where index=1 select * from mytable where 1=1 and index=1 |
|
返回顶楼 | |
发表时间:2010-07-13
select max(hasIndex) from mytable
select max(hasIndex) from mytable where 1=1 |
|
返回顶楼 | |
发表时间:2010-07-13
Oracle 10.2.0.4
create table aaaaaaaa as select * from all_objects; create index AAAAAAAAAAAAA on AAAAAAAA (OBJECT_NAME); SELECT * FROM aaaaaaaa t WHERE t.object_name LIKE 'DBMS_STANDARD%' 执行计划: SELECT STATEMENT, GOAL = ALL_ROWS 3 2 256 TABLE ACCESS BY INDEX ROWID xxxxx AAAAAAAA 3 2 256 INDEX RANGE SCAN xxxxx AAAAAAAAAAAAA 2 2 SELECT * FROM aaaaaaaa t WHERE 1 = 1 AND t.object_name LIKE 'DBMS_STANDARD%' 执行计划: SELECT STATEMENT, GOAL = ALL_ROWS 3 2 256 TABLE ACCESS BY INDEX ROWID xxxxx AAAAAAAA 3 2 256 INDEX RANGE SCAN xxxxx AAAAAAAAAAAAA 2 2 完全没有影响! |
|
返回顶楼 | |
发表时间:2010-07-13
我觉得即使LZ说的是真的,问题也不应该是开发人员,这个职责应该是数据库开发商去处理
|
|
返回顶楼 | |
发表时间:2010-07-13
我们开发人员是用户,有这个where 1=1的需求也非常合理,呵呵
|
|
返回顶楼 | |
发表时间:2010-07-13
数据库的查询优化引擎会处理
|
|
返回顶楼 | |
发表时间:2010-07-13
oracle数据库倒是没有测试 过
|
|
返回顶楼 | |
发表时间:2010-07-13
不过 查询优化引擎会处理 只是理论 理论上应该要处理
|
|
返回顶楼 | |
发表时间:2010-07-13
随着各数据库版本的升级 问题会被解决
|
|
返回顶楼 | |