zoukankan      html  css  js  c++  java
  • 去掉影响效率的where 1=1

    最近看了篇文章,觉得挺有道理。实际项目中,我们进行sql条件过滤,我们不能确定是不是有条件。也不能确定条件的个数。大多数人会先把sql语句组装为:

    SELECT* FROM T_table WHERE 1=1

    这样,如果有其他过滤条件直接加上“and 其他条件”,如果没有的话,where 1=1也不影响查询结果。这样很可能会造成非常大的性能损失,因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描 来比较此行是否满足过滤条件, 当表中数据量比较大的时候查询速度会非常慢。 因此如果数据检索对性能有比较高的要求就不要使用这种方式。下面是参考别人一种参考实现,伪代码如下:

    private void doQuery() 
    { 
      Bool hasWhere = false; 
      StringBuilder  sql  =  new  StringBuilder("  SELECT  *  FROM  T_Employee"); 
      if(条件1是否添加) 
      { 
        hasWhere = appendWhereIfNeed(sql, hasWhere); 
        sql.appendLine("FNumber BETWEEN '"+文本框1内容+"' AND '"+文本框2内容+"'"); 
      } 
      if(条件2是否添加) 
      { 
        hasWhere = appendWhereIfNeed(sql, hasWhere); 
        sql.appendLine("FName LIKE '%"+条件文本框内容+"%'"); 
      } 
      if(条件3是否添加) 
      { 
        hasWhere = appendWhereIfNeed(sql, hasWhere); 
        sql.appendLine("FAge BETWEEN "+条件3内容1+" AND "+条件3内容2); 
      } 
      executeSQL(sql); 
    } 
    private Bool appendWhereIfNeed(StringBuilder sql,Bool hasWhere) 
    { 
      if(hasWhere==false) 
      { 
        sql. appendLine("WHERE"); 
      } 
      else 
      { 
        sql. appendLine("AND"); 
      } 
      return true;
    } 
  • 相关阅读:
    如何运行 PPAS上的pgpoolII
    Postmaster主循环的大致流程
    对ListenSocket 的研究(三)
    对ListenSocket 的研究(二)
    对ListenSocket 的研究(五)
    PostgreSQL的postmaser的fork的学习体会
    赛门铁克公告:解密Kneber恶意软件 狼人:
    微软免费杀毒软件MSE最新版本释出 狼人:
    Facebook出现邮件错发故障 隐私安全再受关注 狼人:
    McAfee和Brocade将联合开发网络安全解决方案 狼人:
  • 原文地址:https://www.cnblogs.com/shizhongtao/p/3512134.html
Copyright © 2011-2022 走看看