论坛首页 综合技术论坛

低效的where 1=1

浏览 41503 次
该帖已经被评为隐藏帖
作者 正文
   发表时间: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,编译器是无法编译优化。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-07-13  
select max(hasIndex) from mytable
select max(hasIndex) from mytable where 1=1
0 请登录后投票
   发表时间: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	
	




完全没有影响!
0 请登录后投票
   发表时间:2010-07-13  
我觉得即使LZ说的是真的,问题也不应该是开发人员,这个职责应该是数据库开发商去处理
0 请登录后投票
   发表时间:2010-07-13  
我们开发人员是用户,有这个where 1=1的需求也非常合理,呵呵
0 请登录后投票
   发表时间:2010-07-13  
数据库的查询优化引擎会处理
0 请登录后投票
   发表时间:2010-07-13  
oracle数据库倒是没有测试 过
0 请登录后投票
   发表时间:2010-07-13  
不过 查询优化引擎会处理 只是理论 理论上应该要处理
0 请登录后投票
   发表时间:2010-07-13  
随着各数据库版本的升级 问题会被解决
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics