一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。
二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。
三、内容:
1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。
2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。
3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:
a)SQL的使用规范:
i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。
ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。
iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。
iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。
v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。
vii. 尽量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之间的替换
ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。
x. 注意存储过程中参数和数据类型的关系。
Sql Server数据库的备份和恢复措施
一、备份数据库
1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->双击打开数据库目录
3、选择你的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择备份数据库
4、备份选项选择完全备份,目的中的备份到如果原来有路径和名称则选中名称点删除,然后点添加,如果原来没有路径和名称则直接选择添加,接着指定路径和文件名,指定后点确定返回备份窗口,接着点确定进行备份
二、还原数据库
1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server
2、SQL Server组-->双击打开你的服务器-->点图标栏的新建数据库图标,新建数据库的名字自行取
3、点击新建好的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择恢复数据库
4、在弹出来的窗口中的还原选项中选择从设备-->点选择设备-->点添加-->然后选择你的备份文件名-->添加后点确定返回,这时候设备栏应该出现您刚才选择的数据库备份文件名,备份号默认为1(如果您对同一个文件做过多次备份,可以点击备份号旁边的查看内容,在复选框中选择最新的一次备份后点确定)-->然后点击上方常规旁边的选项按钮
5、在出现的窗口中选择在现有数据库上强制还原,以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置(也可以指定自己的目录),逻辑文件名不需要改动,移至物理文件名要根据你所恢复的机器情况做改动,如您的SQL数据库装在D:Program FilesMicrosoft SQL ServerMSSQLData,那么就按照您恢复机器的目录进行相关改动改动,并且最后的文件名最好改成您当前的数据库名(如原来是bbs_data.mdf,现在的数据库是forum,就改成forum_data.mdf),日志和数据文件都要按照这样的方式做相关的改动(日志的文件名是*_log.ldf结尾的),这里的恢复目录您可以自由设置,前提是该目录必须存在(如您可以指定d:sqldatabs_data.mdf或者d:sqldatabs_log.ldf),否则恢复将报错
6、修改完成后,点击下面的确定进行恢复,这时会出现一个进度条,提示恢复的进度,恢复完成后系统会自动提示成功,如中间提示报错,请记录下相关的错误内容并询问对SQL操作比较熟悉的人员,一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误,数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作,如果还提示正在使用的错误可以将SQL服务停止然后重起看看,至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复
利用数据库日志恢复数据到点的操作
可能有不少朋友遇到过这样的问题:
update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那么就无法进行数据的恢复了,或者只能恢复到最近一次的备份的数据了。
以下简单说明恢复数据方法:
1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)
backup log dbName to disk='fileName'
2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢复
restore database dbName from disk='fileName' with norecovery
3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻
restore log dbName from disk='fileName'
with stopat='date_time'
以上这些操作都可以在SQL SERVER企业管理器里完成,难度不大。。。
当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那么是无法利用上述方法来恢复数据的...
mysql 乱码问题
XMLHTTP刷新远程数据的PHP JS代码演示(支持中文)
xmlhttp,无刷新声,无漏斗标记,效果最好,不过就是对浏览器要求高,好在我的应用只是一个附属的功能,因此不需要用户必须开启这个控件……最后决定采用这个方案
我写了一个测试程序,代码如下,供大家参考:
==test2.php=================
<?
session_start();
echo "现在时间是:".date("Y-m-d H:i:s ",time());
?>
==eg4.php==================
<script language="javascript">
function re()
{
var http = new ActiveXObject("Microsoft.XMLHTTP");
http.open("GET","test2.php",false);
http.send();
var str = bytes2BSTR(http.responsebody);
t.innerHTML=str;
setTimeout( "re()" , 2000 );
}
</script>
<script language=vbscript>
Function bytes2BSTR(vIn)
dim i
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i 1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 CInt(NextCharCode))
i = i 1
End If
Next
bytes2BSTR = strReturn
End Function
</script>
<body onload="re();">
<span id=t>数据载入中</span>
</body>
这样,当你运行eg4.php时,页面会出现当前时间,每2秒刷新一次,看不到进度条,也没有小漏斗标记了
关于PHP中操作MySQL数据库的一些要注意的问题
1. 分号的例外
对于 MySQL ,第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的,但……没有完全绝对的事,在这儿也是一样,当一行 MySQL 被插入在 PHP 代码中时,最好把后面的分号省略掉,例如:
mysql_query ("INSERT INTO tablename (first_name, last_name)
VALUES ('$first_name', '$last_name')
");
这是因为 PHP 也是以分号作为一行的结束的,额外的分号有时会让 PHP 的语法分析器搞不明白,所以还是省略掉的好。在这种情况下,虽然省略了分号,但是 PHP 在执行 MySQL 命令时会自动的帮你加上的。
另外还有一个不要加分号的情况。当你想把要字段的竖者排列显示下来,而不是像通常的那样横着排列时,你可以用 G 来结束一行 SQL 语句,这时就用不上分号了,例如:
SELECT * FROM PENPALS WHERE USER_ID = 1G
2. TEXT、DATE、和 SET 数据类型
MySQL 数据表的字段必须有定义一个数据类型。这有大约 25 种选择,大部分都是直接明了的,就不多费口舌了。但有几个有必要提一下。
TEXT 不是一种数据类型,虽然可能有些书上是这么说的。它实际上应该是“ LONG VARCHAR ”或者“ MEDIUMTEXT ”。
DATE 数据类型的格式是 YYYY-MM-DD ,比如: 1999-12-08 。你可以很轻易的用 date 函数来得到这种格式的当前系统时间:
date("Y-m-d")
并且,在 DATA 数据类型之间可以作减法,得到相差的时间天数:
$age = ($current_date - $birthdate);
集合 SET 是一个有用的数据类型,它和枚举 ENUM 有点相似,只不过是 SET 能够保存多个值而 ENUM 只能保存一个值而已。而且, SET 类型最多只能够有 64 个预定的值,而 ENUM 类型却能够处理最多 65,535 个预定义的值。而假如需要有大于 64 个值的集合,该怎么办呢?这时就需要定义多个集合来一起解决这个问题了。
3. 通配符
SQL 的通配符有两种:“ * ”和“ % ”。分别用在不同的情况下。例如:假如你想看到数据库的所有内容,可以像这样来查询:
SELECT * FROM dbname WHERE USER_ID LIKE '%';
这儿,两个通配符都被用上了。他们表示相同的意思 ?? 都是用来匹配任何的字符串,但是他们用在不同的上下文中。“ * ”用来匹配字段名,而“ % ”用来匹配字段值。另外一个不轻易引起注重的地方是“ % ”通配符需要和 LIKE 要害字一起使用。
还有一个通配符,就是下划线“ _ ”,它代表的意思和上面不同,是用来匹配任何单个的字符的。
4. NOT NULL 和空记录
假如用户在没有填任何东西的情况下按了 submit 按钮,会怎样呢?假如你确实需要一个值,那么可以用客户端脚本或者服务器端脚本来进行数据验证,这一点在前面已经说过了。但是,在数据库中却是答应一些字段被空出来什么也不填。对此类纪录, MySQL 将要为之执行一些事情:
插入值 NULL ,这是缺省的操作。
假如你在字段定义中为之声明了 NOT NULL (在建立或者修改这个字段的时候), MySQL 将把这个字段空出来什么东西也不填。
对于一个 ENUM 枚举类型的字段,假如你为之声明了 NOT NULL , MySQL 将把枚举集的第一个值插入到字段中。也就是说, MySQL 把枚举集的第一个值作为这个枚举类型的缺省值。
一个值为 NULL 的纪录和一个空纪录是有一些区别的。 % 通配符可以匹配空纪录,但是却不能匹配 NULL 纪录。在某些时候,这种区别会造成一些意想不到的后果。就我的经验而言,任何字段都应该声明为 NOT NULL 。这样下面的 SELECT 查询语句就能够正常运转了:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' 柳 '
AND LAST_NAME = ' 如风 '
AND CITY LIKE '$CITY'
");
在第一行中,假如用户没有指定一个 CITY 值,那么就会用通配符 % 来代入 CITY 变量,这样搜索时就会把任何的 CITY 值都考虑进去,甚至包括那些 CITY 字段为空的纪录。
但是假如有一些纪录,它的 CITY 字段值是 NULL ,这时问题就出现了。上面的查询是不能够找到这些字段的。问题的一个解决办法可以是这样:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' 柳 '
AND LAST_NAME = ' 如风 '
AND (CITY LIKE '$CITY' OR CITY IS NULL)
");
注重在搜索 NULL 时,必须用“ IS ”要害字,而 LIKE 时不会正常工作的。
在最后要提到的是,假如你在加入或者修改一个新的字段之前,数据库中已经有了一些记录了,这时新加入的字段在原来的纪录中的值,可能是 NULL ,也可能为空。这也算是 MySQL 的一个 Bug 吧,所以在这种情况下,使用 SELECT 查询要非凡的小心。
sql server关于函数中如何使用Getdate()
create view v_getdate
as
select getdate() [output]
go
---------------------------------------------------------------
create function f_getdate()
returns datetime
as
begin
declare @n datetime
select @n = output from v_getdate
return(@n)
end
go
---------------------------------------------------------------
调用:select dbo.f_getdate()
======================================================================
-----以下是解析--------
应为function内部不允许使用
函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的,则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值,返回的结果总是不同的,则这些函数为不确定的。
不确定的函数会产生副作用。副作用是更改数据库的某些全局状态,比如更新数据库表或某些外部资源,如文件或网络等(例如,修改文件或发送电子邮件消息)。
不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:
@@CONNECTIONS @@TOTAL_ERRORS
@@CPU_BUSY @@TOTAL_READ
@@IDLE @@TOTAL_WRITE
@@IO_BUSY GETDATE
@@MAX_CONNECTIONS GETUTCDATE
@@PACK_RECEIVED NEWID
@@PACK_SENT RAND
@@PACKET_ERRORS TEXTPTR
@@TIMETICKS
尽管在用户定义函数主体中不允许有不确定函数,这些用户定义函数在调用扩展存储过程时仍会产生副作用。
由于扩展存储过程会对数据库产生副作用,因此调用扩展存储过程的函数是不确定的。当用户定义函数调用会对数据库产生副作用的扩展存储过程时,不要指望结果集保持一致或执行函数。
MySQL加密函数保护Web网站敏感数据
如果您正在运行使用MySQL的Web应用程序,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运的是,MySQL带有很多设计用来提供这种类型安全的加密函数。本文概述了其中的一些函数,并说明了如何使用它们,以及它们能够提供的不同级别的安全。
配置最新的PHP加MySQL服务器
通过一个小时的研究和设置.实现了最新的 PHP 5.0 MYSQL 5.0 WIN2003.
个人认为还是有必要写个教程出来.因为很多方面和老版本的不尽相同.
说实话自己也是查阅了很多官方文档才解决了很多怪异问题.
=========================
MYSQL 5.0 FOR WINDOWS
PHP 5.0 FOR WINDOWS
PHPMYADMIN
WINDOWS SERVER 2003
=========================
首先安装 MYSQL .本来以为新版本的安装界面应该会花哨点.
但是仍然只看到老土的海豚.除了安装时间比 4.0 长.当然咯.因为 5.0 比 4.0 体积大很多.
推荐安装在独立的 NTFS 分区上.比如我服务器的 F盘.只放服务器软件.
路径为: F:MYSQL
然后进入 F:MYSQLBIN 鼠标双点 winmysqladmin.exe
首次运行会提示输入超级用户和密码.就输入 root 密码 root
注重啊.假如是对外服务器请设置超级复杂.比如 Wjwsfjn29szjwh~mysql
翻译过来就是: 我叫魏舒芬.今年29岁至今未婚.
到这里.MYSQL就安装完毕了.假如不明白请参看深空同学的相关文章.
=========================
下面安装 PHP 5.0 其实没什么安装不安装的.解压缩文件.推荐放到
路径为: F:PHP
到这里就应该进入要害步骤了.
首先复制 PHP 目录下的 Php.ini-dist 到 C:Windows 并将文件名修改成为 Php.ini
COPY F:PHPPhp.ini-dist C:Windows
Ren Php.ini-dist Php.ini
假如是 WINDOWS 2000 就是: C:WINNT
假如是 WIN9X / 2003 就是: C:Windows
然后复制 PHP 目录下 DLLS 目录里的所有文件到 SYSTEM32 目录.
COPY F:PHPdlls*.* C:WindowsSystem32
假如是 WINDOWS 2000 就是: C:WINNTSystem32
假如是 WIN9X / 2003 就是: C:WindowsSystem32
继续.复制PHP目录下 php4ts.dll 文件到 System32 目录里.
COPY F:PHPphp4ts.dll to C:WindowsSystem32
=========================
保持多台服务器数据的一致性
很多企业用户都拥有多台SQL Server 2000服务器,为了使多台数据库服务器上的数据保持一致,我们可以将一台数据库服务器中的某个数据库移动到另外的数据库服务器中。
不使用OCI8接口如何连接PHP和Oracle
随着网站规模的扩大,MySql显然不能满足需求,在许多网站都
采用大型数据库Oracle的情况下,如何使用PHP来访问Oracle变的越发重要了。
我从我编写的一个简单iERP系统谈我自己是如何做的,在PHP官方手册里也有说明。
一般情况下或者说大多数人都是用Oracle8 Call-Interface(OCI8)来连接数据库,
我这里介绍不使用OCI8接口而直接使用PHP的Oracle函数来连接数据库并处理数据。
注重:
php.ini配置中要去掉 ;extension=php_oracle.dll 前的分号即
extension=php_oracle.dll
1,连接数据库
使用ora_logon()或者ora_plogon()来连接上数据库
ora_plogon功能与ora_logon类似,只不过ora_plogon开启与 Oracle 的长期连结
直至web服务停止
$handle = ora_plogon("system@localhost", "manager") or die;
"system@localhost" 其中localhost是oracle SID 名称,system是用户名称,manager是用户密码
2,打开游标
$cursor = ora_open($handle);
3,分析语法并执行指令