批处理SQL语句的执行效率提高的方法

数据库 SQL Server
下面为您介绍批处理SQL语句的执行效率提高的方法,供您参考,如果您在大量数据集中执行操作的优化方面遇到过问题,不妨一看,相信会对您学习SQL语句的优化会大有帮助。

下面为您介绍批处理SQL语句的执行效率提高的方法,供您参考,如果您在大量数据集中执行操作的优化方面遇到过问题,不妨一看,相信会对您学习SQL语句的优化会大有帮助。

如果你的项目要求你的程序对高达几万条的数据在集中的时间内执行固定序列的操作,且不能完全使用存储过程时而需要使用程序来执行时。会需要这些优化。

我们知道,SQL服务器对一条语句的执行,需要分析、编译、执行这些步骤,通过参数化我们可以对一种命令只分析和编译一次,而执行多次,从而提高效率。在执行时,如果每次提交语句,可以完成多条SQL语句,则可以减少通讯时间,也可以提高效率。

通过 System.Data.IDbCommand.Prepare() 方法,我们可以在第一次执行语句时,分析和编译SQL语句,然后保存这个Command对象,下次使用时,直接设置参数执行。这个方法对Oracle和MsSql Server都有效。

如果执行一批语句,在T-SQL和PLSQL中有一点不一样。

在T-SQL中,多条SQL语句之间,使用分号";"分隔就行。

delete from TableA where id = @id;update TableB set Name=@name where id=@id
 
而在PLSQL中,则需要用 begin ... end; 包起来,中间语句用分号";"分隔。

begin delete from TableA where id = :id;update TableB set Name=:name where id=:id; end;
     相信这样做之后,你的效率会有几倍或者十几倍的提升。当然,你还可以对只是查而修改的表,做一下缓存处理,来减小访问数据库的次数。
     下面我示例一下访问Oracle执行PLSQL的一个函数的例子:
private void DeleteFlowInstanceData(string flowinstanceid)
{
    OracleCommand cmd = this.cmdDeleteFlowInstanceData;
    if(cmd == null)
    {
        //生成SQL
        StringBuilder sb = new StringBuilder();
        sb.Append("begin ");

        sb.Append(@"delete from bak_WF_Log_EngineLog where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from bak_WF_Log_ErrLog where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from WF_Running_MsgForEngineBak where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from bak_WF_Running_MsgForUser where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from bak_WF_Running_FlowActivity where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from bak_WF_Running_FlowData where FlowInstanceID= :instanceId;");
        sb.Append(@"delete from bak_WF_Running_FlowInstance where FlowInstanceID= :instanceId;");

        sb.Append("end;");
       
        //准备 DbCommand
        this.cmdDeleteFlowInstanceData = cmd = new OracleCommand();
        cmd.Connection = this.connEngine;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = sb.ToString();
        cmd.Parameters.Clear();
        cmd.Parameters.Add("instanceId", OracleType.VarChar,250);

        //准备一下以提高性能。
        cmd.Prepare();
    }

    //设置参数
    cmd.Parameters["instanceId"].Value =  flowinstanceid;

    //设置事务
    cmd.Transaction = this.tranEngine;

    cmd.ExecuteNonQuery();


}

 

【编辑推荐】

SQL语句中特殊字符的处理方法

教您用SQL语句进行模糊查询

为您讲解SQL动态语句的语法

SQL2005中的RANK、DENSE_RANK排名函数

SQL中随机数函数rand()简介

责任编辑:段燃 来源: 博客园
相关推荐

2009-07-21 15:47:35

JDBC批处理

2010-04-30 14:14:11

Oracle提高SQL

2011-03-21 15:51:27

SQL执行效率

2010-04-29 15:43:17

2010-09-25 16:21:41

SQL语句

2009-10-29 11:18:47

ADO.NET SQL

2010-09-06 13:41:42

sql server语句

2010-08-27 14:54:21

DB2批处理脚本

2010-05-07 12:53:50

Oracle提高SQL

2010-03-31 15:03:54

Oracle执行

2010-04-13 15:14:31

Oracle优化

2010-09-07 10:19:31

SQL语句

2010-09-07 14:50:15

SQL语句

2010-09-08 15:00:03

SQL语句执行

2010-06-30 13:49:02

SQL Server数

2011-08-29 10:08:04

SQL Server osqlocmd批处理

2010-11-15 16:46:49

Oracle查询效率

2010-09-06 11:46:03

SQL Server语句

2010-11-12 11:25:44

SQL SERVER视

2010-07-07 10:02:46

SQL Server数
点赞
收藏

51CTO技术栈公众号