`
qimo601
  • 浏览: 3445840 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

数据库为啥要使用参数绑定?

阅读更多

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

 

1. 为什么使用绑定变量?
这是解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量;
这里举例说明上述问题;
为了查询一个员工代号是123,你可以这样查询:
select * from emp where empno=’123’;

 


你也可以这样查询:
select * from emp where empno=:empno;

 

象我们往常一样,你查询员工’123’一次以后,有可能再也不用;接着你有可能查询员工’456’,然后查询’789’等等;如果查询使用象第一个查询语句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;
第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;
第一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似的,系统的整体性能降低; 而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源;

 

 

 

2、关于Oracle数据库的参数绑定性能实践的一个实例简介。

AD:

 

从Oracle的SGA的构成来看,它是推崇使用参数绑定的。使用参数绑定可以有效的使用Share Pool,对已经缓存的SQL不用再硬解析,能明显的提高性能。

具体实践如下:

 

SQL>create table test (a number(10));< 
 

再创建一个存储过程:

 

create or replace procedure p_test is
  i number(10);
begin
  i := 0;
   while i <= 100000 loop
    execute immediate ' insert into test values (' || to_char(i) || ')';
    i := i + 1;
  end loop;

  commit;

end p_test; 
 

先测试没有使用参数绑定的:

运行 p_test 后,用时91.111秒。

再创建一个使用参数绑定的:

 

create or replace procedure p_test is
  i number(10);
begin
  i := 0;
  while i <= 100000 loop
    execute immediate ' insert into test values (:a)'
      using i;
    i := i + 1;
  end loop;
  commit;

end p_test; 
 

运行 p_test 后,用时55.099秒。

从上面的运行时间可以看出,两者性相差 39.525%,可见,用不用参数绑定在性能上相差是比较大的。

 

3、那么使用语句参数的方式,和使用字符串处理函数的方式相比,有什么好处呢?主要有以下三点:

  (1) 使用“语句参数”方式,具有更高的安全性,可以有效防止“SQL注入攻击”。 “SQL注入攻击”要想达到目的,就必须让attack value随着SQL命令字符串一起传送进SQL解析器。黑客如果在一条SQL命令字符串被送入到sqlite3_prepare函数之前,利用c字符串处理函数等途径将attack value注入其中,而在sqlite3_prepare函数之中进行解析(parse),就可以达到攻击目的。而使用“语句参数”方式,被传送到sqlite3_prepare函数的只是SQL命令字符串中的参数符号(如:“?”),而不是具体的值。在sqlite3_prepare函数执行之后,才会使用bind函数给参数符号绑定具体的值,这就可以避免attack value随着SQL命令字符串一起在sqlite3_prepare函数中被解析,从而有效躲避“SQL注入攻击”。

  (2)使用“语句参数”方式,可以更快的完成值替换。

  (3)使用“语句参数”方式,更节省内存。原因是使用如snprintf函数,需要一个SQL命令模板,一块足够大的输出缓存,而且字符串处理函数需要工作内存(working memory),除此之外对于整形,浮点型,特别是BLOBs,经常会占用更多的空间。

分享到:
评论

相关推荐

    MapX教程之数据库绑定篇 

    2. **Layer与数据库的绑定**:在连接成功后,需要使用`Map.Datasets.Add`方法来建立图层与数据库表之间的联系。此方法接受多个参数,每个参数都有特定的功能: - `Type`:指定数据源类型,例如miDataSetADO表示...

    oracle 数据库的绑定变量特性及应用

    为什么使用绑定变量? 绑定变量是解决 Oracle 应用程序可伸缩性的一个关键环节。如果不使用绑定变量,每次查询都是一个新的查询,这将导致 Oracle 需要分析、解析、安全检查、优化等一系列操作。这些操作将消耗大量...

    数据绑定应用(数据库方面)

    数据绑定在IT领域,特别是在数据库管理和应用程序开发中,是一个至关重要的概念。它涉及到将数据源与用户界面元素关联起来,使数据的更改能够实时反映在界面中,反之亦然。在“数据绑定应用”这个主题中,我们将会...

    如何绑定数据库

    本文将深入探讨“如何绑定数据库”的主题,从理解基本概念到实际操作流程,再到使用报表制作软件进行数据库绑定的实践指南。 ### 数据库绑定的基本概念 数据库绑定指的是将应用程序与特定的数据库实例建立连接的...

    datagridview 与数据库绑定

    7. **参数化查询**:在执行SQL查询时,为防止SQL注入,应使用参数化查询。例如: ```csharp string sql = "SELECT * FROM YourTableName WHERE ID = @ID"; OdbcCommand cmd = new OdbcCommand(sql, conn); cmd....

    ASP.NET DataList 绑定数据库二进制图片

    本文将详细介绍如何将存储在数据库中的二进制图片数据绑定到DataList,以便在网页上进行展示。我们将使用Visual Studio 2010作为开发工具,SQL Server 2008作为数据库管理系统。 首先,我们需要了解如何在数据库中...

    SpringMVC绑定数据库例子

    在本示例中,我们将探讨如何使用SpringMVC与MyBatis框架进行集成,以便将应用程序与数据库进行绑定。SpringMVC是Spring框架的一部分,它提供了处理HTTP请求、视图解析以及模型数据绑定等功能,而MyBatis则是一个轻量...

    vb.net2010数据库编程基础教程-数据绑定

    4. **绑定控件**:使用`Add`方法为控件创建绑定,并将其添加到`ControlBindingsCollection`中。例如,将TextBox控件绑定到数据源中的某一列: ```vbnet TextBox1.DataBindings.Add("Text", OleDbDataAdapter1, ...

    C# 使用晚绑定实现压缩Access数据库

    在标题和描述中提到的场景,使用晚绑定是为了实现Access数据库的压缩功能,而避免在项目中直接引用特定的组件,如`JRO.JetEngine`。这样做的好处在于,当多个开发者在一个项目中协作时,不需要每个人都安装相同的...

    绑定数据库的方法实例

    在IT领域,数据库的使用是不可或缺的一部分,而如何有效地展示和操作这些数据是开发者常常面临的挑战。本教程将深入探讨“绑定数据库的方法实例”,特别是如何将数据库中的数据读取并绑定到TREEVIEW控件中。TREEVIEW...

    ADO数据库绑定对象

    在本文中,我们将深入探讨ADO数据库绑定对象及其核心组件,特别是记录集(Recordset)对象。 ADO数据库绑定对象是编程中用于连接、查询和操作数据库的关键元素。这些对象允许开发者创建与数据库之间的动态连接,使...

    ASP.NET绑定sql数据库采用echarts显示数据图表(实现了柱状图和饼图).zip

    4. 数据绑定:将数据库数据绑定到ECharts图表,如使用`JsonResult`返回JSON数据。 5. ECharts使用:配置图表选项,理解各种图表属性,如系列、轴、图例等。 6. HTML和CSS:构建图表容器,调整样式以适应页面设计。 7...

    浅谈oracle 数据库的绑定变量特性及应用

    - **性能优化**:绑定变量能够减少解析次数,因为数据库会将带有绑定变量的SQL语句视为同一语句,即使实际的变量值不同。这减少了解析和编译的时间,尤其是在频繁执行相同结构但不同值的SQL语句时。 - **内存使用...

    力控与access数据库.docx

    然后,我们可以创建一个新的数据库,例如命名为“表1”,这将是我们后续操作的基础。 二、创建数据表 在创建了Access数据库之后,我们可以创建一个新的数据表。在本示例中,我们创建了两个字段:ID(数字型)和...

    读取数据库中所有表并选择绑定AspxGridView

    ### 读取数据库中所有表并选择绑定AspxGridView #### 概述 在Web开发中,特别是使用ASP.NET进行开发时,从数据库读取数据并将其展示在前端页面上是一项常见需求。本文将详细介绍如何利用ASP.NET中的`AspxGridView`...

    分页comboBox,textBox 绑定数据库

    - 将数据库查询结果转换为DataTable或List对象,然后使用DataSource属性将数据绑定到ComboBox。设置DisplayMember和ValueMember属性分别指定显示字段和值字段。 - 如果ComboBox用于选择分类,可以选择性地添加一个...

    使用C#开发数据库应用系统 数据库 北大青鸟参考资料

    本文将深入探讨如何使用C#语言开发数据库应用系统,同时结合北大青鸟的教育理念与实践,为学习者提供详尽的知识点。 首先,C#是微软公司推出的一种面向对象的编程语言,它具有丰富的特性和强大的性能,特别适合于...

    birt数据集参数与列绑定实现

    在BIRT(Business Intelligence and Reporting Tools)中,数据集参数与列绑定是构建复杂报告的关键技术。本主题将深入探讨如何实现数据集之间的参数传递以及列的绑定,以充分利用BIRT的功能来创建高效的报告。 ...

Global site tag (gtag.js) - Google Analytics