仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 650|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:进步C/S体系功能的一些办法

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?功能  摘要客户机/服务器的使用逻辑计划是不是公道,间接影响到客户机/服务器体例使用体系的处置功能。本文以Oracle7服务器为平台提出一些办法,以断定怎样分别使用逻辑,使客户机/服务器使用体系有较高的处置效力。
  关头词PL/SQL触发子客户机/服务器

  1、成绩的提出

  80年月末到90年月初,很多使用体系从主机终端体例、文件共享体例向客户机/服务器体例过渡。客户机/服务器体系比文件服务器体系能供应更高的功能,由于客户机和服务器将使用的处置请求分隔,同时又配合完成其处置请求(即"散布式使用处置")。服务器为多个客户机办理数据库,而客户机发送哀求和剖析从服务器吸收的数据。在一个客户机/服务器使用中,数据库服务器是智能化的,它只封闭和前往一个客户机哀求的那些行,包管了并发性,使收集上的信息传输减到起码,因此能够改良体系的功能。

  在客户机/服务器体系中,使用的处置是散布在收集上的,以是在计划客户机方数据库使用程序时,若把过量的包袱加在收集上,没有充实使用数据库的存储历程,没有把收集会见最小化,了局是使用程序要实行过量的收集I/O,使收集饱和,从而下降了全部体系的功能。要开辟好的客户机/服务器使用体系,必需弄分明怎样在构成体系的各部分之间散布使用功效。

  本文提出一些办法来断定客户机/服务器数据库体系中哪些功效应放在那里完成。客户机使用程序次要偏重于用某种便利用户的体例暗示和(或)剖析数据。开辟客户机使用程序时,收集传输量是应重点思索的成绩之一。应注重使用程序怎样向数据库服务器发送信息或从数据库服务器吸收信息和发送和吸收几数据。一般客户机/服务器体系上彀络I/O是使用程序功能的瓶颈,一个使用程序引发的收集上I/O越少,使用及全部体系的运转情形越好。要从一个客户机使用中打消不用要的收集传输量,必要了解和使用SQL命令及数据库上的别的一些特性。

  2、一个例子

  上面,我们来思索如许一个例子:一个数据库使用程序完成显现每一个发卖定单的一切行的金额算计。

  一样平常算法分两步:

  (1)每行项目中数目乘以单价=金额;
  (2)把每行金额累加。

  第一种办法:

  每次一行,然后,用使用程序累加,即

SELECTorderid,quantity,unitprice
FROMitem,stock
WHEREstock.id=item.id
ORDERBYorderid
了局为:
orderidquantityunitprice
116.03
1121.4
1487.12
228.97
2321.4
  接纳这类办法,若营业量增年夜,则其收集的传输量响应增年夜。

  第二种办法:

  让数据库服务器举行盘算,然后只把了局从网上取过去,即:

SELECTorderid,SUM(quantity*unitprice)
FROMitem,stock
WHEREitem.id=stock.id
GROUPBYorderid
ORDERBYorderid
了局为:
orderidSUM(quantity*unitprice)
1265.87
282.14
  如上所示,因为第二种查询利用了一个SQL的组合,即一个SQL函数(SUM)和一个GROUPBY子句,让服务器来实行盘算。因而,只需从网上传输较少的数据。

  这个复杂例子申明:

  1.在客户机/服务器情况中怎样用SQL函数削减收集上的传输量;
  2.开辟职员必需完整熟习SQL才干做出好的客户机数据库使用程序。


  3、进步功能的办法

  上面我们先容几种进步功能的办法。



  1.利用完全性束缚

  一切客户机使用程序必需遵守一系列事后界说的数据完全性计划及营业划定规矩,以包管一切数据库数据是正当的。可使用两种办法来实行一个复杂的完全的划定规矩:让使用程序实行完全性反省;利用Oracle7的完全性束缚。

  (1)让使用程序实行完全性反省

  比方,任何一个定单(orders)的主顾号必需是客户机表(customer)中的主顾户机号。这是一个最复杂的援用完全性,能够用使用程序自己实行完全性反省。


DECLARE
flagINTEGER;
BEGIN
SELECTidINTOflag
FROMcustomer
WHEREid=3
FORUPDATEOFid;
IFSQL%FOUNDTHEN
INSERTINTOorders
VALUES(5,3,SYSDATE,null,null,F);

--其他使用逻辑
COMMIT;
ENDIF;
END;


  这个历程只是在使用程序外部用于实行援用完全性划定规矩的一种办法,但能够看出,为实行一个复杂的完全性划定规矩,使用程序要花大批的工夫经由过程收集来哀求和发送数据。

  (2)利用Oracle7的完全性束缚

