论坛首页 综合技术论坛

低效的where 1=1

浏览 41500 次
该帖已经被评为隐藏帖
作者 正文
   发表时间: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 * 吗?
0 请登录后投票
   发表时间: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的写法应该不会影响效率
0 请登录后投票
   发表时间: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一样了啊,我没做过实验,谁做过实验的来说两句
0 请登录后投票
   发表时间:2010-07-12  
。。。。。。。。。。。。where 1=1 会做优化吗?就单纯这个条件?
0 请登录后投票
   发表时间:2010-07-12  
无语了....
0 请登录后投票
   发表时间:2010-07-12  
应该对效率没多大的影响
0 请登录后投票
   发表时间:2010-07-12  
看了LZ给的图,发现是MS SQL Server,而且是2000...
又是一个不能用sql2000的理由,
0 请登录后投票
   发表时间:2010-07-12  
这么简单的问题居然争论这么多
0 请登录后投票
   发表时间:2010-07-12  
通用查询SQL几乎全是这么干的。。。
0 请登录后投票
   发表时间:2010-07-13  
JE帐号 写道
看了LZ给的图,发现是MS SQL Server,而且是2000...
又是一个不能用sql2000的理由,

+1, MySQL下应该没有差别

lz可以看看select * from table where 1 != 1的速度,如果sql2000真的如此之傻,回去扫描...

2005好像优化的
0 请登录后投票
论坛首页 综合技术版

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