好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQL2008使用CTE递归查询批量插入500万数据

SQL2008使用CTE递归查询批量插入500万数据

SQL2008使用CTE递归查询批量插入500万数据

一直都使用一般的批量循环插入方法 ,可这效率也太慢了,插入500万条数据执行所需的时间远远超过10分钟。于是度娘了一下 发现可以使用CTE进行递归循环插入

以下是亲测的数据:

1、创建表:

 CREATE   TABLE  Customers (CustomerID  INT   primary   key   identity ( 1 , 1  ),  
CustomerNumber   CHAR ( 4  ),  
CustomerName   VARCHAR ( 50  ),  
CustomerCity   VARCHAR ( 20  ))  
  GO   

2、使用一般批量循环处理

 /*  使用一般的批量循环插入  */ 
 declare   @maxSum   int  ,
          @customernum   nvarchar ( 50  ),
          @customername   nvarchar ( 50  ),
          @city   nvarchar ( 50  ),
          @paytime   datetime 
 set   @maxSum  =  1 
 set   @customernum  =  '  0000  ' 
 set   @customername  =  '  Customer 0  ' 
 set   @city  =  '  X-City  ' 
 while   @maxSum  <  5000000    /*  一般方法循环插入500万条数据 10分钟以上  */ 
 begin 
    insert   into   Customers (CustomerNumber,CustomerName,CustomerCity) 
                   values ( @customernum , @customername , @city  )
     set   @maxSum  =  @maxSum  +  1 
 end 
 select   [  500万数据量插入完毕,共花费时间(毫秒)  ]  =  datediff (ms, @paytime , getdate ())  

结果:(10分钟已过 还没添加完毕...) 

3、使用CTE方法

 /*  使用CTE递归循环插入 运用CTE递归插入,速度较快  */   
 TRUNCATE   table   Customers  
  GO  
 DBCC   DROPCLEANBUFFERS  
  DBCC   FREEPROCCACHE  
  
  SET   STATISTICS  IO  ON  ;  
  SET   STATISTICS  TIME  ON  ;  
  GO   
  
 DECLARE   @d   Datetime   
 SET   @d  =  getdate  ();  
  
  WITH  Seq (num,CustomerNumber, CustomerName, CustomerCity)  AS    
(  SELECT   1 , '  0000  ' , '  Customer 0  ' , cast ( '  X-City  '   as   NVARCHAR ( 20  ))  
  UNION   ALL   
 SELECT  num  +   1 , '  0000  ' , '  Customer 0  '  ,  
  cast ( CHAR ( 65   +  (num  %   26 ))  +   '  -City  '   AS   NVARCHAR ( 20  ))  
  FROM   Seq  
  WHERE  num  <=   5000000    /*  CTE批量递归500万数据量 用时一般大概3分钟 因个人电脑而已  */  
)  
  INSERT   INTO   Customers (CustomerNumber, CustomerName, CustomerCity)  
  SELECT   CustomerNumber, CustomerName, CustomerCity  
  FROM   Seq  
  OPTION  (MAXRECURSION  0  )  
  
  select   [  500万数据量插入完毕,共花费时间(毫秒)  ]  =  datediff (ms, @d , getdate  ())  
  
  SET   STATISTICS  IO  OFF   ;  
  SET   STATISTICS  TIME  OFF  ;  
  GO   

结果:(185秒 约3分钟左右)

网上也查了一下 说:CTE其实是面向对象的,运行的基础是CLR。看来递归  CTE  可以极大地简化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句中运行递归查询所需的代码。

小记一下 回去再研究研究 下班!

 

 

分类:  Asp.net

