- 1、mysql数据库的值赋给变量,在线等
- 2、mysql数据库的作用是什么?
- 3、昆明java培训学校告诉你Mysql数据库的设计和优化?
- 4、Yii2框架操作数据库的方法分析【以mysql为例】
- 5、影响数据库性能的主要因素有哪些?
ASP操作ACESS数据库
一,拥有数据库
可以这么说:静态页面和动态页面最大的区别就是采用了数据库。有关一个WEB程序采用数据库和不采用的优越性比较,就不去细细分析了,主要精力还是放在如何使用数据库,如何熟练运用数据库,如何更灵活地运用数据库等等……其中运用操作数据库主要是对数据库内容进行:显示、插入、修改、更新、查询和删除。
这些方法当然也不是一口就能吃出来的,要慢慢感受咀嚼、理解消化。当然首先很重要的便是先拥有数据库了。否则,一切都是空谈,巧媳妇难以无米之炊嘛。
一般而言,我们所说的数据库其实就是一个数据库文件,该文件是由一些数据库管理系统(DBMS)建立生成的。目前一般的DBMS也就是常用常听说的ACCESS,SQLSERVER,MYSQL,ORACLE。当然一般个人站点,小型企业采用ACCESS完全足够;稍微大些的就采用同样是Microsoft公司的SQL SERVER或者是MYSQL,值得注意的是MYSQL一般是和另外一种网络编程语言PHP完美结合的。当然更大型的就采用ORACLE了。呵呵,曾经在学习PB时还运用到SYBASE数据库,UNIX系统的Informix数据库……DBMS简直是多如牛毛-_-!
话说过来,目前我们就直接使用ACCESS了:1,使用简单;2,入门掌握容易;3,实在没有比这个更适合初学的了。
一切还得从实际操作开始。
1,打开ACCESS数据库,选择新建数据库,将其命名为cnbruce.mdb,并保存到一专门文件夹database中
images/ado/1.gif[/img]
2,在新建的数据库容器中双击“使用设计器创建表”,弹出的表1窗口中字段名称输入“cn_id”,数据类型选择“自动编号”,并选择上方工具栏中的钥匙按钮,将该字段设为主键。
继续输入字段“cn_title”,数据类型选择“文本”;NEXT输入字段“cn_content”,数据类型选择“备注”;
PS:备注和一般类型文本最大的区别就是备注允许插入的字段值相对要多些,这在插入一些较长文章的时候尤其重要。
仍然输入字段“cn_author”,数据类型选择“文本”;并且切换到下面“常规”中的“允许空字符串”选择“是”。
PS:这表面允许cn_author字段的值可以是空的,这在当提交表单,某些信息不填写但要正确插入数据库时,显得很重要。
最后输入字段“cn_time”,数据类型选择“日期/时间”,继续切换到“常规”中的“默认值”输入“now()”函数
末了,将“表1”另存为“cnartile”
images/ado/2.gif[/img]
3,双击打开cnartile表,填写第一行:“cn_title”输入“test”,“cn_content”输入“this is a test”,“cn_author”输入“cnbruce”,时间已经自动添加。完成!关闭表,关闭数据库。
images/ado/3.gif[/img]
二,建立数据库连接
OK,数据库已经建立完毕,并且已经填写了一行信息内容。那么现在需要的就是同过ASP将该行信息显示出来。
要想显示,首先还是需要ASP与该数据库文件建立连接,具体怎么建立?往下看。
1,conn.asp:主要起的是连接并打开某数据库文件的功能。该文件建议单独存在,并且位置是和存放数据库的文件夹database处与同一物理层次。
%db_path = “database/cnbruce.mdb”Set conn= Server.CreateObject(“ADODB.Connection”)connstr = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”Server.MapPath(db_path)conn.Open connstr%
db_path = “database/cnbruce.mdb”,不用说,就是将数据库的相对路径赋到一个变量上,以方便下面继续调用。
Set conn= Server.CreateObject(“ADODB.Connection”),和其它建立组件一样,建立了一个ADO连接,并用一对象conn来接受。
connstr = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”Server.MapPath(db_path),很显然就是连接字符串了,其包括打开数据库的驱动方法OLEDB,和打开和哪个数据库的连接(即数据库的路径)。
需要再次提醒的是:无论是FSO对文件、文件夹的操作还是ADO对数据库的操作,对被操作文件的取得都是获得的绝对的物理地址,一般情况之下,采用Server.MapPath方法相对较好。
conn.Open connstr最后对象conn通过连接字符串connstr打开了数据库的连接。
三,显示数据库内容
建立了数据库,建立了和数据库的连接,下面水到渠成地就是将数据库中的内容通过ASP显示出来。
2,showit.asp
!–#include file=”conn.asp” –%Set rs = Server.CreateObject (“ADODB.Recordset”)sql = “Select * from cnarticle”rs.Open sql,conn,1,1%%if rs.EOF and rs.BOF then response.write (“暂时还没有文章”)else Do Until rs.EOF response.write(“文章标题是:” rs(“cn_title”)) response.write(“br文章作者是:” rs(“cn_author”)) response.write(“br文章加入时间是:” rs(“cn_time”)) response.write(“br文章内容是:” rs(“cn_content”)) response.write(“hr”) rs.MoveNext Loopend if%%rs.close Set rs = Nothingconn.close set conn=Nothing%
简单调试本页,不出任何意外,相信一定能将数据库中的信息显示出来了。(PS:我的数据库中输写了两行)
images/ado/4.gif[/img]
下面就来具体一个一个解释来理解没行的含义:
1,!–#include file=”conn.asp” — 没有任何争议,主要是调用conn.asp的所起的功效,这在解释conn.asp文件的时候已经明白。
2,Set rs = Server.CreateObject (“ADODB.Recordset”) ADO组件除了Connection连接以外,还有Recordset绑定记录集(相信用过DW做ASP的人现在开始有些重回故里的感觉了)当然 rs 可以形象地想象成数据库表中的某一行。
3,sql = “Select * from cnarticle” 标准的SQL结构化查询语言。很简单:建立了数据库连接,也绑定了记录集,那具体需要哪些信息呢?也就是要筛选一些记录集合了,不过当前采用的是无任何条件,即可以提取所有。
4,rs.Open sql,conn,1,1 真正地打开通向数据库中记录集的大门,具体有关后面的参数可以从如下网址中获得。
5,if rs.EOF and rs.BOF then 该语句里面涉及到了rs.EOF 和 rs.BOF 以及两者的逻辑运算 and 。rs.EOF 表示到达数据库表中的最后一行,rs.BOF 表示到达数据库表中的第一行。整个语句可以理解为,如果当前数据库中的最后一行就是数据库表中第一行,那么可以肯定:当前数据库表中没有任何数据。
6,
Do Until rs.EOF
…
rs.MoveNext
Loop
主要就是一个DO LOOP 循环语句了,其中循环的结束条件为:直到rs.EOF,即值得数据库表的最后一行。那么在这些条件满足的许可之内,就是来显示具体的信息了。
每次循环只能显示数据库表中的一行,如果要继续读取下行,那么 rs.MoveNext 功能真是如此。
7,rs(“cn_title”)等等 主要就是具体显示记录集中的哪个特定字段的信息值了。很是简单。
8,最后不要忘了释放资源空间关闭记录集连接,关闭数据库连接。
四,一些特殊条件
1,有没有注意到,数据库表信息的显示一般是按照时间的先后排列的,也就经常提到的按时间的升序排列。需要注意:按时间升序,并不一定每个数据库表中都要有一个时间/日期类型的字段,只要存在一个自动编号的字段就可以了。因为该字段是永不重复,并且是依次增大的。因此,按时间升序其实就是按自动编号中号码数值的增加来进行排序的。
当然,问题的关键来了,那就是要按照时间的降序排列,即始终从最新的内容开始显示。那具体需要哪些手术呢?
很简单,将连接字符串稍做修改。
由 sql = “Select * from cnarticle” 添加修改为
sql = “Select * from cnarticle order by cn_id desc”
其中 order by cn_id 即通过cn_id字段,desc 即降序了。
2,有是时候,只需要提取最前或者最新的几条信息,那这个又具体如何操作呢?同样还是连接字符串的修改
由 sql = “Select * from cnarticle order by cn_id desc” 添加修改为
sql = “Select top 3 * from cnarticle order by cn_id desc”
其中 top 3 就表示提取最新的三条信息内容了。
That’s All. 现在一个文章系统、新闻系统或者留言本显示部分的精华内容你已不费吹灰之力搞定。
留下你的是:文章的格式可能显示不对劲,比如回车、空格都不显示了,那么你就还要学会处理接受的数据库表的值(在ASP的几个练习中提到的);文章不能老是打开数据库输入信息啊,那么你就要继续学会如何用ASP插入数据到库表;再有就是文章多了,一个页面看是不是很麻烦?那么你还要学会分页技术……
简单的显示记录已经掌握,现在需要的就是通过ASP将信息内容插入到数据库中。
一、拥有数据库cnbruce.mdb
本数据库的作用就是用来被插入数据的,可以直接采用上节中已经建立的cnbruce.mdb文件,当然连接打开数据库的文件conn.asp也就顺利引用了。
二、建立输入插入信息的页面平台addit.html
本页的主要作用是:显示一些文本输入框以用来提供输入信息内容提交数据库。
1,addit.html
form action=”addit.asp” method=”post”Title:input type=”text” name=”title”brAuthor:input type=”text” name=”author”brContent:brtextarea name=”content” rows=”8″ cols=”30″/textareabrinput type=”submit” value=”Add”input type=”reset” value=”Reset”/form
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
本页其实很简单,就是通过submit按钮将表单的信息内容提交到addit.asp页面去处理。
三、建立处理接受数据并插入数据库表的页面程序addit.asp
2,addit.asp
!–#include file=”conn.asp” –%whattitle=request.form(“title”)whoauthor=request.form(“author”)whatcontent=request.form(“content”)%%Set rs = Server.CreateObject (“ADODB.Recordset”)sql = “Select * from cnarticle”rs.Open sql,conn,3,2%%rs.addnewrs(“cn_title”)=whattitlers(“cn_author”)=whoauthorrs(“cn_content”)=whatcontentrs.update%文章添加成功,a href=”showit.asp”浏览/a%rs.close Set rs = Nothingconn.close set conn=Nothing%
恩,接着就是来具体分析一下。
1,!–#include file=”conn.asp” — 不用说,凡是要和数据库有联系的都要运用到该连接文件。
2,whattitle=request.form(“title”)之类 就是将上页表单中接受过来的值赋到一变量上,方便下面程序的调用。
3,rs.Open sql,conn,3,2 注意参数和显示数据库时采用的参数的不同。
4,rs.addnew 很简单也很显眼的一个声明:新建一个数据库记录集行。
5,rs(“cn_title”)=whattitle之类 即将接受的表单值对应到相关字段中。
6,rs.update 只是值和数据库字段的对应,完了后还要将对应的值上传提交到数据库表中去。
7,插入后可以跳转到showit.asp查看 需要说明,以后的ASP例题可能都是建立在前几节内容的基础之上完成的。
8,释放资源 是规矩,不要忘记。
那么,现在。插入并显示数据库记录,对你来说完全是小菜一碟了。大体框架搭建完毕,下面就是具体的细化了。
其中包括:客户端的表单检测,防止用户信息输入的遗漏;当然最好还是要加上服务器端的表单检测,由于客户端的某些原因(比如自行设计提交非检测的页面)基于安全考虑,一切还是依服务器端所接受信息为准。那下面就继续细化应用下了。
1,客户端检测 其实就是通过简单的脚本检测,这在初学ASP提到脚本的时候说到,下面将再次重复。
加强的addit.html
script laguage=”javascript”!–function form1_onsubmit(){if (document.form1.title.value==””){alert(“请输入文章标题”)document.form1.title.focus()return false}else if(document.form1.content.value==””){alert(“请输入文章内容”)document.form1.content.focus()return false}}–/scriptform action=”addit.asp” method=”post” name=”form1″ script_onsubmit=”return form1_onsubmit()”Title:input type=”text” name=”title”brAuthor:input type=”text” name=”author”brContent:brtextarea name=”content” rows=”8″ cols=”30″/textareabrinput type=”submit” value=”Add”input type=”reset” value=”Reset”/form
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
2,服务器端检测 有人也许会问,既然有了客户端的检测,那还有多个服务器端的检测呢?原因很简单,比如仿照HTML表单提交页,自行设计一张去除了表单检测的页面。当点击提交,并且没有任何信息时,到达服务器端如没有任何防御则肯定会造成数据插入的失败。
加强的addit.asp
!–#include file=”conn.asp” –%whattitle=trim(request.form(“title”))whoauthor=trim(request.form(“author”))whatcontent=trim(request.form(“content”))%%if whattitle=”” then%script language=vbsalert(“请输入文章标题”)history.go(-1)/script%end if%%if whatcontent=”” then%script language=vbsalert(“请输入文章标题”)history.go(-1)/script%end if%%Set rs = Server.CreateObject (“ADODB.Recordset”)sql = “Select * from cnarticle”rs.Open sql,conn,3,2%%rs.addnewrs(“cn_title”)=whattitlers(“cn_author”)=whoauthorrs(“cn_content”)=whatcontentrs.update%文章添加成功,a href=”showit.asp”浏览/a%rs.close Set rs = Nothingconn.close set conn=Nothing%
可以看出,就是添加了如下类似的判断。
%if whattitle=”” then%script language=vbsalert(“请输入文章标题”)history.go(-1)/script%end if%
很简单,如果接受过来的信息为空,则弹出警告框,并且确认后返回到上页即addit.html了。当然cn_author没有设置检测,因为当初设计该字段的接受值是允许为空的。
OK,总结一下,插入记录主要就是
rs.addnewrs(“cn_title”)=whattitle…rs.update
很简单,先声明addnew,然后一一对应,再提交插入数据库。
这是一种插入数据库的方法,下面就来接触了解一下另外一种。
需要注意,结构化的查询语言也就是SQL语句能够完成一些比较苛刻的数据库操作。当然,对于诸如提取、插入信息之流就更不在话下了。
回答者:zhifucai – 魔法师 五级 7-1 14:46
您觉得最佳答案好不好? 目前有 2 个人评价
100% (2)
0% (0)
其他回答共 2 条
1.Access数据库的DSN-less连接方法:
set adocon=Server.Createobject(“adodb.connection”)
adoconn.Open”Driver={Microsoft Access Driver(*.mdb)};DBQ=” _
Server.MapPath(“数据库所在路径”)
2.Access OLE DB连接方法:
set adocon=Server.Createobject(“adodb.connection”)
adocon.open”Provider=Microsoft.Jet.OLEDB.4.0;” _
“Data Source=” Server.MapPath(“数据库所在路径”)
回答者:最爱叫天蝎 – 试用期 一级 7-1 15:13
Option Explicit ‘设置 变量必须声明
Response.Expires = 0 ‘关闭ie浏览器的缓冲
‘第一部分: 建立连接
Dim Cnn, StrCnn
Set Cnn = Server.CreateObject(“ADODB.Connection”)
StrCnn = “Provider = Microsoft.Jet.OLEDB.4.0; Data Source=数据库路径”
Cnn.Open strcnn
回答者:eux – 门吏 二级 7-4 11:07
一般下载的源码都带了数据库的,做个真正意义上的网站没数据库肯定不行。 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片,声音,视频等等的路径)。
没有mysql可以去网上申请一个免费的,不过速度比较慢,玩玩还是可以的,如果你水平较好的话可以用xml作为数据库存储上述的数据,xml 也一种是"数据库",不过它是文件数据库不是mysql这类关系数据库。不清楚xml请搜索“xml 数据库”
在JAVA开发中数据库的学习也是我们需要了解的,截下来几篇文章都是关于数据库的设计和应用,那么java课程培训机构废话不多说开始学习吧!
数据库的设计
数据库设计是基础,数据库优化是建立在设计基础之上的。好的数据库一定拥有好的设计。
数据库设计的目标是为用户和各种应用系统提供一个信息基础设施和高效的运行环境。
数据库的三大范式
第一范式1NF:所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
第二范式2Nf:第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式3Nf:所有字段必须与主键直接相关,而不是间接相关。也可以理解为字段不要和其他非主键字段相关.
注意:这三个范式尽可能去遵守,不是一定要墨守成规.这只是让我们设计的表的时候,越靠近这些范式,可以使字段尽量的减小冗余.但是有时候也可以根据实际需要小小的违背一下.但是第三范式违反一下还可以接受,但是第一范式别违反.
数据库设计的步骤
需求分析阶段
准确了解与分析用户需求(包括数据与处理)。是整个设计过程的基础,是最困难、最耗费时间的一步。
概念结构设计阶段
是整个数据库设计的关键–设计数据库的E-R模型图,确认需求信息的正确和完整
Entity_Relationship—实体之间的关系
一对一
一对多
多对一
本文实例讲述了Yii2框架操作数据库的方法。分享给大家供大家参考,具体如下:
准备数据库
DROP
TABLE
IF
EXISTS
`pre_user`;
CREATE
TABLE
`pre_user`(
`id`
int(11)
AUTO_INCREMENT
PRIMARY
KEY,
`username`
varchar(255)
NOT
NULL,
`password`
varchar(32)
NOT
NULL
DEFAULT
”,
`password_hash`
varchar(255)
NOT
NULL
DEFAULT
”,
`email`
varchar(255)
NOT
NULL
DEFAULT
”,
`status`
smallint(6)
NOT
NULL
DEFAULT
10,
`created_at`
smallint(6)
NOT
NULL
DEFAULT
0,
`updated_at`
smallint(6)
NOT
NULL
DEFAULT
)ENGINE=InnoDB
DEFAULT
CHARSET=utf8mb4;
配置连接
config\db.php
?php
return
[
‘class’
=
‘yii\db\Connection’,
‘dsn’
=
‘mysql:host=localhost;dbname=yii2’,
‘username’
=
‘root’,
‘password’
=
‘root’,
‘charset’
=
‘utf8mb4’,
‘tablePrefix’
=
‘pre_’
];
查看数据库连接是否成功
控制器里打印:
var_dump(\Yii::$app-db);
怎么执行SQL语句?
增删改
//
接收表单的数据
$username
=
‘jack’;
$sql
=
“INSERT
INTO
{{%user}}
(username,status)
VALUES
(:username,:status)”;
//
返回受影响行数
$row
=
\Yii::$app-db-createCommand($sql,[‘username’=$username,’status’=8])-execute();
//
获取自增ID
echo
\Yii::$app-db-getLastInsertID();
查询
$sql
=
“SELECT
*
FROM
{{%user}}
WHERE
id:id”;
//
查询结果是一个二维数组
$userArr
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryAll();
//
如果要查询一个
$user
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryOne();
//
如果要返回单值
//
例如
select
count(*)语句
$count
=
\Yii::$app-db-createCommand($sql,[‘id’=1])-queryScalar();
echo
$count;
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
您可能感兴趣的文章:Yii2.0高级框架数据库增删改查的一些操作Yii2——使用数据库操作汇总(增删查改、事务)Yii2数据库操作常用方法小结Yii2框架实现数据库常用操作总结Yii2实现跨mysql数据库关联查询排序功能代码Yii+MYSQL锁表防止并发情况下重复数据的方法Yii
连接、修改
MySQL
数据库及phpunit
测试连接Yii实现MySQL多数据库和读写分离实例分析Yii操作数据库实现动态获取表名的方法Yii操作数据库的3种方法
1、1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。
2、2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
3、3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。
4、4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。
5、5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。
6、6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。
实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。另外,良好的数据库管理工具对于优化数据库性能也是很重要的。
ORACLE数据库性能优化工具
常用的数据库性能优化工具有:
1、1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的。
2、2、操作系统工具,例如UNIX操作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用。
3、3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。SQL语言跟踪工具将结果输出成一个操作系统的文件,管理员可以使用TKPROF工具查看这些文件。
4、4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。
5、5、EXPLAIN PLAN——SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言。
ORACLE数据库的系统性能评估
信息系统的类型不同,需要关注的数据库参数也是不同的。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数。
1、1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update操作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数:
l l 数据库回滚段是否足够?
l l 是否需要建立ORACLE数据库索引、聚集、散列?
l l 系统全局区(SGA)大小是否足够?
l l SQL语句是否高效?
2、2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数:
l l 是否采用B*-索引或者bitmap索引?
l l 是否采用并行SQL查询以提高查询效率?
l l 是否采用PL/SQL函数编写存储过程?
l l 有必要的话,需要建立并行数据库提高数据库的查询效率
SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的。程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则:
1、1、尽量使用索引。试比较下面两条SQL语句:
语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp);
语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些。
2、2、选择联合查询的联合次序。考虑下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2;
这个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表B和表C相应列的范围小。
3、3、在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多。
4、4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。
5、5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。
6、6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。
CPU参数的调整
CPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余。
使用操作相同命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar –u命令查看CPU的使用率,NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。
数据库管理员可以通过查看v$sysstat数据字典中“CPU used by this session”统计项得知ORACLE数据库使用的CPU时间,查看“OS User level CPU time”统计项得知操作系统用户态下的CPU时间,查看“OS System call CPU time”统计项得知操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和,如果ORACLE数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,ORACLE数据库无法得到更多的CPU时间。
数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多。
出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲突都会引起CPU资源不足。
1、数据库管理员可以执行下述语句来查看SQL语句的解析情况:
SELECT * FROM V$SYSSTAT
WHERE NAME IN
(‘parse time cpu’, ‘parse time elapsed’, ‘parse count (hard)’);
这里parse time cpu是系统服务时间,parse time elapsed是响应时间,用户等待时间
waite time = parse time elapsed – parse time cpu
由此可以得到用户SQL语句平均解析等待时间=waite time / parse count。这个平均等待时间应该接近于0,如果平均解析等待时间过长,数据库管理员可以通过下述语句
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS FROM V$SQLAREA
ORDER BY PARSE_CALLS;
来发现是什么SQL语句解析效率比较低。程序员可以优化这些语句,或者增加ORACLE参数SESSION_CACHED_CURSORS的值。
2、数据库管理员还可以通过下述语句:
SELECT BUFFER_GETS, EXECUTIONS, SQL_TEXT FROM V$SQLAREA;
查看低效率的SQL语句,优化这些语句也有助于提高CPU的利用率。
3、3、数据库管理员可以通过v$system_event数据字典中的“latch free”统计项查看ORACLE数据库的冲突情况,如果没有冲突的话,latch free查询出来没有结果。如果冲突太大的话,数据库管理员可以降低spin_count参数值,来消除高的CPU使用率。
内存参数的调整
内存参数的调整主要是指ORACLE数据库的系统全局区(SGA)的调整。SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。
1、 1、 共享池由两部分构成:共享SQL区和数据字典缓冲区,共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。数据库管理员通过执行下述语句:
select (sum(pins – reloads)) / sum(pins) “Lib Cache” from v$librarycache;
来查看共享SQL区的使用率。这个使用率应该在90%以上,否则需要增加共享池的大小。数据库管理员还可以执行下述语句:
select (sum(gets – getmisses – usage – fixed)) / sum(gets) “Row Cache” from v$rowcache;
查看数据字典缓冲区的使用率,这个使用率也应该在90%以上,否则需要增加共享池的大小。
2、 2、 数据缓冲区。数据库管理员可以通过下述语句:
SELECT name, value FROM v$sysstat WHERE name IN (‘db block gets’, ‘consistent gets’,’physical reads’);
来查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区的使用命中率=1 – ( physical reads / (db block gets + consistent gets) )。
这个命中率应该在90%以上,否则需要增加数据缓冲区的大小。
3、 3、 日志缓冲区。数据库管理员可以通过执行下述语句:
select name,value from v$sysstat where name in (‘redo entries’,’redo log space requests’);查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败率:
申请失败率=requests/entries,申请失败率应该接近于0,否则说明日志缓冲区开设太小,需要增加ORACLE数据库的日志缓冲区。