好的Sql语句也能提高效率

在之前的一篇文章中提到了数据库数据交换慢的问题,我要说的这个方法还是在看SqlBulkCopy的说明的时候看到的,直接构造一个Sql语句用来插入数据,用事务来执行,将1W个记录分块执行,加入分成100段,一段执行100条记录的数据插入,我发现执行的蛮快的.1W多条记录,执行下来就1-2秒钟就搞定了,比较high啊。但是如果你一次性弄1W的Select语句UNION起来执行的话是不会执行成功的,我这边测试的时候抛异常,说连接超时,即使我把超时时间设定成2000s,也是抛超时的异常,我觉得是不是那个UNION起来的字符串太长了,导致执行不成功。

说说那个Sql的格式:下面给了一个例子,这个Sql语句执行之后就相当于一次插入了10条记录,将10条Sql语句组合成1条Sql语句执行,如果是100个插入组合成一个Sql语句执行,这个效果还是蛮明显的。

INSERT INTO TESTTABLE ( [column0],  [column1],  [column2],  [column3],  [column4] )
    SELECT '77', '74', '30', '61', '30' UNION
    SELECT '85', '6', '69', '26', '73' UNION
    SELECT '87', '82', '10', '79', '83' UNION
    SELECT '61', '55', '79', '7', '12' UNION
    SELECT '77', '36', '47', '35', '13' UNION
    SELECT '83', '72', '36', '93', '47' UNION
    SELECT '97', '49', '66', '12', '84' UNION
    SELECT '95', '47', '10', '89', '27' UNION
    SELECT '17', '47', '46', '80', '50' UNION
    SELECT '8', '54', '48', '64', '65'

 

现在的问题就变成组合Sql语句上面了,从上面的例子可以看出,需要的参数有表结构,就是要取道表的字段名字,最好也有字段类型,可以根据字段类型去组建下面的SELECT语句中的值,比如像DateTime类型的,还是要做一点转换的。

初步思路:

  • 1、定义一个结构体,存放表结构信息,最基本的几个属性就是字段名,字段类型,字段长度,字段的值,其他的属性看情况有需要再加。
  • 2、需要写一个方法去拼接成图中的那种Sql语句。最好能弄一个值去设定多少个SELECT分为一组,还有就是构建SELECT的时候,肯定是多条记录的嘛,后面的值怎么获得,通过DataReader取值去拼接?还是直接弄一个DataTable,再去遍历一遍去拼接?发现直接取DataReader速度还是很快的。
  • 3、如果表中存在二进制字段怎么处理?
  • 4、上面说的是插入数据时候的方法,如果是更新大量数据的时候Sql语句应该是什么样子的呢? 难道说先删除再插入?

注意事项:要确保拼接Sql的过程不要太费时间,不要弄的执行Sql语句只需要2秒钟,结果执行之前的拼接Sql语句就花了10秒,那就不划算了。

要是能解决上面的那些问题,以后再插入大量数据的时候就不会存在速度问题了。

提供一个CodeSmith的模板,用来生成测试Sql语句的。哪位同仁想测试一下就拿去吧。

/Files/bluesky4485/创建Insert测试语句.zip

My Tags: ,

posted @ 2009-07-27 09:56  bluesky4485  阅读(751)  评论(0编辑  收藏  举报