`
magicxin
  • 浏览: 17364 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

高效访问数据库—SQL语言技术

阅读更多

在我们编程的时候,涉及到数据库的操作,就效率而言,其实对我们一般的程序员来说,最重要的莫过于对数据库的访问了,如果你能保证尽量少的Connection,而在一次Connection中做尽量多的事情 ,就达到了效率的第一层了,第二层的话你就要尽量使用一句sql语句做更多的事情 ,再往上的话就得了解数据库的物理存储机制,其实我觉得对于一般的程序员而不是数据库管理员的话,了解第一第二层就行了,而实际上,现实生活中,达不到第二层的程序员大有人在,更有甚者,达不到第一层的也还是有不少人的。虽然现在orm框架很流行,但是了解sql其实还是蛮有益处的。
高效访问数据库这章是将通过哪些关键目标来达到高效访问数据库的目的。
这里我列举了几个我感兴趣的目标。

1、保持数据库连接稳定Stable Database Connections

其实就是讲的就是尽量减少数据库次数 的重要性。

例:

如果依次对每一行作连接/中断,结果是7.4行/秒;

连接一次,所有行逐个插入,结果是1681行/秒;

连接一次,以10行为一数组插入,结果是5914行/秒;

连接一次,以100行为一数组插入,结果是9190行/秒。

原因:(1)数据库连接时很“重”的操作,消耗资源很多。(2)你的程序(甚至包括存储过程)和数据库之间的交互也有开销。

也就是说要尽量减少数据库次数 ,而在一个连接中,也要减少程序与数据库的交互 ,程序和DBMS核心之间的上下文切换也有代价,如果DMBS支持数据通过数组传递,应毫不犹豫的使用它。

数据库连接和交互好似万里长城——长度越长,传递信息越耗时。

2、战略优先于战术Strategy Before Tactics

虑解决问题方案的细节之前,先站得远一些,把握大局。即要站在不同角度思考问题

3、用SQL处理集合 Set Processing in SQL

如果在存储过程中需要用游标,数据库很大的话,应该考虑的是执行该存储过程的频率 。也许以前是每月更新,考虑每周更新,设置可以是每日更新,而纠结于拆分sql语句并不是个好办法。

4、动态丰富的SQL语句 Action-Packed SQL Statements

可能在编写SQL时会有如下情况:用输入值从数据库中检查到一个或多个另外的数据值,然后借助循环或条件逻辑将一些语句组织起来,对数据库进行操作。这样做的话会出现多个SQL。

其实这样编写SQL是不必要的,许多负责操作往往可由一条SQL完成。如果用户提供了一些数据值,尽量不要将操作分解为多条提取中间结果的语句。不要在SQL中引入过程逻辑是因为

(1)数据库访问,总会跨多个软件层,甚至包括网络访问。

(2)在SQL中引入过程逻辑,意味着性能和维护问题将由你的程序承担。

尽可能多地把事情交给数据库优化器来承担

5、充分利用每次数据库访问 Profitable Database Accesses

如果需要多个字段的数据,千万不要逐个字段地提取,而应一次操作全部完成,与1类似。

在合理范围内,利用每次数据库访问完成尽量多的工作

6、接近DBMS核心

同样的结果,如果一个是通过数据库内置函数得到的,而另一个是通过自定义函数得到的,那显然第一种最快。

代码喜欢SQL内核——离核心越近,它就运行得越快。

7、只做必须做的Doing Only What Is required

select count(*) into counter where table_name where <certain_condition>

if(count>0)then

在大多数情况下,select count(*)完全不需要,如果要对多项记录进行操作,直接做即可。如果是为了更新或插入记录,也可以使用数据库的专用的SQL语句,如Oracle9i提供的Merge语句。

统计记录数极可能意味着重复全部搜索,因为它对相同数据处理了2次。

没必要编程实现那些数据库隐含实现的功能。

8、把逻辑放到查询中Program Logic into Queries

只要有可能,应尽量把条件逻辑放到SQL语句中,而不是SQL的宿主语言中。

9、一次完成多个更新 Mulitiple Updates at Once

update tbo_invoice_extractor

set pga_status=0 where pga_status in (1,3) and inv_type=0;

update tbo_invoice_extractor

set rd_status=0 where rd_status in (1,3) and inv_type=0;

改为

update tbo_invoice_extractor

set pga_status=(case pga_status when 1 then 0 when 3 then 0 else pga_status end),

rd_status = (case rd_status when 1 then 0 when 3 then 0 else rd_status end) where (pga_status in (1,3) or rd_status in (1,3)) and inv_type=0;

有可能的话,用一个语句处理多个更新;尽量减少对同一个表的重复访问

10、慎用自定义函数 Careful Use of User-Written Functions

优化器对自定义函数的代码无能为力。

11、SQL的进攻式编程Offensive Coding With SQL

尽量同时做几件事情 的进攻式编程有切实的优势。

例:进行一连串检查,每当其中一个检查所要求的条件不符时就产生异常。信用卡付款的处理中就涉及类似步骤。例如,检查所提交的客户身份和卡号是否有效,以及2者是否匹配;检查信用卡是否过期;检查当前的支付额是否超过了信用额度。通过了所有检查,支付才会继续。

select count(*) from customers where customer_id = provided_id;

select card_num,expiry_date,credit_limit from accounts where customer_id = provided_id

update accounts set balance = balance - purchased_ammount where card_num = provided_cardnum and custom_id = provided_id

改为:

update accounts set balance = balance - purchased_ammount

where balance >= purchased_ammount

and credit_limit >=purchased_amount

and espiry_date> today()

and card_num = provided_cardnum

and custom_id = provided_id

如果更新的行数为0,只需执行一个操作

select c.customer_id,a.card_num,a.expiry_date,a.creadit_limit,a.balance

from customers c

left outer join accounts a on a.customer_id = c.customer_id and a.card_num = provided_cardnum

where c.customer_id = provided_id

如果此查询没有数据,则可断定customer_id的值是错的;如果card_num是null,则可断定卡号是错的;等等,其实大多数情况下此查询并不需要。

这种方法可以称为乐观并发控制 ,乐观方法比悲观方法的吞吐量高很多。

分享到:
评论

相关推荐

    微软数据库SQL语言帮助

    在微软数据库系统中,SQL语言被广泛应用于Microsoft SQL Server,这是一个功能强大的关系型数据库管理系统,用于存储、管理和检索数据。本文将深入探讨SQL语言的基本概念、常用命令以及在微软环境中的应用。 一、...

    Oralce数据库SQL和pl_sql实例教程

    总的来说,Oracle数据库SQL和PL/SQL实例教程旨在帮助学习者深入理解这两种语言,提高数据库管理与开发的技能,从而在实际工作中更加高效地处理数据。通过详细的章节和实例,读者可以逐步熟悉并熟练运用SQL和PL/SQL...

    达梦数据库sql语句DM7_SQL语言使用手册.pdf

    * 安全性:DM_SQL语言提供了多种安全机制,保护数据库免受非法访问和操作。 * 可扩展性:DM_SQL语言支持用户自定义函数和存储过程,满足不同的应用需求。 保留字与标识符 在DM_SQL语言中,保留字是指具有特殊含义...

    数据库SQL语言学习资料

    在学习数据库SQL语言的过程中,首先需要理解SQL的基本概念。SQL,全称为Structured Query Language,即结构化查询语言,它是关系数据库的标准语言,由CHAMBERLIN和BOYCE在1974年提出,最初名为SEQUEL,后来由IBM发展...

    SQL数据库脚本语言

    SQL(Structured Query...总结,SQL数据库脚本语言是数据库管理的核心,从简单的数据操作到复杂的业务逻辑,都能通过SQL高效完成。初学者可以通过实践这些基本操作,逐步掌握SQL的精髓,为今后的数据管理打下坚实基础。

    Python访问SQLServer数据库

    本文将详细讲解如何使用Python访问SQLServer数据库,包括所需的库、连接配置以及基本操作。 首先,Python访问SQLServer数据库主要依赖于`pyodbc`库,这是一个强大的ODBC驱动程序,可以让我们通过Python连接到多种...

    数据库系统课件(含SQL语言)ppt

    本课件“数据库系统(含SQL语言)ppt”深入浅出地讲解了数据库系统的理论与实践,尤其注重SQL语言的学习和应用。下面我们将详细探讨其中的知识点。 首先,课件中会涵盖数据库系统的基本概念,包括数据库、数据库...

    数据库设计示例SQL语言

    数据库设计是IT领域中的核心部分,它涉及到如何有效地组织和存储数据,以便高效地访问和管理。SQL(Structured Query Language)则是与关系型数据库交互的标准语言,用于创建、查询、更新和管理数据库。在这个...

    数据库系统概论(SQL语言)

    4. 数据控制语言(DCL):DCL用于权限管理,包括授权(GRANT)和回收(REVOKE)访问数据库的权限,以及事务控制。 SQL的特点包括其结构化、非过程化、面向集合的操作方式,使得其简单易学,便于使用。此外,SQL支持...

    数据库原理实验,熟悉操作SQL语言

    数据库原理实验是学习数据库技术的重要环节,其主要目标是让学生深入理解...同时,实验也将锻炼学生的计算机语言应用能力,因为SQL语言是数据库操作的核心工具,掌握它对于从事任何与数据打交道的工作都至关重要。

    数据库第三章关系数据库标准语言SQL习题.doc

    1. 高效查询:SQL语言可以快速查询大量数据,提高查询效率。 2. 灵活性强:SQL语言支持多种查询方式,例如子查询、连接查询和聚合函数等。 3. 可扩展性强:SQL语言可以与其他语言集成,例如Java、Python等。 SQL...

    关系数据库语言SQL

    关系数据库语言SQL是数据库管理系统中不可或缺的一部分,它用于管理和处理关系型数据库中的数据。SQL起源于1972年IBM的System R实验系统,最初名为SQUARE,后演变为SEQUEL,最终简称为SQL。自那时起,SQL经历了多次...

    数据库SQL教学视频百度云链接

    根据提供的文件信息,我们可以深入探讨与“数据库SQL基础教学视频”相关的重要知识点。这不仅包括对SQL的基础理解,还涉及如何有效地使用SQL进行数据管理、查询优化等方面的内容。 ### SQL基础知识 #### 1. SQL...

    informix数据库SQL查询语言及应用

    **Informix数据库SQL查询语言及应用** Informix是一款高效、灵活的关系型数据库管理系统,由IBM公司开发并维护。SQL(Structured Query Language)是用于管理关系数据库的标准语言,它在Informix中的应用至关重要,...

    C#访问SQL数据库的例子

    这个"VS2008 C#语言访问sql2005数据库的详细例子源码"提供了实际动手实践的机会,帮助开发者更好地理解和运用这些技术。通过学习和实践,你不仅可以了解数据库访问的流程,还能加深对C#编程的理解。

    计算机语言-sql-大型数据库-课件

    本课程将深入探讨SQL语言的使用以及在大型数据库中的应用。 首先,我们从“第一章 数据库系统概述”开始,了解数据库的基本概念。数据库是一个组织和存储数据的系统,它提供了一种高效、安全的方式来管理和检索数据...

    嵌入式SQL——C语言访问数据库

    嵌入式SQL是将SQL(结构化查询语言)语句直接嵌入到主语言程序(如C语言)中,使得程序可以直接与数据库进行交互。这种方式极大地简化了数据库应用程序的开发,因为开发者可以在C语言程序中方便地执行各种数据库操作...

    C#语言和SQL Server数据库基础第9章.zip

    它支持标准的SQL语言,包括SELECT、INSERT、UPDATE、DELETE等基本操作,以及更复杂的JOIN、子查询、视图、存储过程等功能。在SQL Server中,我们可以通过创建数据库、表、索引来组织和优化数据。安全性方面,SQL ...

Global site tag (gtag.js) - Google Analytics