自己动手写个小框架之五

     上一篇提到smarty的封装,这篇将介绍 控制类对其封装 的调用。控制类中有多个action函数,每个函数可以对应不同的页面,一个函数中可能根据业务逻辑对应多个页面,对页面数据的绑定也同时在action函数中绑定。我们看看defaultController.php

  1  <? php
   2  
  3   class  defaultController  extends   Controller {
   4  
  5       public   function  indexAction( $parameter  ) {
   6           $request  =  new   request();
   7           //  给session赋值 
  8           $request ->set("luf&d", "luf&d" );
   9           $this ->render('default.tpl',  array ("value" =>  $parameter [0],
 10              "Name" => "index Action page",
 11              "FirstName" =>  array ("John", "Mary", "James", "Henry"),
 12              "LastName" =>  array ("Doe", "Smith", "Johnson", "Case"),
 13              "contacts" =>  array ( array ("phone" => "1", "fax" => "2", "cell" => "3"),
 14                   array ("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234" ))));
  15       }
  16  
 17       public   function  newAction( $parameter  ) {
  18           $this ->render('default1.tpl',  array ("value" =>  $parameter [0],
 19              "Name" => "new Action page" ));
  20       }
  21  
 22       public   function  argsAction( $parameter  ) {
  23           $this ->render('default1.tpl',  array ("value" =>  $parameter [0] .  $parameter [1],
 24              "Name" => "new Action page" ));
  25       }
  26  
 27       public   function  requestAction( $parameter  =  NULL  ) {
  28           $request  =  new   request();
  29           //  获取"luf&d"的值 
 30           $getinfo  =  $request ->get("luf&d" );
  31           $this ->render('default1.tpl',  array ("value" =>  $getinfo ,
 32              "Name" => "index Action page",
 33              "FirstName" =>  array ("John", "Mary", "James", "Henry"),
 34              "LastName" =>  array ("Doe", "Smith", "Johnson", "Case"),
 35              "contacts" =>  array ( array ("phone" => "1", "fax" => "2", "cell" => "3"),
 36                   array ("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234" ))));
  37       }
  38  
 39   }
  40  
 41  ?>

该类继承Controller类,可以操作父类的Tpl对象来调用smarty的封装方法render,从而触发smarty模板机制。例如indexAction函数

public function indexAction($parameter) 函数

给default.tpl模板赋值:value,Name,FirstName,LastName,contacts。接着,我们看看default.tpl,里面用到smarty官方的例子

tpl模板文件在tpls/templates/ 里

       在tpl文件中“<{”与“}>”成对出现,是我们封装smarty时,设置的模板标签起始和结束标志。在标记中根据前端展现需要编写页面逻辑即可。这里显示了赋值显示及一些smarty的内置函数,如显示当前系统时间、获取当前脚本、获取服务器、字符串全大写等;还有标签条件逻辑语法和循环逻辑语法的使用。

<{config_load  file ="test.conf" section="setup"}>
<{ include   file ="header.tpl" title=foo}>
<PRE> 
( *^__^*)<{ $value }>

<{* bold and title are read from the config  file  *}>
<{ if   #  bold#}><b><{/if}> 
<{* capitalize the first letters of  each  word of the title *}> 
Title : <{ #  title#|capitalize}> 
<{ if   #  bold#}></b><{/if}> 
 


The   current   date  and  time  is <{ $smarty .now|date_format:"%Y-%m-%d %H:%M:%S"}> 

The value of   global  assigned variable  $SCRIPT_NAME  is <{ $SCRIPT_NAME }> 

Example of accessing server environment variable SERVER_NAME : <{ $smarty .server.SERVER_NAME}> 

The value of  <{ldelim}> $Name <{rdelim}> is <b><{ $Name }></b>

<b><{ $Name |upper}></b> 

An example of a section loop :

<{section name= outer 
loop = $FirstName }>
<{ if   $smarty .section.outer.index is odd by 2}>
    <{ $smarty .section.outer.rownum}> . <{ $FirstName [outer]}> <{ $LastName [outer]}>
<{ else }>
    <{ $smarty .section.outer.rownum}> * <{ $FirstName [outer]}> <{ $LastName [outer]}>
<{/ if }>
<{sectionelse}> 
    none
 <{/section}> 

An example of section looped   key  values:

<{section name=sec1 loop= $contacts }> 
    phone : <{ $contacts [sec1].phone}><br> 
    fax : <{ $contacts [sec1].fax}><br> 
    cell : <{ $contacts [sec1].cell}><br>
<{/section}>
<p>

<{ include   file ="footer.tpl"}>

其中引入header.tpl和footer.tpl这对于整个系统统一界面很重要,加入前端美工设计后,能使整个系统的一致。还引入了test.conf

header.tpl

View Code

footer.tpl

View Code

conf文件在tpls/configs/里

test.conf

View Code

 

运行效果:

在浏览器中输入路由地址 http://localhost/dluf/index.php/default/index/dluf

    在 系列六中 将介绍对页面传值的封装。

 

 

 

标签:  php ,  smarty ,  框架

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于SQL2008使用CTE递归查询批量插入500万数据的详细内容...

  阅读:40次