php mssql 分页SQL语句优化 持续影响

经过SQL优化后的分面查询速度能够得到大幅提高。

 

<?php
/**
 * @Filename :page.sql.class.php
 * @CreatTime :2009-01-06
 * @Descrition :此类为SQL语句处理类。
 * @UpdateTime-1 :null
 * @Version  :jswweb1.0.0
 * @Author  :fkedwgwy
 * @Dome :


     $sql//SQL语句

     $allcount//总记录数
     $pagesize//页面显示记录条数

     $page//当前页

 

      $sqlc= new sqlpage($sql,$allcount,$pagesize,$page);
      $sql=$sqlc->getsql();

优化后的语句:

 

SELECT * FROM (SELECT TOP 10 * FROM (SELECT TOP 270 Lsh,Ztm,Dyzrsm,Dyzzfs,Cbsm,Cbny,Ssh,Fbsl,jcsl from ts_gcb where Ssh like 'C%' order by Lsh asc) AS inner_tbl ORDER BY Lsh DESC) AS outer_tbl ORDER BY Lsh asc

 

 */
class sqlpage{

              function sqlpage($sql,$allcount,$pagesize,$page){
             
                        $this->sql= $sql;//查询语名
                       
                        $this->allcount= intval($allcount);//总记录数
                       
                        $this->pagesize= intval($pagesize);//页面大小(显示记录数)
                       
                        $this->page= intval($page);//当前页
                       
                        $this->getpage();
                       
                        $this->gettop();

              }
              function getpage(){   //获取当前页
             
                                     $this->allpage=ceil( $this->allcount/$this->pagesize);//去当前小数的最大整数
    
                                   if ($this->page=="" or $this->page>$this->allpage or $this->page<0 or $this->page==0){
                                  
                                          $this->page2=1;
                                         
                                   }else{
                                  
                                          $this->page2=intval($this->page);//将页码转换为数字
                                         
                                   }
             
             
              }
              function gettop(){ //获取子查询2的TOP大小
             
                                 if ($this->page2<$this->allpage){
                                 
                                      $this->top2=$this->pagesize;
                                     
                                 }else{
                                 
                                      $this->top2=$this->allcount-$this->pagesize*($this->allpage-1);
                                     
                                 }
             
             
             
              }
             /* function getsql(){//获取SQL语句
             
                                  $this->s=preg_replace("/select/i","",$this->sql);
                                 
                                  $this->top1=$this->pagesize*$this->page2;
                                 
                                  $this->sql1="SELECT TOP $this->top1 $this->s";
                                 
                                  if (strpos($this->sql,"asc")){//升序
                                 
                                             $this->sql_e="select * from (   select TOP $this->top2 * FROM ( $this->sql1 ) as aSysTable   ORDER BY $this->order DESC ) as bSysTable   ORDER BY $this->order ASC";
                                             
                                  }else
                                 
                                  //$this->sql_e="select * from (   select TOP $this->top2 * FROM ( $this->sql1 ) as aSysTable   ORDER BY $this->order DESC ) as bSysTable   ORDER BY $this->order ASC";
                                 
                                  if (strpos($this->sql,"desc")){//降序
                                 
                                              $this->sql_e="select * from (   select TOP $this->top2 * FROM ( $this->sql1 ) as aSysTable   ORDER BY $this->order asc ) as bSysTable   ORDER BY $this->order desc";
                                             
                                  }else{//不处理排序的情况
                                 
                                              $this->sql_e="select * from (   select TOP $this->top2 * FROM ( $this->sql1 ) as aSysTable   ORDER BY $this->order DESC ) as bSysTable   ORDER BY $this->order ASC";
                                 
                                  }
                                 // echo $this->sql_e;
                                  return $this->sql_e;
                                 
                    }*/




  function getsql()
     {
     
        $sql=$this->sql;

        $this->top1=$this->pagesize*$this->page2;


        $orderby = stristr($sql, 'ORDER BY');
        if ($orderby !== false) {
            $sort = (stripos($orderby, ' desc') !== false) ? 'desc' : 'asc';
            $order = str_ireplace('ORDER BY', '', $orderby);
            $order = trim(preg_replace('//bASC/b|/bDESC/b/i', '', $order));
        }

        $sql = preg_replace('/^SELECT/s/i', 'SELECT TOP ' . ($this->top1) . ' ', $sql);

        $sql = 'SELECT * FROM (SELECT TOP ' . $this->top2 . ' * FROM (' . $sql . ') AS inner_tbl';
        if ($orderby !== false) {
            $sql .= ' ORDER BY ' . $order . ' ';
            $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC';
        }
        $sql .= ') AS outer_tbl';
        if ($orderby !== false) {
            $sql .= ' ORDER BY ' . $order . ' ' . $sort;
        }
           echo $sql;
        return $sql;
       
       
    }












}
?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值