锁定老帖子 主题:低效的where 1=1
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-12
maoone2003 写道 select * from table where 1=1因为table中根本就没有名称为1的字段,所以该SQL等效于select * from table,这个SQL语句很明显是全表扫描,需要大量的IO操作,数据量越大越慢,建议查询时增加必输项,即where 1=1后面追加一些常用的必选条件,并且将这些必选条件建立适当的索引,效率会大大提高
PS:这不是SQL写法的问题,也不是数据库的问题,是自己程序逻辑的问题 select * from table where 1=0 呢 ? 也等效于select * 吗? |
|
返回顶楼 | |
发表时间:2010-07-12
在公司DB上做了一个例子,sybase系统,打出了query plan
select count(*) from order_header 231835 rows ============================================================= select * from order_header QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT. FROM TABLE order_header Nested iteration. Table Scan. Forward scan. Positioning at start of table. Using I/O Size 32 Kbytes for data pages. With MRU Buffer Replacement Strategy for data pages. Server Message: Number 3630, Severity 10 Server 'DEVELOP', Line 1: Total estimated I/O cost for statement 1 (at line 1): 178628. Parse and Compile Time 0. SQL Server cpu time: 0 ms. Execution Time 0. SQL Server cpu time: 0 ms. SQL Server elapsed time: 0 ms. ============================================================= select * from order_header where 1=1 QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT. FROM TABLE order_header Nested iteration. Table Scan. Forward scan. Positioning at start of table. Using I/O Size 32 Kbytes for data pages. With MRU Buffer Replacement Strategy for data pages. Server Message: Number 3630, Severity 10 Server 'DEVELOP', Line 1: Total estimated I/O cost for statement 1 (at line 1): 178628. Parse and Compile Time 0. SQL Server cpu time: 0 ms. Execution Time 0. SQL Server cpu time: 0 ms. SQL Server elapsed time: 0 ms. 结论:1.两种情况都是table scan 2.两种情况IO一样 3.1=1的写法应该不会影响效率 |
|
返回顶楼 | |
发表时间:2010-07-12
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一样了啊,我没做过实验,谁做过实验的来说两句 |
|
返回顶楼 | |
发表时间:2010-07-12
。。。。。。。。。。。。where 1=1 会做优化吗?就单纯这个条件?
|
|
返回顶楼 | |
发表时间:2010-07-12
无语了....
|
|
返回顶楼 | |
发表时间:2010-07-12
应该对效率没多大的影响
|
|
返回顶楼 | |
发表时间:2010-07-12
看了LZ给的图,发现是MS SQL Server,而且是2000...
又是一个不能用sql2000的理由, |
|
返回顶楼 | |
发表时间:2010-07-12
这么简单的问题居然争论这么多
|
|
返回顶楼 | |
发表时间:2010-07-12
通用查询SQL几乎全是这么干的。。。
|
|
返回顶楼 | |
发表时间:2010-07-13
JE帐号 写道 看了LZ给的图,发现是MS SQL Server,而且是2000...
又是一个不能用sql2000的理由, +1, MySQL下应该没有差别 lz可以看看select * from table where 1 != 1的速度,如果sql2000真的如此之傻,回去扫描... 2005好像优化的 |
|
返回顶楼 | |