CREATETABLEorders
(
idINTEGERPRIMARYKEY,
customeridINTEGERNOTNULLREFERENCEScustomer,
orderdateDATENOTNULL,
shipdateDATEDEFAULTSYSDATE,
paidateDATEDEFAULTSYSDATE,
statusCHAR(1)DEFAULT‘FCHECK(statusIN(‘F
,‘B))
);

  实行复杂完全性划定规矩(如援用完全性)的更好办法是利用Oracle7的完全性束缚。该办法的优点是分明的:

  ①界说一个表的同时,便利地创建完全性束缚,开辟职员不需为实行一个复杂的完全性划定规矩而创立测试、排错庞大的数据完全性逻辑,进步了事情效力;
  ②用会合化的办法完成完全性划定规矩;
  ③无需任何收集I/O,客户机/服务器体系也就不会由于收集会见而下降功能。

  2.利用数据库触发器

  使用程序常常必要实行庞大的营业划定规矩,这些划定规矩没法用完全性划定规矩暗示,以是最好不要依照惯例思绪在使用程序中实行完全性划定规矩;而是用数据触发子(triggers)来实行营业划定规矩。其长处是简单创立,可会合举行划定规矩实行,制止不用要的收集I/O。使用数据库触发子可使其他一些使用程序会合化和主动化。好比,盘算item表中的total列的值是所订零件的数目乘以零件的单价,而零件单价寄存在stock表中,当拔出一个新的行项目时,使用程序盘算total列的值有两种办法。

  办法一:让使用程序经由过程SQL命令实行这个操纵


DECLAREtotalREAL;
BEGIN
SELECTunitprice*quantityINTOtotal
FROMstock,item
WHEREid=4;
INSERTINTOitemVALUES(...);
END

  使用程序经由过程收集收回哀求,获得某一些零件单价,然后拔出这个含有该行盘算值(total)的行。修正item表中某行数目值,使用程序必要包括类似的逻辑来盘算。别的,多个用户还大概统一时候拔出和修正定单。总之,用这类办法来盘算total列时会在客户机/服务器体系中发生大批的收集传输。

  办法二:用数据库触发子,从一个行项目主动导出total的值,当用户在item表中拔出新行或修正quantity时,无需任何收集会见。


CREATETRIGGERLinetotal
BEFOREINSERTORUPDATEOFquantity,stockid
ONitem
FOREACHROW
DELARE
itempriceREAL;
BEGIN
SELECTunitprice
INTOitemprice
FROMstock
WHEREid=:new.stockid;
:new.tolal:=new.quantity*itemprice;
ENDlinetotal;

  当创立触发器linetotal后,使用开辟职员在编写使用程序时就不需思索坚持total列为最新值的成绩,并且收集数据库上一切使用城市因而受害。

  3.使用历程和包优化功能

  这里次要会商怎样使用完全性束缚和数据库触发器把使用逻辑移到数据库服务器中实行以便削减收集I/O,进步功能。别的范例使用处置逻辑散布到数据库服务器亦能够削减客户机/服务器使用中的收集I/O,使用程序不用再用包括多个收集操纵的SQL语句往实行数据库服务器操纵,而是复杂且无效地挪用存储历程。包是一种用来把多个有关的历程在数据库中封装起来的办法。上面是用SQL和用存储历程例子的差别:

  比方要拔出某些行项目标定单,用SQL完成历程:


INSERTINTOordersVALUES(...)
INSERTINTOitemVALUES(1,..)
UPDATEstockSETonhand=...
INSERTINTOordersVALUES(...)
INSERTINTOitemVALUES(2,..)
UPDATEstockSETonhand=...
INSERTINTOordersVALUES(...)
INSERTINTOitemVALUES(3,..)
UPDATEstockSETonhand=...
COMMIT;

  要创立一个新发卖定单并拔出它的三个行项目,使用程序必需用7个分歧的的SQL语句来完成,每一个语句都要经由过程收集传输数据,要削减这些SQL语句在客户机/服务器体系中发生的收集传输量,能够创立两个复杂的历程来拔出定单及行项目。

CREATEPROCEDUREplaceorder(custidININTEGER)AS
BEGIN
INSERTINTOorders
VALUES(orderseq.NEXTVAL,custid,SYSDATE,null,null,‘F
);
ENDplaceorder;
CREATEPROCEDUREplaceitem
(itemidININTEGER,partidININTEGER,quanININTEGER)
AS
BEGIN
INSERTINTOitem(id,orderid,stockid,quantity)
VALUES(itemid,orderseq.CURRVAL,partid,quan);
UPDATEstock
SETonhand=onhand-quan
WHEREid=partid;
ENDplaceitem;

  使用程序只需复杂挪用这几个历程。


Placeorder(3);
Placeitem(1,3,2);
Placeitem(2,8,1);
Placeitem(3,9,3);

  当一个使用程序挪用存储历程时,经由过程收集发送的数据只要历程挪用及参数。本文提出的进步客户机/服务器使用体系功能的办法,次要是接纳公道散布处置逻辑于客户机端与服务器端,并充实使用数据库服务器来进步实行速率。该办法的无效性,已在我们开辟的多项客户机/服务器使用体系中失掉证明。别的,在进步功能的措施和办法中,SQL语句的查询优化成绩也不成无视。综合上述两种办法,才干从基本上进步客户机/服务器使用体系的功能。
BlackHole黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
简单生活 该用户已被删除
沙发
发表于 2015-1-19 07:34:33 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-24 12:02:41 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
谁可相欹 该用户已被删除
地板
发表于 2015-2-1 09:59:25 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
因胸联盟 该用户已被删除
5#
发表于 2015-2-7 02:48:43 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
第二个灵魂 该用户已被删除
6#
发表于 2015-2-19 21:46:28 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
小魔女 该用户已被删除
7#
发表于 2015-3-6 15:45:35 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
乐观 该用户已被删除
8#
发表于 2015-3-13 04:07:07 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
分手快乐 该用户已被删除
9#
发表于 2015-3-20 12:02:42 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-26 00:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表