目录
目录................................................................................................................................. 1
无法连接到服务器............................................................................................................ 1
SQL2005中文乱码解决方案............................................................................................. 2
mssql 2005 开启
目录
目录................................................................................................................................. 1
无法连接到服务器............................................................................................................ 1
SQL2005中文乱码解决方案............................................................................................. 2
mssql 2005 开启1433端口............................................................................................... 4
从SQL SERVER 2000中备份的数据库还原到SQL SERVER 2005上.................................. 4
异常:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。收藏............ 5
新一篇: 网站发布问题....................................................................................... 5
C#中利用process类调用外部程序以及执行dos命令.......................................................... 5
SQL 2005心得:发布订阅................................................................................................ 6
发布服务器配置(在发布服务器上配置发布和订阅)....................................................... 7
Q. SQL Server 2005 产品线主要有几个版本?.................................................................... 9
修改SQL2005的验证模式.............................................................................. 9
新一篇: SQL2005 安装时 “性能监视器计数器要求(错误)”解决方案.......................... 10
安装 sql2005 时 com+ 警告的问题................................................................................ 11
SQL server 2005安装问题汇总zz..................................................................................... 12
2005数据库安装心得...................................................................................................... 13
SQL2005安装过程提示com+目录问题警告处理.............................................................. 15
sql2005安装过程owc11错误处理.................................................................................... 18
教你如何在SQL Server数据库中加密数据...................................................................... 51
安装SQL Server 2005时出现计数器错误......................................................................... 53
SQL2000错误代码大全................................................................................................... 54
无法获得model表上的排它锁......................................................................................... 57
SQL数据类型................................................................................................................. 57
SQL SERVER数据类型............................................................................................. 58
SQL Server数据类型介绍................................................................................................ 59
[分享]SQL SERVER的数据类型...................................................................................... 64
SQL2005导入导出数据库问题........................................................................................ 69
sql server 2005导入导出数据完全步骤............................................................................. 70
SQL中的转义字符和通配符的查询................................................................................. 70
Vista下安装SQLServer2005........................................................................................... 70
SQL Server 2005 Express附加数据库为“只读”的解决方法................................................ 71
无法连接到服务器
服务器:消息18452, 级别16,状态1
[Microsoft][ODBC SQL Server Driver][SQL Server]用户‘sa’登陆失败。原因:未与信任SQL Server连接相关联
该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(例如 sa )进行连接,解决方法如下
设置允许SQL Server身份登录 (基本上这个很有用)
操作步骤:
1、在企业管理器中,展开"SQL Server组",鼠标右键点击SQL Server服务器的名称
2、选择"属性"
3、再选择"安全性"选项卡
4、在"身份验证"下,选择"SQL Server和 Windows"
5、确定,并重新启动SQL Server服务
6、选择"安全性"
7、再选择"登录名"-sa-右键属性-状态-将”登录”设置为启用
8、从“开始菜单”-SQL Server2005-配置工具-外围配置器-服务和连接的外围配置-远程-本地连接和远程连接-同时使用TCP/IP和named pipse
9、确定,并重新启动SQL Server服务
开启1433端口:
1、 打开SQL Server Configuration Manager
2、SQL Native Client 配置-客户端协议 - TCP/IP – 右键属性-将IP地址默认端口改为1433
3、SQL Server 2005 网络配置 –Lydia的协议- TCP/IP – 右键属性-将IP地址动态端口改为1433
一、使用SQL SERVER2005的时候常常遇到中文字符为乱码的情况,经过研究发现,设置SQL的排序规则可以解决这个问题。
1、登录服务器打开Microsoft SQL ServerManagement Studio。
2、在要修改的数据库上单击鼠标右键,并选择“属性”。
3、在弹出的数据库属性窗口中点击“选择页”中的“选项”。
4、将排序规则由默认的SQL_Latin1_General_CP1_CI_AS修改为Chinese_PRC_CI_AS。
5、点击确定就OK。
注:如果无法修改的话,请尝试关闭所有与此数据库的连接,实在不行的话请重启动SQL SERVER服务。
1. ALTER DATABASE (DBNAME) SETOFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE (DBNAME) SET ONLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE (DBNAME) COLLATE (排序规则)
如果数据库正在使用的话,可以依次执行以上语句
二、更改 SQL Server 2005 实例的默认排序规则的操作可能会比较复杂,包括以下步骤:
重新生成 master 数据库:
一、将SQL Server 2005安装光盘放入光驱;
二、在操作系统上选择“开始”--“运行”(输入CMD)--“回车”;
三、于弹出的命令窗口通过“cd..”指令,回到磁盘的根目录(如c:\);
四、接着键入你光盘所在盘符,如“f:”,回车;
五、接着键入(“setup.exe/qn INSTANCENAME=MSSQLSERVERREINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=123SQLCOLLATION=Chinese_PRC_90_CI_AS”)命令重新构建master 数据库;
(备注:如果是默认实例,则INSTANCENAME的值为“MSSQLSERVER”,有实例则录入实例;SAPWD的值为数据库密码;SQLCOLLATION为你所定义的排序规则,中文简体则为“Chinese_PRC_90_CI_AS”)
六、接着等几分钟候电脑自动运行,期间是没有提示运行完成窗口的,待光驱灯不闪烁及硬盘不连续读盘的时候表示安装完成;
七、接着重启电脑,重新建数据库,将之前导出的数据导入就OK了~!
方法如下:
配置工具-> SqlServer Configuration Manager-> MSSQLSERVER的协议
看看TCP/IP协议是否启动,如果启动,右键菜单点"属性" ,在分页菜单中选"IP地址",把"IP1"和"IP2"中"TCP端口"为1433,
"已启用"改为"是"
配置工具-> SqlServer Configuration Manager-> SQL Native Client 配置-> 客户端协议-> TCP/IP
选择TCP/IP右键菜单中"属性",确认"默认端口"是1433,"已启用"为"是"
,打算新建一个数据库关系图,可是在MicrosoftSQL Server Management Studio中一点数据库关系图的文件夹,就出现一个“此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先试用"数据库属性"对话框的"文件"页或ALTERAUTHORIZATION语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象”的提示
按照他说的指定所有者,可惜还是不对,查了一下,应该执行如下语句:
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname=N'数据库名',@new_cmptlevel=90
GO
因为2000备份的数据库还原到2005以后,兼容级别是80,更新成90就OK了
当把从其它机器备份出来的数据库,还原到自己的机器上后,在SSMS中点击这个数据库的数据库关系图时,出现了以下提示:
此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或ALTERAUTHORIZATION语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象。
数据库中确定是有数据库关系图的。提示给出了两种方法,第一种试了几次都不好用,第二种方法倒是一次成功,具体在SSMS中运行以下命令:
ALTER AUTHORIZATION ON database::mydbname TO sa
把mydbname修改为实际的数据库名称,就可以把所有者设置为sa了
2008年1月19日,1:06:00 | 浪淘沙
#中的Process类可方便的调用外部程序,所以我们可以通过调用cmd.exe程序
加入参数 "/c " 要执行的命令来执行一个dos命令
(/c代表执行参数指定的命令后关闭cmd.exe /k参数则不关闭cmd.exe)
1 private string RunCmd(string command)
2 {
3 //實例一個Process類,啟動一個獨立進程
4 Process p = new Process();
5
6 //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性:
7
8 p.StartInfo.FileName = "cmd.exe"; //設定程序名
9 p.StartInfo.Arguments = "/c " command; //設定程式執行參數
10 p.StartInfo.UseShellExecute = false; //關閉Shell的使用
11 p.StartInfo.RedirectStandardInput = true; //重定向標準輸入
12 p.StartInfo.RedirectStandardOutput = true; //重定向標準輸出
13 p.StartInfo.RedirectStandardError = true; //重定向錯誤輸出
14 p.StartInfo.CreateNoWindow = true; //設置不顯示窗口
15
16 p.Start(); //啟動
17
18 //p.StandardInput.WriteLine(command); //也可以用這種方式輸入要執行的命令
19 //p.StandardInput.WriteLine("exit"); //不過要記得加上Exit要不然下一行程式執行的時候會當機
20
21 return p.StandardOutput.ReadToEnd(); //從輸出流取得命令執行結果
22
23 }
以下实现复制步骤(以快照复制为例)
运行平台SQL SERVER2005
一、准备工作:
1.建立一个 WINDOWS 用户,设置为管理员权限,并设置密码,作为发布快照文件的有效访问用户。
2.在SQL SERVER下实现发布服务器和订阅服务器的通信正常(即可以互访)。打开1433端口,在防火墙中设特例
3.在发布服务器上建立一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy
4.设置SQL 代理(发布服务器和订阅服务器均设置)
打开服务(控制面板---管理工具---服务)
---右击SQLSERVERAGENT---属性---登录---选择“此帐户“
---输入或选择第一步中创建的WINDOWS用户
---“密码“中输入该用户密码
5.设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)
步骤为:对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS“,然后点确定
6.开启SQL Server2005的网络协议TCP/IP和管道命名协议并重启网络服务。
7.在SQL Server中创建步骤1中对应的系统用户登陆名,作为发布数据库的拥有者(设置为dbo_owner和public)。
8.以系统超级用户sa登陆SQL Server建立数据库和表。
9.发布服务器和订阅服务器互相注册
步骤如下:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成。
10.对于只能用IP,不能用计算机名的,为其注册服务器别名
二、开始:
发布服务器配置(在发布服务器上配置发布和订阅)
1. 选择复制 节点
2. 右键本地发布 ----下一步---------系统弹出对话框看提示----直到“指定快照文件夹“
----在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)------选择发布数据库-------选择发布类型-------选择订阅服务器类型-------选择要发布的对象------设置快照代理-------填写发布名称。
3. 右键本地订阅--------选择发布服务器-------选择订阅方式(如果是在服务器方订阅的话选择推送订阅反之
选择请求订阅)-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
至此, SQL SERVER2005 同步复制就完成了。使用复制技术,用户可以将一份客户端的数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性,就无需编程实现客户端和服务器端数据同步了!大大提高了工作效率!
发布系比较简单嘅,冇咩需要技术难度。
但系订阅就需要留意下了。喺设置好嘅发布增加订阅,会要求你添加订阅服务器。如果订阅服务器系用域名或IP地址去连接果阵会pop个严重错误:
------------------------------
无法连接到 remote.oicp.net。
SQL Server 复制需要有实际的服务器名称才能连接到服务器。不支持通过服务器别名、IP 地址或任何其他备用名称进行连接。请指定实际的服务器名称“GZ-SVR”。 (Replication.Utilities)
------------------------------
咁样就唔可以继续落去了……
解决方案有2个:
1,将各远程服务器VPN至总公司,设好DNS,等总公司嘅SQL可以好似访问局域网内机器咁访问呢D远程服务器。
2,设好总公司SQL嘅“别名”,等SQL自己连去远程服务器。
我用紧2号方案:
EX:远程服务器的域名系'remote.oicp.net',实际机器名系'GZ-SVR'
=》喺总公司SQL度,打开SQL Server Configuration Manager,去SQL Native Client配置,再开“别名”
=》新建别名:别名=GZ-SVR,端口=1433,服务器=remote.oicp.net,协议=TCP/IP
搞掂!再做发布就冇问题了。
2006-11-04补充:设置好之后,添加订阅服务器果阵就用GZ-SVR呢个别名去验证连接。
另外,两台机器不能重名。如果重名的话要改成不一样的名字。
然后安装SQL 2005,注意,必须在改名后安装,我就是卡在这里了,安装后再改名就不行了(也许能在哪里改SQL认定的机器名的名称,但是我没找到)
然后,在配置工具里建立别名,别名要和对方的机器名一样,必须一样。
然后就能发布和订阅了,用别名直接连上对方就可以了,另外订阅必须在发布的机器上做
Q.SQL Server 2005产品线主要有几个版本?
A. SQL Server 2005 产品家族被重新设计以更好的满足不同客户的需求,它包含以下几个版本:
SQL Server 2005 企业版 是用于企业关键业务应用的完全集成的数据管理和商业智能分析的平台。它是对那些有着复杂的工作负荷,高级的分析需求和严格的高可用需求的公司适合的选择。它的特性包括:无限的伸缩和分区功能,高级数据库镜像功能,完全的在线和并行操作能力,数据库快照功能,包括完全的OLAP和数据挖掘的高级分析工具,报表生成器和定制的高扩展的报表功能,先进的集成服务。64位企业版支持到64颗CPU, 内存不限。
SQL Server 2005 标准版 是一个完全的数据管理和商业智能分析平台。它为那些需要比SQL Server 2005工作组版更多功能(如商业智能工具)的中型企业和大型部门而设计。它的特性包括:高可用性,64-bit支持,数据库镜像,增强的集成服务,分析服务和报表服务,数据挖掘,完全的数据复制功能和发布功能。标准版支持4颗CPU,内存不限(64位)。
SQL Server 2005 工作组版 是SQLServer 产品线中最新的SKU,它将提供一个更快捷且更易使用的数据库解决方案。对那些不满足SQL Server 2005 Express版功能,在寻找一个可负担的起的完全数据库产品的中小型组织而言,它是一个理想的选择。它的特性包括:管理工具集、导入/导出、有限的复制/发布能力、日志传递备份等功能。工作组版支持2颗CPU,3GB内存。
SQL Server 2005 精简版(Express Edition) 是SQL Server 2005 数据库引擎中免费的和可再分发的版本。它为新手程序员提供了学习,开发和部署小型的数据驱动应用程序最快捷的途径。它的特性包括:一个简单的管理工具,一个报表向导和报表控件,数据复制和客户端。它可用免费从Web下载。精简版支持1颗CPU, 1 GB 内存。
现在的SQL Server版本家族把一个企业所需要的所有数据相关功能集成在一个产品包里,并提供以上版本供不同客户根据自己所需选择最佳解决方案。SQL Server 2005将是一个集数据管理、商业智能为一体的统一数据平台,客户可以在这个平台上轻松搭建任何数据相关的应用,如数据管理、复制发布、数据转换、分析服务、报表服务、数据挖掘等,并不再需要为上述各类复杂需求分别支付额外付费。
修改SQL2005的验证模式
标题: Microsoft SQL Server Management Studio
解决方法:只需创建时取消强制密码过期选项 |
因为在安装的时候,选择WIN验证模式,现在不知道如何启用。
如果在安装过程中选择“Windows 身份验证模式”,则 sa 登录将被禁用。如果稍后将身份验证模式更改为“SQL Server 和 Windows 身份验证模式”,则 sa 登录仍处于禁用状态。若要启用 sa 登录,请使用 ALTER LOGIN 命令。
sa 登录只能使用 SQL 身份验证连接到服务器。
在 SQL Server Management Studio 对象资源管理器中,右键单击服务器,再单击“属性”。
在“安全性”页上的“服务器身份验证”下,选择新的服务器身份验证模式,再单击“确定”。
在 SQL Server Management Studio 对话框中,单击“确定”以确认需要重新启动 SQL Server。
在对象资源管理器中,右键单击您的服务器,再单击“重新启动”。如果运行有 SQL Server 代理,则也必须将其重新启动。
执行下列语句以启用 sa 密码并分配一个密码。
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = '
GO
在 SQL Server 2005 Manger Studio 中录入数据的时候,不要把光标移动到只读的列中,否则你的中文就不要想录入了
另外,设计表的时候可能也得注意,如果你想在SQL Server 2005 Manger Studio 中录入中文,则不要把只读列设置为第1列,比如上面的测试表 ta, 如果你已经录入了数据,再用SQL Server 2005 Manger Studio 打开的时候,你会发现光标是定位在第1条记录的第1列(标识列,也是只读列)的,这样会导致你根本无法录入中文
这应该算是SQL Server 2005Manger Studio 的一个BU吧
在 SQL Server 2005 Manger Studio 中,只读列显示的数据是灰色的(比正常列的颜色稍淡一些,仔细看一下就能区分出来
2008-07-29 17:52
今天安装 MSSQL2005,由于原来我的电脑上安装了 MSSQL2000,上网查了些资料,说是可以共存,不过需要先安装 MSSQL2005, 然后安装 MSSQL2000,因为sql2000下有很多数据库,想了下,先卸载sql2000,再装sql2005,再装 sql2000 比较麻烦,于是就直接安装.
进入控制面板添加删除程序,嘿嘿,有显示了,赶快卸载掉sql2005,删除MicorSoft SQLServer的文件夹,最后还用优化大师清理了一下注册表,重启,似乎一切都过去了.
在命令行下运行 msdtc -uninstall ,卸载 msdtc 服务; 之后再安装SQL2005,问题解决,阿弥陀佛! |
SQL2005分五个版本,如下所列,
1.Enterprise(企业版),
2.Development(开发版),
3.Workgroup,(工作群版)
4.Standard,(标准版)
5.Express.(嗯,估且就叫它简易版吧)
这几个版本,我们究竟应该使用哪一版呢﹖
这是许多初学SQL2005的人最常问的问题。
我简单的比较一下Enterprise,Development和Express等三个版本:以功能言,Enterp
rise版和Development版的功能一模一样。两者的差别,除了授权不同外,最主要的差别是
:
Enterprise版的数据库引擎只能安装在Win2003Server(或其他Server)。
如果你想安装在WindowsXPPro系统上,你应该安装SQL2005Development版(开发版)。
注:有人问,什么是「数据库引擎」。嗯,数据库引擎是SQL2005的核心,是最主要的
数据库管理功能模块。没有它,就不是数据库管理系统了。
很多人下载SQL2005Express版,因为它是免费的,可以直接从微软网站上下载。但是
,它除了支持的内存比较少外,最主要的是
它缺少相当于SQL2000下的「企业管理器」和「查询分析器」。
注:SQL2000下的「企业管理器」和「查询分析器」在SQL2005已合为一,称为Managem
entStudio。
因此,如果你是初学者,如果你只是想要在家里学习学习,如果你的环境是WindowsX
PPro,那么,你应该选择的是SQL2005Development(开发版),而不是SQL2005Enterprise(
企业版)或SQL2005Express(简易版)。
SQL2005入门者,你选择正确了吗﹖
我就是从“Microsoft.SQL.Server.2005.Enterprise.Edition.DVD-ZWTiSO,请大家下载加
速"
上下载的,说明文件里显示是"标准版和企业版",但是我在安装的时候显示不能满足最低的
硬件要求(我的机器的配置:server2003企业版AMD2800+,512MDDR400内存,系统盘有16
G的空闲空间),在组件选择框里,只能看见nativeclient和安装sample数据库,这究竟是
什么原因?2005的硬件要求真的那么高吗?或者说这到底影响安装和使用吗?
在我不改变硬件的情况下怎么解决上面的问题啊
应该是满足硬件要求的,看安装时的提示是什么吧
我的环境是xpsp2EN,SQL2005Dev版,内存512MB。
首先,我的系统已经使用半年多了,装有VS2003,以前还装过SQL2000,netFramewor
k2.0beta,还有好几个beta版的SQL2005,可谓十分“肮脏”了,呵呵。最早的时候我下过
一个2005EE版,怎么也安装不上,后来发现原来是EE不支持xp=_=,然后就下了DE版的。
刚开始安装的时候吓了我一跳,丫的居然要占用我C盘1300多MB!!忍了。(我是把SQL装
在F盘的,但是居然还需要C盘1300多MB)。但是却安装失败,看了一下安装日志,天书,不
明白。只知道是nativeclient几个组件安装不成功。重复多次问题依旧。
研究安装包之后,发现里面有两个主要的文件夹,是server和tools。顾名思义,ser
ver里面肯定是服务的安装文件了,而tools里面应该是那些工具组件的安装文件。进入to
ols里面,果然有个setup,运行之,竟然安装成功了,而且只占了我C盘200多MB,好兴奋
(没有选择BI,就是那个商业智能组件,太大了)。然后重启电脑(不是必须的,只是一次s
etup之后系统慢的不行了),进入server目录下面,当然也有一个setup啦,运行之,呵呵
,果然是安装服务用的啊。这次也顺利安装成功了。再去看C盘,哈哈,一共只用了我300
多MB,竟然节省了1GB。
当然了,其实一起安装的话,也不一定会用完1300MB的空间的,因为安装结束之后还
会自动删除一些垃圾文件的。但是不管怎么说,至少让我能正常安装了。我的C盘只有140
0的空闲空间了,不知道起初安装失败是不是跟这有关系。
至此,SQL2005已经成功的在我电脑上安家了。安装的时候,如果你的电脑和我的一样
是内存不足(小于1GB),性能也不足够大(我的CPU是centrio1.3G,呵呵,装在本本上了),
建议在安装的时候把系统开始是需要运行的服务全都不选择,用的时候再手动运行好了。
运行ManagementStudio,嗯,速度还挺快的呢。连接服务器,竟然没有localhost,呵
呵,打开serverconfigurationmanager,把右边那个MSSQLSERVER运行起来。ok,这次没有
问题了。
使用一切正常,就是发现从sql2000里面备份出来的数据库在2005下只能通过sql语句
修改数据,而不能所见及所得的修改,不知道怎么回事。
btw:后来又把商业智能组件装上了,只用了C盘150MB,开心。
安装sql2005一直失败,以为提示的问题是这个com+目录问题警告所致,找了很久找到这个问
题的解决方案
sql2005_STD_X86在XPSP2下安装失败的一点经验
软环境是XPSP2,安装SQL2005_STD_X86版。
故障提示:
1。如果SQLServer安装程序失败,安装程序将回滚所安装的系统,但可能不会删除所有.m
anifest文件。解决方法是重命名这些文件,然后重新运行安装程序。有关详细信息,请参
阅“如何处理SQLServer安装过程中的COM+检查失败问题”。如果未运行Microsoft分布式
事务处理协调器(MSDTC),或者,在使用Microsoft群集服务器的情况下,如果MSDTC不是群
集资源,则可能会发生COM+错误。COM+依赖于MSDTC,而IntegrationServices中的消息队
列任务依赖于COM+。如果出现COM+错误,则只有将COM+系统正确配置后,IntegrationSer
vices中的消息队列任务才可用。
2。对性能监视器计数器注册表值执行系统配置检查失败。有关详细信息,请参阅自述文件
或SQLServer联机丛书中的“如何在SQLServer2005中为安装程序增加计数器注册表项值”
。
安装中止。
查找联机丛书,有如下提示:
1。MicrosoftSQLServer2005安装程序检查COM+是否已正确配置。如果发现配置错误,安装
程序仍将继续,但是在系统配置检查(SCC)报告中显示以下警告:
“如果SQLServer安装程序失败,安装程序将回滚所进行的安装,但可能不会删除所有的.
manifest文件。解决方法是重命名这些文件,然后重新运行安装程序。”
如果未运行Microsoft分布式事务处理协调器(MSDTC),或者,在使用Microsoft群集服务器
的情况下,如果MSDTC不是群集资源,则可能会发生COM+错误。COM+依赖于MSDTC,而Inte
grationServices中的消息队列任务依赖于COM+。如果出现COM+错误,则只有将COM+系统正
确配置后,IntegrationServices中的消息队列任务才可用。
若要使用消息队列(亦称MSMQ),请确保MSDTC正在运行并且已正确配置。如果SQLServer
安装在群集上,则MSDTC必须是群集资源。
按照下列过程重新安装COM+。
安装组件服务管理单元
在Windows桌面上,单击“开始”,然后单击“运行”。
在“打开”框中,键入MMC,然后单击“确定”。
在“控制台”窗口中,单击菜单栏上的“文件”,然后单击“添加/删除管理单元”。
在“添加/删除管理单元”窗口,单击“添加”。
在“添加独立管理单元”窗口,从管理单元列表中选择“组件服务”,然后单击“添加”
。
单击“关闭”以关闭“添加独立管理单元”窗口,然后单击“确定”以关闭“添加/删除管
理单元”窗口。
在“控制台根节点\组件服务”窗口,展开“组件服务”树。这就是当COM+出现问题时,错
误消息可能发生的地方。
再次运行SQLServer2005安装程序。如果收到错误消息,请重新安装COM+。
重新安装COM+
从控制面板的“添加或删除程序”中,单击“添加/删除Windows组件”。
在“Windows组件向导”中,不对选择做任何更改,单击“下一步”。
一直单击以完成向导,然后再次运行SQLServer2005安装程序。
2。在SQLServer安装开始前,MicrosoftSQLServer安装程序中的安装配置检查器(SCC)会验
证计数器注册表项的值。如果SCC无法验证现有的注册表项,或SCC无法运行lodctr.exe系统程序,则SCC检查会失败,致使安装受阻。
错误编辑注册表会严重损坏您的系统。更改注册表项之前,建议您备份计算机中的所有重
要数据。
手动设置计数器注册表项的增量
在MicrosoftWindows2003或WindowsXP桌面上,依次单击“开始”、“运行”,然后在“打
开”中键入regedit.exe,再单击“确定”。在Windows2000中,使用regedt32.exe启动注
册表编辑器。
定位到以下注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib]
"LastCounter"=dword:00000ed4(5276)
"LastHelp"=dword:00000ed5(5277)
上一步的“LastCounter”值(5276)必须与以下注册表项中“Perflib\009”的“Counter”
项的最大值匹配,并且上一步的“LastHelp”值(5277)必须与以下注册表项中“Perflib\
009”的“Help”项的最大值匹配。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\009]
注意009是英文中的一个示例。“LastCounter”和“LastHelp”值是由Windows动态分配的
;这两个值会因计算机的不同而不同。
如有必要,可修改“\Perflib”项中的“LastCounter”和“LastHelp”值的值:在右侧窗
格中,右键单击“LastCounter”或“LastHelp”,单击“修改”,再单击“Base="Decim
al"”,在“值数据”中设置值,再单击“确定”。如有必要,对另一个项重复以上过程,
然后关闭注册表编辑器。
再次运行SQLServer安装程序。
解决过程:
COM+检查失败不用说肯定是组件消息队列下的组件没安装或服务没启动。本机没有安装过
消息队列,找出系统盘安装消息队列组件,在组件安装中提示MSDTC服务没有启动,在这步
晕了长很时间,MSTDC在服务中怎么也找不到,后来想会不会是DTC(脑子有点笨,其实从
MSMQ这名称上就应该想到),一看果然有DistributedTransactionCoordinator(DTC),
但是这个服务启动不了,后来查找相关资料:MSDTC(DistributedTransactionCoordinato
r)服务必须在NTAUTHORITY\NetworkService帐户下运行;即使是NTAUTHORITY\NetworkSer
vice(注意,Network和Service中间有空格)也不行(至于这两个帐户的区别,在网上也
没有找到,还望大家不吝赐教)。如果登录帐户被更改,MSDTC服务会继续运行,但是在执
行的时候可能会出错。而且,在事件日志的“应用程序”里面可以发现如下的出错信息:
正在运行MSDTC服务的帐户无效。如果使用MicrosoftManagementConsole(MMC)中的“服务
”管理单元更改了服务帐户信息,就会发生这种情况。MSDTC服务将继续启动。请确认使用
“组件服务管理器”更新了MSDTC服务帐户信息。
要更改成正确的登录帐户,我们可以:
在服务中找到DistributedTransactionCoordinator服务,选择“属性”;
在“登录”选项卡中,选择“此帐户”,帐户名填写“NTAUTHORITY\NetworkService”,
密码为空;
在点击“确定”后重新启动服务。
或者,在命令行下运行msdtc-uninstall,卸载msdtc服务;
再运行msdtc-install,安装msdtc服务。
MSTDC服务成功启动,组件服务中“COM+应用程序”可以访问,上面第2项故障没去解决,
先试着安装看看有没有错误,令人惊喜,安装检查一切顺利,第2项错误同时也解决了。
当然,解决问题的过程同样的系统环境也不尽相同,在这里谈一下我安装的小挫折,希望
可以给碰到相同问题的朋友有些提示作用。
最近安装了很久的sql2005,过程中间出现很多问题,之前的com+目录警告是一个部分,处理
过之后还是发现一直无法安装成功,(为此我安装了10+)次才解决问题
在安装过程中发现以下错误
Product:OWC11
Error:错误1706。安装程序找不到需要的文件。请检查网络连接或CD-ROM驱动器状态。对
于这个问题的其他可能的解决方案,请参阅C:\ProgramFiles\MicrosoftOffice\OFFICE11
\2052\SETUP.CHM。
------------------------------------------------------------------------------
--
发现自己的ocw11没有安装导致服务器的有关组件全部无法安装,每次都是安装失败,
在microsoftocw11下载地址
找到microsoft的ocw11,选择简体中文后下载安装后发现还是出现相同的问题,
把下载下来的ocw11解压缩后观察该ocw11.xml,发现sql2005的server的setup目录下面有相
同文件名文件,再次逐次对比发现该ocw11里面的文件包里面的文件对应的setup里面全部都
有,不过发现2个chm的后缀不同,一个是10XX,一个是2052,呵呵,原来是版本不同
直接运行setup目录下面的setup,选择修复或全新安装全部提示错误的文件源,再次观察,把
setup目录下面对应的的ocw11文件全部拷贝到硬盘上面,再次运行修复成功,之后安装sql2
005终于一路成功,困扰了我2天的问题终于解决,特此把本文于全体学习sql2005的朋友分享
,希望大家少走弯路.一起交流sql的有关功能
50种方法优化SQL Server数据库查询(有N多错别字)
http://database.51cto.com/art/200612/35820.htm
查询速度慢的原因很多,常见如下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化
可以通过如下方法来优化查询 :
1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3、升级硬件
4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
5、提高网速;
6、扩大服务器的内存,Windows 2000和SQLserver 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server?2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。
7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert, Delete还不能并行处理。
8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。
9、DB Server 和APPLicationServer 分离;OLTP和OLAP分离
10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图')
a、在实现分区视图之前,必须先水平分区表
b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCCINDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法上有很大的讲究,下面列出常见的要点:首先, DBMS处理查询计划的过程是这样的:
1、 查询语句的词法、语法检查
2、 将语句提交给DBMS的查询优化器
3、 优化器做代数优化和存取路径的优化
4、 由预编译模块生成查询规划
5、 然后在合适的时间提交给系统处理执行
6、 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。
13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
14、SQL的注释申明对执行没有任何影响
15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。选择这个并发选项 OPTIMISTIC WITH ROWVERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 Select 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 Select 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新NOLOCK 未锁定未锁定未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定未锁定更新其它 未锁定 未锁定 未锁定 更新 *指定NOLOCK 提示将使指定了该提示的表在游标内是只读的。
16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
17、注意UNion和UNionall 的区别。UNION all好
18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
19、查询时不要返回不需要的行、列
20、用sp_configure 'query governor costlimit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME设置锁的时间
21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=","!>", "!<", "NOT", "NOT EXISTS","NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在Where字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:Where SUBSTRING(firstname,1,1)= 'm'改为Where firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT","NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。
23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: Select * FROM PersonMember (INDEX = IX_Title) Whereprocessid IN ('男','女')
25、将需要查询的结果预先计算好放在表中,查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
26、MIN() 和MAX()能使用到合适的索引。
27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程序质量高,并且执行的速度快。
28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌Insert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
29、Between在某些时候比IN 速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * fromchineseresume where title in ('男','女') Select * fromchineseresume where between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。
30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。
32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
34、没有必要时不要用DISTINCT和ORDERBY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNIONALL一样的道理。
select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
'JCNAD00333138','JCNAD00303570','JCNAD00303569',
'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
'JCNAD00254567','JCNAD00254585','JCNAD00254608',
'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
'JCNAD00279196','JCNAD00268613') order by postdate desc
35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
36、当用Select INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是 select INTO. drop table t_lxh begin tran select * intot_lxh from chineseresume where name = 'XYZ' --commit 在另一个连接中Select * from sysobjects可以看到 Select INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。
37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
38、一次更新多条记录比分多次更新每次一条快,就是说批处理好
39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好
40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:
a、计算字段的表达是确定的
b、不能用在TEXT,Ntext,Image数据类型
c、必须配制如下选项 ANSI_NULLS = ON,ANSI_PADDINGS = ON, …….
41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源,如果返回大的结果采用存储过程
42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快
43、Select COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count(Field ofnull) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的!!!
44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。
45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现
46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。
Process:
1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。
2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。
4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk QueueLength计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。
47、分析select emp_name form employeewhere salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。
48、查询的关联同写的顺序
select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = '号码')
select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = '号码', A = '号码')
select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码', A = '号码')
49、
(1)IF 没有输入负责人代码 THEN code1=0code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL语句为: Select 负责人名 FROM P2000 Where 负责人代码>=:code1 AND负责人代码 <=:code2
(2)IF 没有输入负责人代码 THEN Select负责人名 FROM P2000 ELSE code= 负责人代码 Select 负责人代码 FROM P2000 Where 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件; 在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最快的查询运算。我们写程序不要怕麻烦
50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说明索引越小越好。
begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by ReferenceID
select * from @local_variable where Fid > 40 and fid <= 60
end
和
begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from @local_variable where Fid > 40 and fid <= 60
end
的不同
begin
create table #temp (FID int identity(1,1),ReferenceID varchar(20))
insert into #temp (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from #temp where Fid > 40 and fid <= 60 drop table #temp
end
存储过程编写经验和优化措施
From:网页教学网
一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对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. 注意存储过程中参数和数据类型的关系。
xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。
b)索引的使用规范:
i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。
ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引
iii. 避免对大表查询时进行table scan,必要时考虑新建索引。
iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
v. 要注意索引的维护,周期性重建索引,重新编译存储过程。
c)tempdb的使用规范:
i. 尽量避免使用distinct、order by、groupby、having、join、cumpute,因为这些语句会加重tempdb的负担。
ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。
iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替createtable,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。
iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。
v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。
d)合理的算法使用:
根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on,set statistics time on , set showplan on 等。
解析:Microsoft SQL Server中的锁模式
在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括:
1.共享锁 SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM AUTHORS”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。
2.更新锁更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
3.排它锁 排它锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。
4.结构锁 执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁。当编译查询时,使用架构稳定性 (Sch-S) 锁。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它锁。因此在编译查询时,其它事务(包括在表上有排它锁的事务)都能继续运行。但不能在表上执行 DDL 操作。
5.意向锁 意向锁说明SQL Server有在资源的低层获得共享锁或排它锁的意向。例如,表级的共享意向锁说明事务意图将排它锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置排它锁来修改数据。共享式排它锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置排它锁。
6.大容量更新锁 当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新锁。大容量更新锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。
详细介绍优化SQL Server 2000的设置
SQL Server已经为了优化自己的性能而进行了良好的配置,比今天市场其他的关系型数据库都要好得多。然而,你仍然有几项设置需要进行修改,以便你的数据库每分钟可以处理更多的事务(TPM)。本篇文章的目的就是讨论这些设置。我们忽略那些可以通过硬件配置或者表或者索引设计提高的性能,因为这些内容在本篇文章范围之外。
破碎页面检测
在我们开始讨论服务器配置开关之前,让我们快速浏览一下你的模型数据库--或者说用作构建新的数据库的基础的模板。默认情况下,你可以在数据库中创建存储过程、函数等类似的东西,随后他们将会被加入新创建的数据库中。
要优化性能,你也许想要关闭模型数据库中的破碎页面检测。当一个页面被成功写入磁盘的时候,破碎页面检测进行识别。如果激活了的话,你可以看到每个写操作对性能产生的每个细小的影响。大多数现代的磁盘阵列都有板上电池,使得阵列可以在突然断电的情况下完成所有的写操作--引起破碎页面的最频繁原因。
以下的步骤可以接受如何关闭破碎页面检测:
exec sp_dboption 'model', 'torn page detection', 'false'
这篇基础知识资源可以为你提供更多有关这个设置的信息。
大多数的配置是通过系统存储过程sp_configure完成的。要显示服务器的全部设置列表以便定制,你可以输入如下命令:
sp_configure 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
你可以配置的选项的数量根据你的SQL Server的版本、服务包,以及位数版本(64位的SQLServer比32位的选项要多)而定。我将直接讨论最能影响SQL Server性能优化的选项。
Affinitymask: Affinity mask让你可以控制SQL Server使用哪个处理器。对于大多数情况,你不应该接触这个设置,让操作系统控制处理器关系。然而,你也许想要用这个选项来将某个处理器专门用于另一个进程(例如,MSSearch 或者 SQL Server磁盘 IO ,以及 SQL Server的平衡)。参考基础知识资源获取更多有关这个设置的信息。
Aweenabled: Awe的启动可以让SQL Server Enterprise版本运行在Windows 2000以及以上高级服务器上,或者Windows 2003 Enterprise以及以上的版本使用超过4GB的内存。如果你的服务器符合这些条件的话,就激活这个设置吧。
并行成本极限:当查询需要进行并行处理的时候,并行的成本极限就定下来了。默认情况是五秒钟。将这个数值改为稍低的数值,俄可以让更多个查询获得并行处理,但是这也会引起CPU瓶颈。这个设置只有在多个处理器的机器上才会起作用。
填充因子:填充因子设置了在创建聚簇索引的时候用来自动填充的因子。在频繁插入的表中,将数值从默认的90%设置为较低的数值,你会获得收益。
轻量级缓冲池:这个设置启动了光纤模式。使用这个选项在CPU利用率很高的8路及其以上的服务器上。这可以让光纤同时为每个线程提供服务,同时在默认情况下运行在每个处理器上。某些任务可以从这些光纤中获得优势。
并行的最大程度:当服务器可以使用并行或者不能使用并行,或者是当某个数量的处理器可以用于并行操作的时候,这个设置就确定了。并行就是多个处理器上发生多个处理。例如,查询的并行操作可以在不同的处理器上同时处理。
服务器最大内存(MB):如果你在SQL Server上运行了其他的处理,并且有足够的内存,那么你有可能想要留出512MB的内存给操作系统和这些进程。例如,你可以在MSSearch或者在本地运行大量的代理的情况下将其设置为512。
最大工作线程:最大工作线程设置与ADO.net中的连接池有些类似。通过这个设置,任何超过限制(255个用户)的用户连接都可以在线程池中等待,直到为某个连接服务的线程得到释放,就好像是ADO.net中的连接与连接池共享。如果你有很大量的连接,并且大量的内存,那么你就可以提高这个数值。
网络包尺寸(B):这个设置控制了网络中传输到你的客户端的包的尺寸。在有损耗的网络中(例如电话线),你可能想要将这个参数设置为比较低的数值,墨人数值是4096。在连接良好的网络中,你可以提高这个设置,特别是涉及BLOB的大型批处理操作。
优先推进:这个设置为SQL Server提供了处理器的推动。在任务管理器中,点击进程标签,定位SQL Server的位置,然后右击它。选择“设置优先级别”。注意,SQL Server应该运行在正常的优先级别上。输入如下命令:
Sp_configure 'priority boost', 1
Reconfigure with override
然后重新启动你的SQL Server。在任务管理器中察看SQL Server现在运行在什么优先级别上。它应该是在高优先级上。SQL Server应该比其他的用户进程运行优先级别要高。在专用于SQL Server的服务器上使用这个设置。
总结
本篇讨论了最常见的SQL Server优化设置。在做出改变之前和之后分别在测试环境中进行基线确定是非常重要的,可以据此来评估在典型的负载下,改变对你的系统的影响。
SQL Server 数据库中关于死锁的分析
SQL Server数据库发生死锁时不会像ORACLE那样自动生成一个跟踪文件。有时可以在[管理]->[当前活动] 里看到阻塞信息(有时SQL Server企业管理器会因为锁太多而没有响应).
设定跟踪1204:
USE MASTER
DBCC TRACEON (1204,-1)
显示当前启用的所有跟踪标记的状态:
DBCCTRACESTATUS(-1)
取消跟踪1204:
DBCCTRACEOFF (1204,-1)
在设定跟踪1204后,会在数据库的日志文件里显示SQL Server数据库死锁时一些信息。但那些信息很难看懂,需要对照SQL Server联机丛书仔细来看。根据PAG锁要找到相关数据库表的方法:
DBCCTRACEON (3604)
DBCC PAGE (db_id,file_id,page_no)
DBCC TRACEOFF (3604)
请参考sqlservercentral.com上更详细的讲解.但又从CSDN学到了一个找到死锁原因的方法。我稍加修改, 去掉了游标操作并增加了一些提示信息,写了一个系统存储过程sp_who_lock.sql。代码如下:
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[sp_who_lock]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_who_lock]
GO
/**//********************************************************
// 创建 : fengyu 邮件 : [email protected]
// 日期 :2004-04-30
// 修改 : 从http://www.csdn.net/develop/Read_Article.asp?id=26566
// 学习到并改写
// 说明 : 查看数据库里阻塞和死锁情况
********************************************************/
use master
go
create procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR<>0 RETURN @@ERROR
insert into #tmp_lock_who(spid,bl) select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses
where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
IF @@ERROR<>0 RETURN @@ERROR
-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who
IF @@ERROR<>0 RETURN @@ERROR
if @intCountProperties=0
select '现在没有阻塞和死锁信息' as message
-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
begin
if @spid =0
select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10))
+ '进程号,其执行的SQL语法如下'
else
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被'
+ '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
end
-- 循环指针下移
set @intCounter = @intCounter + 1
end
drop table #tmp_lock_who
return 0
end
需要的时候直接调用:
sp_who_lock
就可以查出引起死锁的进程和SQL语句.
SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。如果想知道其它tracenum参数的含义,请看www.sqlservercentral.com文章
我们还可以设置锁的超时时间(单位是毫秒), 来缩短死锁可能影响的时间范围:
例如:
use master
seelct @@lock_timeout
set lock_timeout 900000
-- 15分钟
seelct @@lock_timeout
优化SQLServer索引的小技巧
SQLServer中有几个可以让你检测、调整和优化SQL Server性能的工具。在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识。
关于索引的常识
影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引。当考察建立什么类型的索引时,你应当考虑数据类型和保存这些数据的 column。同样,你也必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型。
索引的类型
如果column保存了高度相关的数据,并且常常被顺序访问时,最好使用clustered索引,这是因为如果使用clustered索引,SQL Server会在物理上按升序(默认)或者降序重排数据列,这样就可以迅速的找到被查询的数据。同样,在搜寻控制在一定范围内的情况下,对这些 column也最好使用clustered索引。这是因为由于物理上重排数据,每个表格上只有一个clustered索引。
与上面情况相反,如果columns包含的数据相关性较差,你可以使用nonculstered索引。你可以在一个表格中使用高达249个nonclustered索引--尽管我想象不出实际应用场合会用的上这么多索引。
当表格使用主关键字(primary keys),默认情况下SQL Server会自动对包含该关键字的column(s)建立一个独有的cluster索引。很显然,对这些column(s)建立独有索引意味着主关键字的唯一性。当建立外关键字(foreign key)关系时,如果你打算频繁使用它,那么在外关键字cloumn上建立nonclustered索引不失为一个好的方法。如果表格有 clustered索引,那么它用一个链表来维护数据页之间的关系。相反,如果表格没有clustered索引,SQL Server将在一个堆栈中保存数据页。
数据页
当索引建立起来的时候,SQLServer就建立数据页(datapage),数据页是用以加速搜索的指针。当索引建立起来的时候,其对应的填充因子也即被设置。设置填充因子的目的是为了指示该索引中数据页的百分比。随着时间的推移,数据库的更新会消耗掉已有的空闲空间,这就会导致页被拆分。页拆分的后果是降低了索引的性能,因而使用该索引的查询会导致数据存储的支离破碎。当建立一个索引时,该索引的填充因子即被设置好了,因此填充因子不能动态维护。
为了更新数据页中的填充因子,我们可以停止旧有索引并重建索引,并重新设置填充因子(注意:这将影响到当前数据库的运行,在重要场合请谨慎使用)。 DBCC INDEXDEFRAG和DBCCDBREINDEX是清除clustered和nonculstered索引碎片的两个命令。INDEXDEFRAG是一种在线操作(也就是说,它不会阻塞其它表格动作,如查询),而DBREINDEX则在物理上重建索引。在绝大多数情况下,重建索引可以更好的消除碎片,但是这个优点是以阻塞当前发生在该索引所在表格上其它动作为代价换取来得。当出现较大的碎片索引时,INDEXDEFRAG会花上一段比较长的时间,这是因为该命令的运行是基于小的交互块(transactional block)。
填充因子
当你执行上述措施中的任何一个,数据库引擎可以更有效的返回编入索引的数据。关于填充因子(fillfactor)话题已经超出了本文的范畴,不过我还是提醒你需要注意那些打算使用填充因子建立索引的表格。
在执行查询时,SQL Server动态选择使用哪个索引。为此,SQL Server根据每个索引上分布在该关键字上的统计量来决定使用哪个索引。值得注意的是,经过日常的数据库活动(如插入、删除和更新表格),SQL Server用到的这些统计量可能已经“过期”了,需要更新。你可以通过执行DBCC SHOWCONTIG来查看统计量的状态。当你认为统计量已经“过期”时,你可以执行该表格的UPDATE STATISTICS命令,这样SQL Server就刷新了关于该索引的信息了。
建立数据库维护计划
SQL Server提供了一种简化并自动维护数据库的工具。这个称之为数据库维护计划向导(Database Maintenance Plan Wizard ,DMPW)的工具也包括了对索引的优化。如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引所带来的工作量。如果你不想自动定期刷新索引统计量,你还可以在DMPW中选择重新组织数据和数据页,这将停止旧有索引并按特定的填充因子重建索引。
Sybase SQL Server索引的使用和优化
在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡 量应用系统成败的标准。而采用索引来加快数据处理速度也成为广大数据库用户所 接受的优化方法。
在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引。因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了。所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程。但是,索引并不总是提高系统的性能,在增、删、改操作中索引的存在会增加一定的工作量,因此,在适当的地方增加适当的索引并从不合理的地方删除次优的索引,将有助于优化那些性能较差的SQL Server应用。实践表明,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案。本文就SQL Server索引的性能问题进行了一些分析和实践。
一、聚簇索引(clustered indexes)的使用
聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。建立聚簇索引的思想是:
1、 大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。
2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、>、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
3、 在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。
4、 在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。
5、 选择聚簇索引应基于where子句和连接操作的类型。聚簇索引的侯选列是:
● 主键列,该列在where子句中使用并且插入是随机的。
● 按范围存取的列,如pri_order > 100 and pri_order < 200 。
● 在groupby或order by中使用的列。
● 不经常修改的列。
● 在连接操作中使用的列。
二、非聚簇索引(nonclustered indexes)的使用
SQLServer缺省情况下建立的索引是非聚簇索引,由于非聚簇索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。换句话说非聚簇索引具有在索引结构和数据本身之间的一个额外级。一个表如果没有聚簇索引时,可有250个非聚簇索引。每个非聚簇索引提供访问数据的不同排序顺序。在建立非聚簇索引时,要权衡索引对查询速度的加快与降低修改速度之间的利弊。另外,还要考虑这些问题:
● 索引需要使用多少空间。
● 合适的列是否稳定。
● 索引键是如何选择的,扫描效果是否更佳。
● 是否有许多重复值。
对更新频繁的表来说,表上的非聚簇索引比聚簇索引和根本没有索引需要更多的额外开销。对移到新页的每一行而言,指向该数据的每个非聚簇索引的页级行也必须更新,有时可能还需要索引页的分理。从一个页面删除数据的进程也会有类似的开销,另外,删除进程还必须把数据移到页面上部,以保证数据的连续性。所以,建立非聚簇索引要非常慎重。非聚簇索引常被用在以下情况:
● 某列常用于集合函数(如Sum,....)。
● 某列常用于join,order by,group by。
● 查寻出的数据不超过表中数据量的20%。
三、覆盖索引(covering indexes)的使用
覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这 种索引之所以比较快也正是因为索引页中包含了查寻所必须的数据,不需去访 问数据页。 如果非聚簇索引中包含结果数据,那么它的查询速度将快于聚簇索引。
但是由于覆盖索引的索引项比较多,要占用比较大的空间。而且update 操 作会引起索引值改变。所以如果潜在的覆盖查询并不常用或不太关键,则覆盖索引的增加反而会降低性能。
四、索引的选择技术
p_detail是住房公积金管理系统中记录个人明细的表,有890000行,观察在不同索引下的查询运行效果,测试在C/S环境下进行,客户机是 IBM PII350(内存64M),服务器是DEC Alpha1000A(内存128M),数据库为SYBASE11.0.3。
1、select count(*) from p_detail where op_date>’19990101’ andop_date<’19991231’ and pri_surplus1>300
2、select count(*),sum(pri_surplus1) from p_detail where op_date>’19990101’ andpay_month between ‘199908’ and ’199912’
不建任何索引 查询1 1分15秒
查询2 1分7秒
在op_date上建非聚簇索引 查询1 57秒
查询2 57秒
在op_date上建聚簇索引 查询1 <1秒
查询2 52秒
在pay_month、op_date、pri_surplus1上建索引 查询1 34秒
查询2 <1秒
在op_date、pay_month、pri_surplus1上建索引 查询1<1秒
查询2 <1秒
从以上查询效果分析,索引的有无,建立方式的不同将会导致不同的查询效果,选择什么样的索引基于用户对数据的查询条件,这些条件体现于where从句和join表达式中。一般来说建立索引的思路是:
(1)、主键时常作为where子句的条件,应在表的主键列上建立聚簇索引,尤其当经常用它作为连接的时候。
(2)、有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。
(3)、经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。
(4)、如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。
(5)、在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。
(6)、在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索
引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。
五、索引的维护
上面讲到,某些不合适的索引影响到SQL Server的性能,随着应用系统的运行,数据不断地发生变化,当数据变化达到某一个程度时将 会影响到索引的使用。这时 需要用户自己来维护索引。索引的维护包括:
1、重建索引
随着数据行的插入、删除和数据页的分裂,有些索引页可能只包含几页数据,另外应用在执行大块I/O的时候,重建非聚簇索引可以降低分片,维护大块I/O的效率。重建索引实际上是重新组织B-树空间。在下面情况下需要重建索引:
(1)、数据和使用模式大幅度变化。
(2)、排序的顺序发生改变。
(3)、要进行大量插入操作或已经完成。
(4)、使用大块I/O的查询的磁盘读次数比预料的要多。
(5)、由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算。
(6)、dbcc检查出索引有问题。
当重建聚簇索引时,这张表的所有非聚簇索引将被重
建.
2、索引统计信息的更新
当在一个包含数据的表上创建索引的时候,SQL Server会创建分布数据页来存放有关索引的两种统计信息:分布表和密度表。优化器利用这个页来判断该索引对某个特定查询是否有用。但这个统计信息并不动态地重新计算。这意味着,当表的数据改变之后,统计信息有可能是过时的,从而影响优化器追求最有工作的目标。因此,在下面情况下应该运行update statistics命令:
(1)、数据行的插入和删除修改了数据的分布。
(2)、对用truncate table删除数据的表上增加数据行。
(3)、修改索引列的值。
六、结束语
实践表明,不恰当的索引不但于事无补,反而会降低系统的执行性能。因为大量的索引在插入、修改和删除操作时比没有索引花费更多的系统时间。例如下面情况下建立的索引是不恰当的:
● 在查询中很少或从不引用的列不会受益于索引,因为索引很少或从来不必搜索基于这些列的行。
● 只有两个或三个值的列,如男性和女性(是或否),从不会从索引中得到好处。
另外,鉴于索引加快了查询速度,但减慢了数据更新速度的特点。可通过在一个段上建表,而在另一个段上建其非聚簇索引,而这两段分别在单独的物理设备上来改善操作性能。
为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需要考虑的的第一条设计决策就是如何加密存储数据,以此来保证它的安全,免受被他人窥测。
SQL Server中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下SQL Server欠缺什么是明智的,或者是对于SQL Server中的加密部分你不应该做什么。
首先,SQL Server有两个内置的密码函数——即,pwdencrypt() 和 pwdcompare()。同时,还有两个SQL Server用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储; pwdcompare()将提供的字符串与哈希后的字符串进行比较。不幸的是,这个哈希函数不是非常安全,它可以通过字典攻击算法被破解(类似命令行应用程序!)。
这些函数随着SQL Server的版本发展而不断进行修改,这也是另一个没有使用它们的原因。早期版本的SQL Server对密码进行的哈希,在后来的版本中无法解密,所以如果你依赖一个版本中的函数,那么当升级的时候,所有你的加密数据就都没有用了,除非你可以首先对其解密——这也就违背了加密的最初的目的。
第二,你可能会尝试去创建一个针对你的数据库的自制的加密解决方案,但是有以下三个理由说明你不要这样做:
除非你是加密专家,否则胡乱编写的加密系统只会提供非常低级的价值不高的保护。新鲜的是,单向密码哈希或者 "ROTx "形式的加密几乎不需要费事就可以被轻松打败。
如果由于你自己的能力的缺乏而导致加密被破解,那么你的数据就完蛋了。你需要将所有的东西进行没有加密的备份,是吗?(即使你加密了,那里有没有安全漏洞?)
当市面上提供有专业级别的,具有工业强度的加密解决方案的时候,你就不值得花费时间去自己做。把你的时间用于构建一个好的,坚固的数据库,而不是再重新发明一次车轮。
那么,什么才是好的加密数据的方式呢?
对于新手,微软提供了一个自己生成的加密解决方案,CryptoAPI 。对于轻量级的加密,军用级别的安全就不在考虑范围之内,它具有相对容易实现的优势:管理员可以安装一个名为CAPICOM 的ActiveX 控制,它可以在T-SQL存储过程中提供CryptoAPI 功能。CAPICOM 支持各种类型的双向加密和单向哈希算法,所以管理员可以挑选最适合应用程序的问题的部分。
如果你对使用微软的解决方案不感兴趣,还有一些很好的第三方的方案可以使用。一家名为ActiveCrypt 的软件有限责任公司制造了XP_CRYPT ,它是SQL Server的插件,可以在视图、程序和触发器中通过扩展存储过程和用户自定义函数(在SQL Server 2000中)来完成加密。你可以下载一个支持无线的MD5,DES ,以及SHA1哈希的免费版本的应用程序; 其他的加密模型就是在比特深度上进行的。(完全版本是无限的。)在你自己的代码中,你可以使用XP_CRYPT,与ActiveX 控制一样(在受限的免费版本中)。对于ASP程序员来说,一个名为AspEncrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式。
对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者,大家可以在Windows系统中持续使用加密文件系统。然而,你必须保存加密密钥的备份,在出现问题的时候,这个数据有可能会丢失。对于后者,有IPSec和SQL Server自己的SSL加密,都是SQL Server和Windows自带的大家的主要精力应该放在避免以明文存储敏感数据,因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节。
假如您在安装SQL Server 2005时出现计数器错误,在搜索过所有的方法都不适用的情况下可以采用以下方法:
将4个计数器删除:(如果没有说清楚是哪个计数器的错误)
运行 cmd
unlodctrw3svc
unlodctrmsftpsvc
unlodctrASP
unlodctrinetinfo
执行下面的代码片段后,重新安装SQLServer2005就不会有问题了。
lodctrw3ctrs.ini
lodctrftpctrs.ini
lodctraxperf.ini
lodctrinfoctrs.ini
0 操作成功完成。
1 功能错误。
2 系统找不到指定的文件。
3 系统找不到指定的路径。
4 系统无法打开文件。
5 拒绝访问。
6 句柄无效。
7 存储控制块被损坏。
8 存储空间不足,无法处理此命令。
9 存储控制块地址无效。
10 环境错误。
11 试图加载格式错误的程序。
12 访问码无效。
13 数据无效。
14 存储器不足,无法完成此操作。
15 系统找不到指定的驱动器。
16 无法删除目录。
17 系统无法将文件移到不同的驱动器。
18 没有更多文件。
19 介质受写入保护。
20 系统找不到指定的设备。
21 设备未就绪。
22 设备不识别此命令。
23 数据错误 (循环冗余检查)。
24 程序发出命令,但命令长度不正确。
25 驱动器无法找出磁盘上特定区域或磁道的位置。
26 无法访问指定的磁盘或软盘。
27 驱动器找不到请求的扇区。
28 打印机缺纸。
29 系统无法写入指定的设备。
30 系统无法从指定的设备上读取。
31 连到系统上的设备没有发挥作用。
32 进程无法访问文件,因为另一个程序正在使用此文件。
33 进程无法访问文件,因为另一个程序已锁定文件的一部分。
36 用来共享的打开文件过多。
38 到达文件结尾。
39 磁盘已满。
50 不支持网络请求。
51 远程计算机不可用 。
52 在网络上已有重复的名称。
53 找不到网络路径。
54 网络忙。
55 指定的网络资源或设备不再可用。
56 已到达网络 BIOS 命令限制。
57 网络适配器硬件出错。
58 指定的服务器无法运行请求的操作。
59 发生意外的网络错误。
60 远程适配器不兼容。
61 打印机队列已满。
62 无法在服务器上获得用于保存待打印文件的空间。
63 删除等候打印的文件。
64 指定的网络名不再可用。
65 拒绝网络访问。
66 网络资源类型错误。
67 找不到网络名。
68 超过本地计算机网卡的名称限制。
69 超出网络 BIOS 会话限制。
70 远程服务器已暂停,或正在启动过程中。
71 当前已无法再同此远程计算机连接,因为已达到计算机的连接数目极限。
72 已暂停指定的打印机或磁盘设备。
80 文件存在。
82 无法创建目录或文件。
83 INT 24 失败。
84 无法取得处理此请求的存储空间。
85 本地设备名已在使用中。
86 指定的网络密码错误。
87 参数错误。
88 网络上发生写入错误。
89 系统无法在此时启动另一个进程。
100 无法创建另一个系统信号灯。
101 另一个进程拥有独占的信号灯。
102 已设置信号灯且无法关闭。
103 无法再设置信号灯。
104 无法在中断时请求独占的信号灯。
105 此信号灯的前一个所有权已结束。
107 程序停止,因为替代的软盘未插入。
108 磁盘在使用中,或被另一个进程 锁定。
109 管道已结束。
110 系统无法打开指定的 设备或文件。
111 文件名太长。
112 磁盘空间不足。
113 无法再获得内部文件的标识。
114 目标内部文件的标识不正确。
117 应用程序制作的 IOCTL 调用错误。
118 验证写入的切换参数值错误。
119 系统不支持请求的命令。
120 此功能只被此系统支持。
121 信号灯超时时间已到。
122 传递到系统调用的数据区太小。
123 文件名、目录名或卷标语法不正确。
124 系统调用级别错误。
125 磁盘没有卷标。
126 找不到指定的模块。
127 找不到指定的程序。
128 没有等候的子进程。
130 试图使用操作(而非原始磁盘 I/O)的已打开磁盘分区的文件句柄。
131 试图移动文件指针到文件开头之前。
132 无法在指定的设备或文件上设置文件指针。
133 包含先前加入驱动器的驱动器无法使用 JOIN 或 SUBST 命令。
134 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
135 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
136 系统试图解除未合并驱动器的 JOIN。
137 系统试图解除未替代驱动器的 SUBST。
138 系统试图将驱动器合并到合并驱动器上的目录。
139 系统试图将驱动器替代为替代驱动器上的目录。
140 系统试图将驱动器合并到替代驱动器上的目录。
141 系统试图替代驱动器为合并驱动器上的目录。
142 系统无法在此时运行 JOIN 或 SUBST。
143 系统无法将驱动器合并到或替代为相同驱动器上的目录。
144 目录并非根目录下的子目录。
145 目录非空。
146 指定的路径已在替代中使用。
147 资源不足,无法处理此命令。
148 指定的路径无法在此时使用。
149 企图将驱动器合并或替代为驱动器上目录是上一个替代的目标的驱动器。
150 系统跟踪信息未在 CONFIG.SYS 文件中指定,或不允许跟踪。
151 为 DosMuxSemWait 指定的信号灯事件个数错误。
152 DosMuxSemWait 不可运行。已设置过多的信号灯。
153 DosMuxSemWait 清单错误。
154 输入的卷标超过目标文件系统的 长度限制
155 无法创建另一个线程。
156 接收进程已拒绝此信号。
157 段已被放弃且无法锁定。
158 段已解除锁定。
159 线程标识的地址错误。
160 传递到 DosExecPgm 的参数字符串错误。
161 指定的路径无效。
162 信号已暂停。
164 无法在系统中创建更多的线程。
167 无法锁定文件区域。
170 请求的资源在使用中。
173 对于提供取消区域进行锁定的请求不明显。
174 文件系统不支持锁定类型的最小单元更改。
180 系统检测出错误的段号。
183 当文件已存在时,无法创建该文件。
186 传递的标志错误。
187 找不到指定的系统信号灯名称。
196 操作系统无法运行此应用程序。
197 操作系统当前的配置不能运行此应用程序。
199 操作系统无法运行此应用程序。
错误:1807
在sqlserver创建数据库的时候,系统有时候会提示:未能获得数据库model上的排它锁,自然数据库无法创建
解决方案:
--试试查询分析器中执行下面的语句看看能否建库
use master
go
declare hcforeach cursor global for select 'kill '+rtrim(spid) fromsysprocesses where dbid=db_id('model')
exec sp_msforeach_worker '?'
go
create database aa
SQL SERVER数据类型
字段类型 |
描述 |
bit |
0或1的整型数字 |
int |
从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字 |
smallint |
从-2^15(-32,768)到2^15(32,767)的整型数字 |
tinyint |
从0到255的整型数字 |
|
|
decimal |
从-10^38到10^38-1的定精度与有效位数的数字 |
numeric |
decimal的同义词 |
|
|
money |
从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十 |
smallmoney |
从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十 |
|
|
float |
从-1.79E+308到1.79E+308可变精度的数字 |
real |
从-3.04E+38到3.04E+38可变精度的数字 |
|
|
datetime |
从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒 |
smalldatetime |
从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟 |
|
|
timestamp |
时间戳,一个数据库宽度的唯一数字 |
uniqueidentifier |
全球唯一标识符GUID |
|
|
char |
定长非Unicode的字符型数据,最大长度为8000 |
varchar |
变长非Unicode的字符型数据,最大长度为8000 |
text |
变长非Unicode的字符型数据,最大长度为2^31-1(2G) |
|
|
nchar |
定长Unicode的字符型数据,最大长度为8000 |
nvarchar |
变长Unicode的字符型数据,最大长度为8000 |
ntext |
变长Unicode的字符型数据,最大长度为2^31-1(2G) |
|
|
binary |
定长二进制数据,最大长度为8000 |
varbinary |
变长二进制数据,最大长度为8000 |
image |
变长二进制数据,最大长度为2^31-1(2G) |
在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
在SQL Server 中每个变量、参数、表达式等都有数据类型。系统提供的数据类型分为几大类,如表4-2所示。
其中,BIGINT、SQL_VARIANT 和TABLE 是SQLServer 2000 中新增加的3 种数据类型。下面分类讲述各种数据类型。
一、 整数数据类型
整数数据类型是最常用的数据类型之一。
1、INT(INTEGER)
INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147,483 ,648)到2的31次方-1 (2 ,147,483,647) 之间的所有正负整数。每个INT类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINT
SMALLINT 数据类型存储从-2的15次方(-32, 768) 到2的15次方-1( 32,767 )之间的所有正负整数。每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3、TINYINT
TINYINT数据类型存储从0 到255之间的所有正整数。每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINT
BIGINT 数据类型存储从-2^63 (-9 ,223,372, 036, 854,775, 807) 到2^63-1( 9,223, 372, 036 ,854,775, 807)之间的所有正负整数。每个BIGINT类型的数据占用8个字节的存储空间。
二、 浮点数据类型
浮点数据类型用于存储十进制小数。浮点数值的数据在SQLServer 中采用上舍入(Round up 或称为只入不舍)方式进行存储。所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。如:对3.14159265358979分别进行2 位和12位舍入,结果为3.15和3.141592653590。
1、REAL数据类型
REAL数据类型可精确到第7 位小数,其范围为从-3.40E-38 到3.40E +38。每个REAL类型的数据占用4 个字节的存储空间。
2、FLOAT
FLOAT 数据类型可精确到第15 位小数,其范围为从-1.79E-308 到1.79E +308。 每个FLOAT类型的数据占用8 个字节的存储空间。FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT数据的精度。n 为1到15 之间的整数值。当n 取1 到7 时,实际上是定义了一个REAL类型的数据,系统用4 个字节存储它;当n 取8 到15 时,系统认为其是FLOAT类型,用8 个字节存储它。
3、DECIMAL
DECIMAL数据类型可以提供小数所需要的实际存储空间,但也有一定的限制,您可以用2 到17 个字节来存储从-10的38次方-1 到10的38次方-1 之间的数值。可将其写为DECIMAL[p [s] ]的形式,p 和s 确定了精确的比例和数位。其中p 表示可供存储的值的总位数(不包括小数点),缺省值为18; s 表示小数点后的位数,缺省值为0。 例如:decimal(15 5),表示共有15 位数,其中整数10 位,小数5。 位表4-3列出了各精确度所需的字节数之间的关系。
4、NUMERIC
NUMERIC数据类型与DECIMAL数据类型完全相同。
注意:SQL Server 为了和前端的开发工具配合,其所支持的数据精度默认最大为28位。但可以通过使用命令来执行sqlserver.exe程序以启动SQLServer,可改变默认精度。命令语法如下:SQLSERVR[/Dmaster_device_path][/P precisim_leve1]
例4-4: 用最大数据精度38 启动SQLServer
sqlservr /d c:\ Mssql2000\data\master.dat /p38
/*在使用了/P 参数后,如果其后没有指定具体的精度数值,则默认为38 位./*
三、二进制数据类型
1、BINARY
BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY类型数据占用n+4 个字节的存储空间。在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上述的“0xabc”会被系统自动变为“0x0abc”。
2、VARBINARY
VARBINARY 数据类型的定义形式为VARBINARY(n)。 它与BINARY类型相似,n 的取值也为1 到8000,若输入的数据过长,将会截掉其超出部分。不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度为实际数值长度+4个字节。当BINARY数据类型允许NULL值时,将被视为VARBINARY数据类型。
一般情况下,由于BINARY 数据类型长度固定,因此它比VARBINARY类型的处理速度快。
四、 逻辑数据类型
BIT: BIT数据类型占用1 个字节的存储空间,其值为0 或1 。如果输入0 或1 以外的值,将被视为1。BIT 类型不能定义为NULL 值(所谓NULL值是指空值或无意义的值)。
五、字符数据类型
字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号’或双引号” 。
1 CHAR
CHAR 数据类型的定义形式为CHAR[ (n) 。 以CHAR类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 到8000, 即可容纳8000个ANSI 字符。若不指定n 值,则系统默认值为1。若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
2、NCHAR
NCHAR 数据类型的定义形式为NCHAR[(n)]。 它与CHAR类型相似。不同的是NCHAR数据类型n 的取值为1 到4000。 因为NCHAR类型采用UNICODE 标准字符集(CharacterSet)。UNICODE 标准规定每个字符占用两个字节的存储空间,所以它比非UNICODE标准的数据类型多占用一倍的存储空间。使用UNICODE 标准的好处是因其使用两个字节做存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文、德文等,而不会出现编码冲突。
3、VARCHAR
VARCHAR数据类型的定义形式为VARCHARn)。 它与CHAR类型相似,n 的取值也为1 到8000,若输入的数据过长,将会截掉其超出部分。不同的是,VARCHAR数据类型具有变动长度的特性,因为VARCHAR数据类型的存储长度为实际数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填满设定好的空间。
一般情况下,由于CHAR 数据类型长度固定,因此它比VARCHAR类型的处理速度快。
4、NVARCHAR
NVARCHAR数据类型的定义形式为NVARCHAR[ (n) ]。 它与VARCHAR类型相似。不同的是,NVARCHAR数据类型采用UNICODE标准字符集(Character Set), n 的取值为1 到4000。
六、文本和图形数据类型
这类数据类型用于存储大量的字符或二进制数据。
1、TEXT
TEXT数据类型用于存储大量文本数据,其容量理论上为1 到2的31次方-1 (2,147, 483, 647)个字节,在实际应用时需要视硬盘的存储空间而定。
SQL Server 2000 以前的版本中,数据库中一个TEXT 对象存储的实际上是一个指针,它指向一个个以8KB(8192 个字节)为单位的数据页(Data Page)。这些数据页是动态增加并被逻辑链接起来的。在SQLServer 2000 中,则将TEXT 和IMAGE类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。这就减少了用于存储TEXT 和IMA-GE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。
2 NTEXT
NTEXT数据类型与TEXT.类型相似不同的,是NTEXT类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1,073, 741, 823)个字节。
3 IMAGE
IMAGE 数据类型用于存储大量的二进制数据Binary Data。其理论容量为2的31次方-1(2,147,483,647)个字节。其存储数据的模式与TEXT数据类型相同。通常用来存储图形等OLE Object Linking and Embedding,对象连接和嵌入)对象。在输入数据时同BINARY数据类型一样,必须在数据前加上字符“0X”作为二进制标识
七、 日期和时间数据类型
1 DATETIME
DATETIME 数据类型用于存储日期和时间的结合体。它可以存储从公元1753年1 月1 日零时起到公元9999年12 月31 日23 时59 分59 秒之间的所有日期和时间,其精确度可达三百分之一秒,即3.33毫秒。DATETIME 数据类型所占用的存储空间为8 个字节。其中前4 个字节用于存储1900年1 月1 日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期。后4 个字节用于存储从此日零时起所指定的时间经过的毫秒数。如果在输入数据时省略了时间部分,则系统将12:00:00:000AM作为时间缺省值:如果省略了日期部分,则系统将1900年1 月1 日作为日期缺省值。
2 SMALLDATETIME
SMALLDATETIME 数据类型与DATETIME 数据类型相似,但其日期时间范围较小,为从1900年1 月1 日到2079年6 月6:日精度较低,只能精确到分钟,其分钟个位上为根据秒数四舍五入的值,即以30 秒为界四舍五入。如:DATETIME时间为14:38:30.283
时SMALLDATETIME 认为是14:39:00SMALLDATETIME 数据类型使用4 个字节存储数据。其中前2 个字节存储从基础日期1900年1 月1 日以来的天数,后两个字节存储此日零时起所指定的时间经过的分钟数。
下面介绍日期和时间的输入格式
日期输入格式
日期的输入格式很多大致可分为三类:
* 英文+数字格式
此类格式中月份可用英文全名或缩写,且不区分大小写;年和月日之间可不用逗号;
年份可为4 位或2 位;当其为两位时,若值小于50 则视为20xx年,若大于或等于50 则
视为19xx年;若日部分省略,则视为当月的1号。以下格式均为正确的日期格式:
June 21 2000 Oct 1 1999 January 2000 2000February
2000 May 1 2000 1 Sep 99 June July 00
* 数字+分隔符格式
允许把斜杠(/)、连接符(-)和小数点(.)作为用数字表示的年、月、日之间的分
隔符。如:
YMD:2000/6/222000-6-22 2000.6.22
MDY:3/5/20003-5-2000 3.5.2000
DMY:31/12/199931-12-1999 31.12.2000
* 纯数字格式
纯数字格式是以连续的4 位6、位或8 位数字来表示日期。如果输入的是6 位或8 位
数字,系统将按年、月、日来识别,即YMD格式,并且月和日都是用两位数字来表示:
如果输入的数字是4 位数,系统认为这4 位数代表年份,其月份和日缺省为此年度的1 月
1 日。如:
20000601---2000 年6 月1 日991212---1999 年12 月12 日1998---1998 年 ????
时间输入格式
在输入时间时必须按“小时、分钟、秒、毫秒”的顺序来输入。在其间用冒号“:”隔开。但可将毫秒部分用小数点“.” 分,隔其后第一位数字代表十分之一秒,第二位数字代表百分之一秒,第三位数字代表千分之一秒。当使用12 小时制时用AM。am 和PM(pm)分别指定时间是午前或午后,若不指定,系统默认为AM。AM 与PM 均不区分大小写。如:
3:5:7.2pm---下午3 时5 分7 秒200毫秒
10:23:5.123Am---上午10 时23 分5 秒123毫秒
可以使用SET DATEFORMAT 命令来设定系统默认的日期-时间格式。
八、货币数据类型
货币数据类型用于存储货币值。在使用货币数据类型时,应在数据前加上货币符号,系统才能辨识其为哪国的货币,如果不加货币符号,则默认为“¥”。各货币符号如图4-2所示。
1 MONEY
MONEY 数据类型的数据是一个有4 位小数的DECIMAL值,其取值从-2的63次方(-922,337,203,685,477.5808到2的63次方-1(+922,337,203,685,477.5807),数据精度为万分之一货币单位。MONEY 数据类型使用8个字节存储。
2 SMALLMONEY
SMALLMONEY数据类型类似于MONEY 类型,但其存储的货币值范围比MONEY数据类型小,其取值从-214,748.3648到+214,748.3647,存储空间为4 个字节。
九、 特定数据类型
SQL Server 中包含了一些用于数据存储的特殊数据类型。
1 TIMESTAMP
TIMESTAMP 数据类型提供数据库范围内的惟一值此类型相当于BINARY8或VARBINARY(8),但当它所定义的列在更新或插入数据行时,此列的值会被自动更新,一个计数值将自动地添加到此TIMESTAMP数据列中。每个数据库表中只能有一个TIMESTAMP数据列。如果建立一个名为 “TIMESTAMP”的列,则该列的类型将被自动设为TIMESTAMP数据类型。
2 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER 数据类型存储一个16 位的二进制数字。此数字称为(GUIDGloballyUnique Identifier ,即全球惟一鉴别号)。此数字由SQLServer 的NEWID函数产生的全球惟一的编码,在全球各地的计算机经由此函数产生的数字不会相同。
十、用户自定义数据类型
SYSNAME SYSNAME 数据类型是系统提供给用户的,便于用户自定义数据类型。它被定义为NVARCHAR(128),即它可存储128个UNICODE字符或256个一般字符。其具体使用方法请参见第7章“管理数据库表”中的“自定义数据类型”章节。
十一、 新数据类型
SQL Server 2000 中增加了3 种数据类型:BIGINT、SQL_VARIANT和TABLE。其中BIGINT数据类型已在整数类型中介绍,下面介绍其余两种:
1 SQL_VARIANT
SQL_VARIANT数据类型可以存储除文本、图形数据(TEXT、NTEXT、IMAGE)和TIMESTAMP类型数据外的其它任何合法的SQLServer数据。此数据类型大大方便了SQL Server的开发工作。
2 TABLE
TABLE 数据类型用于存储对表或视图处理后的结果集。这一新类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便快、捷其、使用请参见第13章“游标、视图和自定义函数”。
1.SQL SERVER的数据类型
|
引用内容
- 正在验证 (错误)
消息
错误 0xc0202049: 数据流任务: 无法在只读列“sysid”中插入数据。
(SQL Server 导入和导出向导)
错误 0xc0202045: 数据流任务: 验证列元数据失败。
(SQL Server 导入和导出向导)
错误 0xc004706b: 数据流任务: “组件“目标 - FS_AP_SysPara”(25)”验证失败,返回的验证状态为“VS_ISBROKEN”。
(SQL Server 导入和导出向导)
错误 0xc004700c: 数据流任务: 一个或多个组件未能通过验证。
(SQL Server 导入和导出向导)
错误 0xc0024107: 数据流任务: 任务验证期间出错。
(SQL Server 导入和导出向导)
1.到"选择源表和源视图(选择一个或多个要复制的表和视图)"这一步时.不要急着点"下一步或完成".
2.先点一下"编辑映射"或者双击目标下面的图标
3.弹出"列映射"对话框.然后勾选"启用标识插入"的复选框.
或者将只读列改为"忽略"
4.重复"第3步"为目标下面的每一个表都"启用标识插入"
5.完成.不知道上面的有没有说清楚.
总结在重复那几步时.每一个表都要设置.比较烦.特别是表多的话.那做起来就列麻烦了.
我刚接触2005.不知道能不能一次搞定.或者通过命令把那个"启用标识**"设为默认选中.
这里感谢我林主管的提示
我是用的sqlserver,具体的实现是把一个excel表里的数据(有重复)导入sqlserver数据库里,我的做法是:
先把excel每张表的里数据分别导成数据库里的表(没有约束),然后我再建立与各个表有对应的字段的表(这是我要用的,里面有主键约束),现在我要把没有约束的表导入有约束的表里,总是导不进去.
给个能导入的办法和sql
禁用約束
alter table tablename nocheck constraint all
開啟約束
alter table tablname check constraint all
1. 新建数据库;
2. 生成数据库结构代码;
3. 运行数据库结构代码;
4. 去除数据库所有CHECK;
5. 导入数据,启用标示导入,不优化操作;
6. 加上所有CHECK;
1、关键字 ESCAPE允许在字符串中搜索通配符而不是将其作为通配符使用
语法:ESCAPE'放在通配符前表示此特殊用途的字符'
例:select * from table1 where name like'%/%cs' escape'/'
该例查询姓名中所有以 %cs作为结尾的
例:select * fromtable1 where name like '%/_cs' escape'/'
该例查询姓名中所有以_cs结尾的
2、单引号:SQL中以两个单引号来转义为一h个单引号
如:alter table table1
ADD CONSTRAINT [CK_table1] CHECK (not([pwd] like '%''%'))
Published
by
叶秋on 2007-12-10
in 软件相关
. Tags: SQL Server,Vista,xileju.biz.
近日由于无法抗拒Vista的视觉外观,想把我的开发平台从XP下搬到Vista。上网一看,基本用到的都可以在Vista下跑,大喜。于是首要安装的就是SQL Server2005。可我的Vista遇到我的SQL2005却没有微软官方站点说的那么容易,只要打了SP2补丁就可以。
安装程序检查完系统,两警告,IIS和COM+。在XP下也是这样,可只要安装了Internet信息服务和打开Distributed TransactionCoordinator服务就能搞定。但是我今天就算把Internet信息服务全装了又打开DTC服务,这两个警告仍然还在。无奈!好,先装,安装失败再说。一路有警告当然是在意料中,只要不安装失败就行。20分钟后,安装成功,再次大喜。二话不说马上打SP2,检查说某某服务正在运行,如果要想安装完成后不重新启动系统,请先把服务停了(大意是这样)。当然可以不重启是再好不过的了。于是停了所有列出来的服务。点下一步,又是几十分钟后,安装成功完成。这时系统叫我配置Vista下SQL2005的用户,这下好了,怎么也无法启动用户!好,先不管,看看能不能用,能用也就不管了。这下发现最基本的SQL Server(MSSQLSERVER)服务都不能启动,也就是说明我数据库都连不上,还何谈能用不能用。上网Google一下,有人教说把SQL2005卸了重装一遍再打SP2就搞定,也有人说不用卸,直接覆盖也行。当然不用卸的那自然最好(真不明白为何要这样做)。于是再次安装,那两警告还在,当然视而不见。一分钟后弹出这样一个警告框,大意是:你选择安装的文件和原文件一样,安装将不对原文件做任何改变,安装终止。这时才发现上当了,还是得卸了再装。于是卸载、安装、打补丁,又到那个问我关不关服务的地方,还是懒重启,所以关服务。完成,一试连上,一切正常,狂喜中……把所有SQL的服务改为手动启动,毕竟平时用不到的时候想不出来为何要开它。由于之前有过服务不能开的经历,所以改为手动后试试能不能打开。汗,又打不开,刚还不是还能用的吗?!郁闷,重启电脑看看,还是不能。于是再次改为自动启动,重启电脑,服务它又是开着的了,一试一切正常。汗,难不成非得开成自动?!改为手动它又不能启动。再次Google,却没发现有人碰到我这样的问题。静思,是不是之前打补丁时我把服务关了造成的?!事已至此,再打补丁,到那个问我关不关服务的地方,这次不理,直接下一步。安装完成后,重启电脑。服务是开着,马上改为手动,再次重启服务,哈哈,能打开了。搞定,一切正常。前后花了整整一个晚上。
在日后的使用中发现这样一个问题。我建一用户,这用户只能对一张表有查看的权限。然后开发程序中一直报SQLException某某字段无效,用此用户登陆数据库一看,我的天,这用户竟然每个数据库都能访问!还能删别个库中的表!实在是太不明白!!!
SQL Server 2005 Express附加数据库为“只读”的解决方法
SQL Server 2005 Express附加数 ...
在SQL Server 2005 Express 上附加从另外一台电脑Copy过来的数据库后,数据库为“只读”。 解决办法:打开 SQL Server ConfigurationManager, 打开SQL Server SQLEXPRESS 的属性 在内置帐号处,把“网络服务”改成“本地系统”,重新启动SQL Server 2005 Express 后,再附加数据库一切正常。总结:之所以附加上的数据库为“只读”,是因为启动SQL Server的默认的启动帐号“网络服务”对所附加(Attach)的数据库文件的权限不够造成的。 此文章从网络转载。
=====================================================================
最近2010-3-10
自动关机
shutdown -s -t (时间)
shutdown –a解除自动关机
control 控制面板快捷键
TIMPlatform.exe进程 可以挂两个QQ TXPlatform.exe
《设计模式》
数据库服务错误:
无法连接到WMI 提供程序请注意,你只能使用SQL Server 配置管理器来管理SQL Server2005服务器。找不到指定的模块。[0x8007007e]
解决方法:
这主要是通过Java 或者vc连接数据库遇到的问题
解决问题的方法:检查一下 windows下的system32 中是否有framedyn.dll这个系统文件,如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下
问题一:ApplicationSystem Error (拒绝访问 Unable to open the service'Tomcat X')
网上也有很多网友说有这个问题,除了第一次安装好时运行成功外,第二次就无法打开服务器。
解决: tomcat有windows安装包和zip包两种下载,两者没有差异,效果是一样的,前者比较方便,因为在安装的同时可以把端口号直接改成18080
找到Monitor Tomcat这个文件,单击鼠标右键---属性---兼容性---用兼容模式运行这个程序,改好之后确定保存。然后再对它单击右键---以管理员身份运行。问题就解决了。
问题二:运行Tomcat服务时现严重错误
问题原因:Tomact的端口号8080已经被占用了。
方法一:将你的MyEcplises关闭。打开任务管理器。将所有进程为javaw.exe的全部结束。然后再启动你的MyEcplise。启动你的Tomact6.x的试看看。能不能成功运行。如果还是不行。就采用第二种方法。一定可以的。
方法二:在你的Tomact6.0的安装目录conf文件夹下找到server文件、打开。将里面的
connectionTimeout="20000"
redirectPort="8443"/>
port="8080"中的8080改成没有使用过的端口号。比如:8888.
这样你重新启动一下Tomact服务器。那么你设置端口号就是Tomact的端口号了。
系统常常会自动弹出“xx内存不能为read或written”的错误提示?
解决方法:开始 ——运行—— 输入:cmd 确定——
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s%1 ,直接copy,直到屏幕流动停止,ok
安装SQL2005开发版提示“SQL SERVER安装程序无法获取ASPNET帐户的系统帐户信息……”
解决方法:下载用aspnet_regiis实用工具卸载和重新安装;
具体的操作如下:
进入CMD:
c:\windows\microsoft.net\framework\v2.0.50727文件夹下,运行aspnet_regiis -u卸载
然后运行aspnet_regiis -i 重新安装,上述问题即可解决
sql server 2005 安装完找不到启动图标,只有一个配置工具
解决方法:此时软件未安装完,86文件夹里还有名为TOOls文件夹,打开安装即可。
SQL Server 2005 中为安装程序增加计数器注册表项值,不能安装?
解决方法:
1、单击“开始”、“运行”,然后在“打开”中键入 regedit.exe,再单击“确定”。使用 regedt32.exe 启动注册表编辑器。
2、定位到以下注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib]
找到里面的Last Counter和LastHelp,注意Last Counter和Last Help值是由 Windows 动态分配的;这两个值会因计算机的不同而不同。我的分别是6760和6761。
3、上一步的“Last Counter”值 (6760) 必须与以下注册表项中“Perflib\004”的“Counter”项的最大值匹配,并且上一步的“Last Help”值 (6761) 必须与以下注册表项中“Perflib\004”的“Help”项的最大值匹配。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\004]
注意 :004 是简体中文中的一个示例 009是英语彼示例
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\009]
比如说:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\004中的Help,双击后打开编辑框,里面是:
3
System performance object 包含应用于计算机上不止一个组件处理器范例的计数器。
5
Memory performance object
...
中间的都省略掉了
...
6785
写入所有数据源中的BLOB 字节总数。
6787
在整个管道中使用的BLOB 假脱机文件数。
这个最后一个数值6787就应该对应Perflib中Last Help的十进制数值。当然修改的时候别忘了选择十进制。
6、关闭注册表编辑器
7、再次运行 SQL Server 安装程序就应该没问题了。
sql server 2005安装过程中没有iis组件和com+出现错误解决方法
解决方法:1、控制面板里没有“->添加/删除Windows组件->Internet信息服务(IIS)”组件的添加方法。
(某些GHOST系统精简后没有此项)
把IIS列进系统组件并安装。先到网上下载iis5.安装包,解压到D盘的根目录下(最好是根目录,便于后面打命令)把目录名该为iis51
首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,在sysoc.inf中找到“[Components]”这一段,在里面加上这段:“iis=iis2.dll,OcEntry,iis2.inf,,7”,之后保存并关闭。
接下来,在运行中输入“CMD”然后回车,打开命令行模式,在命令行下输入下列的两条命令,在每一行命令结束后回车:
expand d:\iis51\iis.dl_c:\Windows\system32\setup\iis2.dll
expand d:\iis51\iis.in_c:\Windows\inf\iis2.inf
2、COM+组件解决方法。
在CMD下执行以下命令:
msdtc -resetlog
cd %windir%\system32\inetsrv
rundll32 wamreg.dll,CreateIISPackage
regsvr32 asptxn.dll
SQL Server 服务管理器中无法启动SQL,提示“系统找不到指定的文件”。
在SQL的安装目录(X:\X..X\MicrosoftSQL Server\MSSQL\Binn)下的文件sqlservr.exe文件丢失
解决办法:
1.从网上下载一个,但这个方法不好,网上内嵌木马的EXE文件多;
2.从另一个机子上直接拷过来,文件大小为8.72M;
Sql2005卸载后 重新安装安装 存在同名实例
引用:
SQL server Database services 安装失败
Analysis services 安装失败
Reporting services 安装失败
工作站组件 联机丛书和开发工具 安装失败
不想重装系统
1.Stop 所有服务
2.用 Windows InstallClean Up 工具卸载SQL 2005组件
3.用SrvInstw.exe删除所有SQL服务
4.清除注册表
a. 将HKEY_CURRENT_USER---Software----Microsoft下的MicrosoftSQL Server文件夹全部删除
b. 将HKEY_LOCAL_mACHINE---SOFTWARE---Microsoft下的MicrosoftSQL Native Client ,Microsoft SQL Server, Microsoft SQL Server 2005 Redist全部删除。
5.删除残留文件
将C盘——Program File下的MicrosoftSQL Server 文件夹删除。
6.重启电脑,重新安装。
SQL Server 2005安装过程中的 COM+ 检查失败的解决办法
MSDTC服务就是DistributedTransaction Coordinator,主要是协调跨多个数据库、消息队列、文件系统等资源管理器的事务。在开始菜单中输入services.msc后找到Distributed TransactionCoordinator后启动该服务,不料却弹出"windows 不能在 本地计算机启动 Distributed Transaction Coordinator .有关更多信息,查阅系统事件日志。如果这是非 Microsoft 服务,请与厂商联系,并参考特定服务错误代码 -1073737712"。又网上搜索一番,发现要重置下日志,在命令行输入msdtc-resetlog后果然服务成功启动,再安装SQL Server 2005后再没有提示COM+检查失败。
如果启动DistributedTransaction Coordinator失败,弹出“错误1068:依存服务或组无法启动”,可右击Distributed TransactionCoordinator,选择“属性”→“依存关系”,会看到两个依存的系统组建,然后启动这两个服务即可。
1433端口............................................................................................... 4
从SQL SERVER 2000中备份的数据库还原到SQL SERVER 2005上.................................. 4
异常:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。收藏............ 5
新一篇: 网站发布问题....................................................................................... 5
C#中利用process类调用外部程序以及执行dos命令.......................................................... 5
SQL 2005心得:发布订阅................................................................................................ 6
发布服务器配置(在发布服务器上配置发布和订阅)....................................................... 7
Q. SQL Server 2005 产品线主要有几个版本?.................................................................... 9
修改SQL2005的验证模式.............................................................................. 9
新一篇: SQL2005 安装时 “性能监视器计数器要求(错误)”解决方案.......................... 10
安装 sql2005 时 com+ 警告的问题................................................................................ 11
SQL server 2005安装问题汇总zz..................................................................................... 12
2005数据库安装心得...................................................................................................... 13
SQL2005安装过程提示com+目录问题警告处理.............................................................. 15
sql2005安装过程owc11错误处理.................................................................................... 18
教你如何在SQL Server数据库中加密数据...................................................................... 51
安装SQL Server 2005时出现计数器错误......................................................................... 53
SQL2000错误代码大全................................................................................................... 54
无法获得model表上的排它锁......................................................................................... 57
SQL数据类型................................................................................................................. 57
SQL SERVER数据类型............................................................................................. 58
SQL Server数据类型介绍................................................................................................ 59
[分享]SQL SERVER的数据类型...................................................................................... 64
SQL2005导入导出数据库问题........................................................................................ 69
sql server 2005导入导出数据完全步骤............................................................................. 70
SQL中的转义字符和通配符的查询................................................................................. 70
Vista下安装SQLServer2005........................................................................................... 70
SQL Server 2005 Express附加数据库为“只读”的解决方法................................................ 71
无法连接到服务器
服务器:消息18452, 级别16,状态1
[Microsoft][ODBC SQL Server Driver][SQL Server]用户‘sa’登陆失败。原因:未与信任SQL Server连接相关联
该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(例如 sa )进行连接,解决方法如下
设置允许SQL Server身份登录 (基本上这个很有用)
操作步骤:
1、在企业管理器中,展开"SQL Server组",鼠标右键点击SQL Server服务器的名称
2、选择"属性"
3、再选择"安全性"选项卡
4、在"身份验证"下,选择"SQL Server和 Windows"
5、确定,并重新启动SQL Server服务
6、选择"安全性"
7、再选择"登录名"-sa-右键属性-状态-将”登录”设置为启用
8、从“开始菜单”-SQL Server2005-配置工具-外围配置器-服务和连接的外围配置-远程-本地连接和远程连接-同时使用TCP/IP和named pipse
9、确定,并重新启动SQL Server服务
开启1433端口:
1、 打开SQL Server Configuration Manager
2、SQL Native Client 配置-客户端协议 - TCP/IP – 右键属性-将IP地址默认端口改为1433
3、SQL Server 2005 网络配置 –Lydia的协议- TCP/IP – 右键属性-将IP地址动态端口改为1433
一、使用SQL SERVER2005的时候常常遇到中文字符为乱码的情况,经过研究发现,设置SQL的排序规则可以解决这个问题。
1、登录服务器打开Microsoft SQL ServerManagement Studio。
2、在要修改的数据库上单击鼠标右键,并选择“属性”。
3、在弹出的数据库属性窗口中点击“选择页”中的“选项”。
4、将排序规则由默认的SQL_Latin1_General_CP1_CI_AS修改为Chinese_PRC_CI_AS。
5、点击确定就OK。
注:如果无法修改的话,请尝试关闭所有与此数据库的连接,实在不行的话请重启动SQL SERVER服务。
1. ALTER DATABASE (DBNAME) SETOFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE (DBNAME) SET ONLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE (DBNAME) COLLATE (排序规则)
如果数据库正在使用的话,可以依次执行以上语句
二、更改 SQL Server 2005 实例的默认排序规则的操作可能会比较复杂,包括以下步骤:
重新生成 master 数据库:
一、将SQL Server 2005安装光盘放入光驱;
二、在操作系统上选择“开始”--“运行”(输入CMD)--“回车”;
三、于弹出的命令窗口通过“cd..”指令,回到磁盘的根目录(如c:\);
四、接着键入你光盘所在盘符,如“f:”,回车;
五、接着键入(“setup.exe/qn INSTANCENAME=MSSQLSERVERREINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=123SQLCOLLATION=Chinese_PRC_90_CI_AS”)命令重新构建master 数据库;
(备注:如果是默认实例,则INSTANCENAME的值为“MSSQLSERVER”,有实例则录入实例;SAPWD的值为数据库密码;SQLCOLLATION为你所定义的排序规则,中文简体则为“Chinese_PRC_90_CI_AS”)
六、接着等几分钟候电脑自动运行,期间是没有提示运行完成窗口的,待光驱灯不闪烁及硬盘不连续读盘的时候表示安装完成;
七、接着重启电脑,重新建数据库,将之前导出的数据导入就OK了~!
方法如下:
配置工具-> SqlServer Configuration Manager-> MSSQLSERVER的协议
看看TCP/IP协议是否启动,如果启动,右键菜单点"属性" ,在分页菜单中选"IP地址",把"IP1"和"IP2"中"TCP端口"为1433,
"已启用"改为"是"
配置工具-> SqlServer Configuration Manager-> SQL Native Client 配置-> 客户端协议-> TCP/IP
选择TCP/IP右键菜单中"属性",确认"默认端口"是1433,"已启用"为"是"
,打算新建一个数据库关系图,可是在MicrosoftSQL Server Management Studio中一点数据库关系图的文件夹,就出现一个“此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先试用"数据库属性"对话框的"文件"页或ALTERAUTHORIZATION语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象”的提示
按照他说的指定所有者,可惜还是不对,查了一下,应该执行如下语句:
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname=N'数据库名',@new_cmptlevel=90
GO
因为2000备份的数据库还原到2005以后,兼容级别是80,更新成90就OK了
当把从其它机器备份出来的数据库,还原到自己的机器上后,在SSMS中点击这个数据库的数据库关系图时,出现了以下提示:
此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或ALTERAUTHORIZATION语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象。
数据库中确定是有数据库关系图的。提示给出了两种方法,第一种试了几次都不好用,第二种方法倒是一次成功,具体在SSMS中运行以下命令:
ALTER AUTHORIZATION ON database::mydbname TO sa
把mydbname修改为实际的数据库名称,就可以把所有者设置为sa了
2008年1月19日,1:06:00 | 浪淘沙
#中的Process类可方便的调用外部程序,所以我们可以通过调用cmd.exe程序
加入参数 "/c " 要执行的命令来执行一个dos命令
(/c代表执行参数指定的命令后关闭cmd.exe /k参数则不关闭cmd.exe)
1 private string RunCmd(string command)
2 {
3 //實例一個Process類,啟動一個獨立進程
4 Process p = new Process();
5
6 //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性:
7
8 p.StartInfo.FileName = "cmd.exe"; //設定程序名
9 p.StartInfo.Arguments = "/c " command; //設定程式執行參數
10 p.StartInfo.UseShellExecute = false; //關閉Shell的使用
11 p.StartInfo.RedirectStandardInput = true; //重定向標準輸入
12 p.StartInfo.RedirectStandardOutput = true; //重定向標準輸出
13 p.StartInfo.RedirectStandardError = true; //重定向錯誤輸出
14 p.StartInfo.CreateNoWindow = true; //設置不顯示窗口
15
16 p.Start(); //啟動
17
18 //p.StandardInput.WriteLine(command); //也可以用這種方式輸入要執行的命令
19 //p.StandardInput.WriteLine("exit"); //不過要記得加上Exit要不然下一行程式執行的時候會當機
20
21 return p.StandardOutput.ReadToEnd(); //從輸出流取得命令執行結果
22
23 }
以下实现复制步骤(以快照复制为例)
运行平台SQL SERVER2005
一、准备工作:
1.建立一个 WINDOWS 用户,设置为管理员权限,并设置密码,作为发布快照文件的有效访问用户。
2.在SQL SERVER下实现发布服务器和订阅服务器的通信正常(即可以互访)。打开1433端口,在防火墙中设特例
3.在发布服务器上建立一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy
4.设置SQL 代理(发布服务器和订阅服务器均设置)
打开服务(控制面板---管理工具---服务)
---右击SQLSERVERAGENT---属性---登录---选择“此帐户“
---输入或选择第一步中创建的WINDOWS用户
---“密码“中输入该用户密码
5.设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)
步骤为:对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS“,然后点确定
6.开启SQL Server2005的网络协议TCP/IP和管道命名协议并重启网络服务。
7.在SQL Server中创建步骤1中对应的系统用户登陆名,作为发布数据库的拥有者(设置为dbo_owner和public)。
8.以系统超级用户sa登陆SQL Server建立数据库和表。
9.发布服务器和订阅服务器互相注册
步骤如下:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成。
10.对于只能用IP,不能用计算机名的,为其注册服务器别名
二、开始:
发布服务器配置(在发布服务器上配置发布和订阅)
1. 选择复制 节点
2. 右键本地发布 ----下一步---------系统弹出对话框看提示----直到“指定快照文件夹“
----在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)------选择发布数据库-------选择发布类型-------选择订阅服务器类型-------选择要发布的对象------设置快照代理-------填写发布名称。
3. 右键本地订阅--------选择发布服务器-------选择订阅方式(如果是在服务器方订阅的话选择推送订阅反之
选择请求订阅)-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
至此, SQL SERVER2005 同步复制就完成了。使用复制技术,用户可以将一份客户端的数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性,就无需编程实现客户端和服务器端数据同步了!大大提高了工作效率!
发布系比较简单嘅,冇咩需要技术难度。
但系订阅就需要留意下了。喺设置好嘅发布增加订阅,会要求你添加订阅服务器。如果订阅服务器系用域名或IP地址去连接果阵会pop个严重错误:
------------------------------
无法连接到 remote.oicp.net。
SQL Server 复制需要有实际的服务器名称才能连接到服务器。不支持通过服务器别名、IP 地址或任何其他备用名称进行连接。请指定实际的服务器名称“GZ-SVR”。 (Replication.Utilities)
------------------------------
咁样就唔可以继续落去了……
解决方案有2个:
1,将各远程服务器VPN至总公司,设好DNS,等总公司嘅SQL可以好似访问局域网内机器咁访问呢D远程服务器。
2,设好总公司SQL嘅“别名”,等SQL自己连去远程服务器。
我用紧2号方案:
EX:远程服务器的域名系'remote.oicp.net',实际机器名系'GZ-SVR'
=》喺总公司SQL度,打开SQL Server Configuration Manager,去SQL Native Client配置,再开“别名”
=》新建别名:别名=GZ-SVR,端口=1433,服务器=remote.oicp.net,协议=TCP/IP
搞掂!再做发布就冇问题了。
2006-11-04补充:设置好之后,添加订阅服务器果阵就用GZ-SVR呢个别名去验证连接。
另外,两台机器不能重名。如果重名的话要改成不一样的名字。
然后安装SQL 2005,注意,必须在改名后安装,我就是卡在这里了,安装后再改名就不行了(也许能在哪里改SQL认定的机器名的名称,但是我没找到)
然后,在配置工具里建立别名,别名要和对方的机器名一样,必须一样。
然后就能发布和订阅了,用别名直接连上对方就可以了,另外订阅必须在发布的机器上做
Q.SQL Server 2005产品线主要有几个版本?
A. SQL Server 2005 产品家族被重新设计以更好的满足不同客户的需求,它包含以下几个版本:
SQL Server 2005 企业版 是用于企业关键业务应用的完全集成的数据管理和商业智能分析的平台。它是对那些有着复杂的工作负荷,高级的分析需求和严格的高可用需求的公司适合的选择。它的特性包括:无限的伸缩和分区功能,高级数据库镜像功能,完全的在线和并行操作能力,数据库快照功能,包括完全的OLAP和数据挖掘的高级分析工具,报表生成器和定制的高扩展的报表功能,先进的集成服务。64位企业版支持到64颗CPU, 内存不限。
SQL Server 2005 标准版 是一个完全的数据管理和商业智能分析平台。它为那些需要比SQL Server 2005工作组版更多功能(如商业智能工具)的中型企业和大型部门而设计。它的特性包括:高可用性,64-bit支持,数据库镜像,增强的集成服务,分析服务和报表服务,数据挖掘,完全的数据复制功能和发布功能。标准版支持4颗CPU,内存不限(64位)。
SQL Server 2005 工作组版 是SQLServer 产品线中最新的SKU,它将提供一个更快捷且更易使用的数据库解决方案。对那些不满足SQL Server 2005 Express版功能,在寻找一个可负担的起的完全数据库产品的中小型组织而言,它是一个理想的选择。它的特性包括:管理工具集、导入/导出、有限的复制/发布能力、日志传递备份等功能。工作组版支持2颗CPU,3GB内存。
SQL Server 2005 精简版(Express Edition) 是SQL Server 2005 数据库引擎中免费的和可再分发的版本。它为新手程序员提供了学习,开发和部署小型的数据驱动应用程序最快捷的途径。它的特性包括:一个简单的管理工具,一个报表向导和报表控件,数据复制和客户端。它可用免费从Web下载。精简版支持1颗CPU, 1 GB 内存。
现在的SQL Server版本家族把一个企业所需要的所有数据相关功能集成在一个产品包里,并提供以上版本供不同客户根据自己所需选择最佳解决方案。SQL Server 2005将是一个集数据管理、商业智能为一体的统一数据平台,客户可以在这个平台上轻松搭建任何数据相关的应用,如数据管理、复制发布、数据转换、分析服务、报表服务、数据挖掘等,并不再需要为上述各类复杂需求分别支付额外付费。
修改SQL2005的验证模式
标题: Microsoft SQL Server Management Studio
解决方法:只需创建时取消强制密码过期选项 |
因为在安装的时候,选择WIN验证模式,现在不知道如何启用。
如果在安装过程中选择“Windows 身份验证模式”,则 sa 登录将被禁用。如果稍后将身份验证模式更改为“SQL Server 和 Windows 身份验证模式”,则 sa 登录仍处于禁用状态。若要启用 sa 登录,请使用 ALTER LOGIN 命令。
sa 登录只能使用 SQL 身份验证连接到服务器。
在 SQL Server Management Studio 对象资源管理器中,右键单击服务器,再单击“属性”。
在“安全性”页上的“服务器身份验证”下,选择新的服务器身份验证模式,再单击“确定”。
在 SQL Server Management Studio 对话框中,单击“确定”以确认需要重新启动 SQL Server。
在对象资源管理器中,右键单击您的服务器,再单击“重新启动”。如果运行有 SQL Server 代理,则也必须将其重新启动。
执行下列语句以启用 sa 密码并分配一个密码。
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = '
GO
在 SQL Server 2005 Manger Studio 中录入数据的时候,不要把光标移动到只读的列中,否则你的中文就不要想录入了
另外,设计表的时候可能也得注意,如果你想在SQL Server 2005 Manger Studio 中录入中文,则不要把只读列设置为第1列,比如上面的测试表 ta, 如果你已经录入了数据,再用SQL Server 2005 Manger Studio 打开的时候,你会发现光标是定位在第1条记录的第1列(标识列,也是只读列)的,这样会导致你根本无法录入中文
这应该算是SQL Server 2005Manger Studio 的一个BU吧
在 SQL Server 2005 Manger Studio 中,只读列显示的数据是灰色的(比正常列的颜色稍淡一些,仔细看一下就能区分出来
2008-07-29 17:52
今天安装 MSSQL2005,由于原来我的电脑上安装了 MSSQL2000,上网查了些资料,说是可以共存,不过需要先安装 MSSQL2005, 然后安装 MSSQL2000,因为sql2000下有很多数据库,想了下,先卸载sql2000,再装sql2005,再装 sql2000 比较麻烦,于是就直接安装.
进入控制面板添加删除程序,嘿嘿,有显示了,赶快卸载掉sql2005,删除MicorSoft SQLServer的文件夹,最后还用优化大师清理了一下注册表,重启,似乎一切都过去了.
在命令行下运行 msdtc -uninstall ,卸载 msdtc 服务; 之后再安装SQL2005,问题解决,阿弥陀佛! |
SQL2005分五个版本,如下所列,
1.Enterprise(企业版),
2.Development(开发版),
3.Workgroup,(工作群版)
4.Standard,(标准版)
5.Express.(嗯,估且就叫它简易版吧)
这几个版本,我们究竟应该使用哪一版呢﹖
这是许多初学SQL2005的人最常问的问题。
我简单的比较一下Enterprise,Development和Express等三个版本:以功能言,Enterp
rise版和Development版的功能一模一样。两者的差别,除了授权不同外,最主要的差别是
:
Enterprise版的数据库引擎只能安装在Win2003Server(或其他Server)。
如果你想安装在WindowsXPPro系统上,你应该安装SQL2005Development版(开发版)。
注:有人问,什么是「数据库引擎」。嗯,数据库引擎是SQL2005的核心,是最主要的
数据库管理功能模块。没有它,就不是数据库管理系统了。
很多人下载SQL2005Express版,因为它是免费的,可以直接从微软网站上下载。但是
,它除了支持的内存比较少外,最主要的是
它缺少相当于SQL2000下的「企业管理器」和「查询分析器」。
注:SQL2000下的「企业管理器」和「查询分析器」在SQL2005已合为一,称为Managem
entStudio。
因此,如果你是初学者,如果你只是想要在家里学习学习,如果你的环境是WindowsX
PPro,那么,你应该选择的是SQL2005Development(开发版),而不是SQL2005Enterprise(
企业版)或SQL2005Express(简易版)。
SQL2005入门者,你选择正确了吗﹖
我就是从“Microsoft.SQL.Server.2005.Enterprise.Edition.DVD-ZWTiSO,请大家下载加
速"
上下载的,说明文件里显示是"标准版和企业版",但是我在安装的时候显示不能满足最低的
硬件要求(我的机器的配置:server2003企业版AMD2800+,512MDDR400内存,系统盘有16
G的空闲空间),在组件选择框里,只能看见nativeclient和安装sample数据库,这究竟是
什么原因?2005的硬件要求真的那么高吗?或者说这到底影响安装和使用吗?
在我不改变硬件的情况下怎么解决上面的问题啊
应该是满足硬件要求的,看安装时的提示是什么吧
我的环境是xpsp2EN,SQL2005Dev版,内存512MB。
首先,我的系统已经使用半年多了,装有VS2003,以前还装过SQL2000,netFramewor
k2.0beta,还有好几个beta版的SQL2005,可谓十分“肮脏”了,呵呵。最早的时候我下过
一个2005EE版,怎么也安装不上,后来发现原来是EE不支持xp=_=,然后就下了DE版的。
刚开始安装的时候吓了我一跳,丫的居然要占用我C盘1300多MB!!忍了。(我是把SQL装
在F盘的,但是居然还需要C盘1300多MB)。但是却安装失败,看了一下安装日志,天书,不
明白。只知道是nativeclient几个组件安装不成功。重复多次问题依旧。
研究安装包之后,发现里面有两个主要的文件夹,是server和tools。顾名思义,ser
ver里面肯定是服务的安装文件了,而tools里面应该是那些工具组件的安装文件。进入to
ols里面,果然有个setup,运行之,竟然安装成功了,而且只占了我C盘200多MB,好兴奋
(没有选择BI,就是那个商业智能组件,太大了)。然后重启电脑(不是必须的,只是一次s
etup之后系统慢的不行了),进入server目录下面,当然也有一个setup啦,运行之,呵呵
,果然是安装服务用的啊。这次也顺利安装成功了。再去看C盘,哈哈,一共只用了我300
多MB,竟然节省了1GB。
当然了,其实一起安装的话,也不一定会用完1300MB的空间的,因为安装结束之后还
会自动删除一些垃圾文件的。但是不管怎么说,至少让我能正常安装了。我的C盘只有140
0的空闲空间了,不知道起初安装失败是不是跟这有关系。
至此,SQL2005已经成功的在我电脑上安家了。安装的时候,如果你的电脑和我的一样
是内存不足(小于1GB),性能也不足够大(我的CPU是centrio1.3G,呵呵,装在本本上了),
建议在安装的时候把系统开始是需要运行的服务全都不选择,用的时候再手动运行好了。
运行ManagementStudio,嗯,速度还挺快的呢。连接服务器,竟然没有localhost,呵
呵,打开serverconfigurationmanager,把右边那个MSSQLSERVER运行起来。ok,这次没有
问题了。
使用一切正常,就是发现从sql2000里面备份出来的数据库在2005下只能通过sql语句
修改数据,而不能所见及所得的修改,不知道怎么回事。
btw:后来又把商业智能组件装上了,只用了C盘150MB,开心。
安装sql2005一直失败,以为提示的问题是这个com+目录问题警告所致,找了很久找到这个问
题的解决方案
sql2005_STD_X86在XPSP2下安装失败的一点经验
软环境是XPSP2,安装SQL2005_STD_X86版。
故障提示:
1。如果SQLServer安装程序失败,安装程序将回滚所安装的系统,但可能不会删除所有.m
anifest文件。解决方法是重命名这些文件,然后重新运行安装程序。有关详细信息,请参
阅“如何处理SQLServer安装过程中的COM+检查失败问题”。如果未运行Microsoft分布式
事务处理协调器(MSDTC),或者,在使用Microsoft群集服务器的情况下,如果MSDTC不是群
集资源,则可能会发生COM+错误。COM+依赖于MSDTC,而IntegrationServices中的消息队
列任务依赖于COM+。如果出现COM+错误,则只有将COM+系统正确配置后,IntegrationSer
vices中的消息队列任务才可用。
2。对性能监视器计数器注册表值执行系统配置检查失败。有关详细信息,请参阅自述文件
或SQLServer联机丛书中的“如何在SQLServer2005中为安装程序增加计数器注册表项值”
。
安装中止。
查找联机丛书,有如下提示:
1。MicrosoftSQLServer2005安装程序检查COM+是否已正确配置。如果发现配置错误,安装
程序仍将继续,但是在系统配置检查(SCC)报告中显示以下警告:
“如果SQLServer安装程序失败,安装程序将回滚所进行的安装,但可能不会删除所有的.
manifest文件。解决方法是重命名这些文件,然后重新运行安装程序。”
如果未运行Microsoft分布式事务处理协调器(MSDTC),或者,在使用Microsoft群集服务器
的情况下,如果MSDTC不是群集资源,则可能会发生COM+错误。COM+依赖于MSDTC,而Inte
grationServices中的消息队列任务依赖于COM+。如果出现COM+错误,则只有将COM+系统正
确配置后,IntegrationServices中的消息队列任务才可用。
若要使用消息队列(亦称MSMQ),请确保MSDTC正在运行并且已正确配置。如果SQLServer
安装在群集上,则MSDTC必须是群集资源。
按照下列过程重新安装COM+。
安装组件服务管理单元
在Windows桌面上,单击“开始”,然后单击“运行”。
在“打开”框中,键入MMC,然后单击“确定”。
在“控制台”窗口中,单击菜单栏上的“文件”,然后单击“添加/删除管理单元”。
在“添加/删除管理单元”窗口,单击“添加”。
在“添加独立管理单元”窗口,从管理单元列表中选择“组件服务”,然后单击“添加”
。
单击“关闭”以关闭“添加独立管理单元”窗口,然后单击“确定”以关闭“添加/删除管
理单元”窗口。
在“控制台根节点\组件服务”窗口,展开“组件服务”树。这就是当COM+出现问题时,错
误消息可能发生的地方。
再次运行SQLServer2005安装程序。如果收到错误消息,请重新安装COM+。
重新安装COM+
从控制面板的“添加或删除程序”中,单击“添加/删除Windows组件”。
在“Windows组件向导”中,不对选择做任何更改,单击“下一步”。
一直单击以完成向导,然后再次运行SQLServer2005安装程序。
2。在SQLServer安装开始前,MicrosoftSQLServer安装程序中的安装配置检查器(SCC)会验
证计数器注册表项的值。如果SCC无法验证现有的注册表项,或SCC无法运行lodctr.exe系统程序,则SCC检查会失败,致使安装受阻。
错误编辑注册表会严重损坏您的系统。更改注册表项之前,建议您备份计算机中的所有重
要数据。
手动设置计数器注册表项的增量
在MicrosoftWindows2003或WindowsXP桌面上,依次单击“开始”、“运行”,然后在“打
开”中键入regedit.exe,再单击“确定”。在Windows2000中,使用regedt32.exe启动注
册表编辑器。
定位到以下注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib]
"LastCounter"=dword:00000ed4(5276)
"LastHelp"=dword:00000ed5(5277)
上一步的“LastCounter”值(5276)必须与以下注册表项中“Perflib\009”的“Counter”
项的最大值匹配,并且上一步的“LastHelp”值(5277)必须与以下注册表项中“Perflib\
009”的“Help”项的最大值匹配。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\009]
注意009是英文中的一个示例。“LastCounter”和“LastHelp”值是由Windows动态分配的
;这两个值会因计算机的不同而不同。
如有必要,可修改“\Perflib”项中的“LastCounter”和“LastHelp”值的值:在右侧窗
格中,右键单击“LastCounter”或“LastHelp”,单击“修改”,再单击“Base="Decim
al"”,在“值数据”中设置值,再单击“确定”。如有必要,对另一个项重复以上过程,
然后关闭注册表编辑器。
再次运行SQLServer安装程序。
解决过程:
COM+检查失败不用说肯定是组件消息队列下的组件没安装或服务没启动。本机没有安装过
消息队列,找出系统盘安装消息队列组件,在组件安装中提示MSDTC服务没有启动,在这步
晕了长很时间,MSTDC在服务中怎么也找不到,后来想会不会是DTC(脑子有点笨,其实从
MSMQ这名称上就应该想到),一看果然有DistributedTransactionCoordinator(DTC),
但是这个服务启动不了,后来查找相关资料:MSDTC(DistributedTransactionCoordinato
r)服务必须在NTAUTHORITY\NetworkService帐户下运行;即使是NTAUTHORITY\NetworkSer
vice(注意,Network和Service中间有空格)也不行(至于这两个帐户的区别,在网上也
没有找到,还望大家不吝赐教)。如果登录帐户被更改,MSDTC服务会继续运行,但是在执
行的时候可能会出错。而且,在事件日志的“应用程序”里面可以发现如下的出错信息:
正在运行MSDTC服务的帐户无效。如果使用MicrosoftManagementConsole(MMC)中的“服务
”管理单元更改了服务帐户信息,就会发生这种情况。MSDTC服务将继续启动。请确认使用
“组件服务管理器”更新了MSDTC服务帐户信息。
要更改成正确的登录帐户,我们可以:
在服务中找到DistributedTransactionCoordinator服务,选择“属性”;
在“登录”选项卡中,选择“此帐户”,帐户名填写“NTAUTHORITY\NetworkService”,
密码为空;
在点击“确定”后重新启动服务。
或者,在命令行下运行msdtc-uninstall,卸载msdtc服务;
再运行msdtc-install,安装msdtc服务。
MSTDC服务成功启动,组件服务中“COM+应用程序”可以访问,上面第2项故障没去解决,
先试着安装看看有没有错误,令人惊喜,安装检查一切顺利,第2项错误同时也解决了。
当然,解决问题的过程同样的系统环境也不尽相同,在这里谈一下我安装的小挫折,希望
可以给碰到相同问题的朋友有些提示作用。
最近安装了很久的sql2005,过程中间出现很多问题,之前的com+目录警告是一个部分,处理
过之后还是发现一直无法安装成功,(为此我安装了10+)次才解决问题
在安装过程中发现以下错误
Product:OWC11
Error:错误1706。安装程序找不到需要的文件。请检查网络连接或CD-ROM驱动器状态。对
于这个问题的其他可能的解决方案,请参阅C:\ProgramFiles\MicrosoftOffice\OFFICE11
\2052\SETUP.CHM。
------------------------------------------------------------------------------
--
发现自己的ocw11没有安装导致服务器的有关组件全部无法安装,每次都是安装失败,
在microsoftocw11下载地址
找到microsoft的ocw11,选择简体中文后下载安装后发现还是出现相同的问题,
把下载下来的ocw11解压缩后观察该ocw11.xml,发现sql2005的server的setup目录下面有相
同文件名文件,再次逐次对比发现该ocw11里面的文件包里面的文件对应的setup里面全部都
有,不过发现2个chm的后缀不同,一个是10XX,一个是2052,呵呵,原来是版本不同
直接运行setup目录下面的setup,选择修复或全新安装全部提示错误的文件源,再次观察,把
setup目录下面对应的的ocw11文件全部拷贝到硬盘上面,再次运行修复成功,之后安装sql2
005终于一路成功,困扰了我2天的问题终于解决,特此把本文于全体学习sql2005的朋友分享
,希望大家少走弯路.一起交流sql的有关功能
50种方法优化SQL Server数据库查询(有N多错别字)
http://database.51cto.com/art/200612/35820.htm
查询速度慢的原因很多,常见如下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化
可以通过如下方法来优化查询 :
1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3、升级硬件
4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
5、提高网速;
6、扩大服务器的内存,Windows 2000和SQLserver 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server?2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。
7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert, Delete还不能并行处理。
8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。
9、DB Server 和APPLicationServer 分离;OLTP和OLAP分离
10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图')
a、在实现分区视图之前,必须先水平分区表
b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCCINDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法上有很大的讲究,下面列出常见的要点:首先, DBMS处理查询计划的过程是这样的:
1、 查询语句的词法、语法检查
2、 将语句提交给DBMS的查询优化器
3、 优化器做代数优化和存取路径的优化
4、 由预编译模块生成查询规划
5、 然后在合适的时间提交给系统处理执行
6、 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。
13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
14、SQL的注释申明对执行没有任何影响
15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。选择这个并发选项 OPTIMISTIC WITH ROWVERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 Select 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 Select 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新NOLOCK 未锁定未锁定未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定未锁定更新其它 未锁定 未锁定 未锁定 更新 *指定NOLOCK 提示将使指定了该提示的表在游标内是只读的。
16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
17、注意UNion和UNionall 的区别。UNION all好
18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
19、查询时不要返回不需要的行、列
20、用sp_configure 'query governor costlimit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME设置锁的时间
21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=","!>", "!<", "NOT", "NOT EXISTS","NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在Where字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:Where SUBSTRING(firstname,1,1)= 'm'改为Where firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT","NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。
23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: Select * FROM PersonMember (INDEX = IX_Title) Whereprocessid IN ('男','女')
25、将需要查询的结果预先计算好放在表中,查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
26、MIN() 和MAX()能使用到合适的索引。
27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程序质量高,并且执行的速度快。
28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌Insert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
29、Between在某些时候比IN 速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * fromchineseresume where title in ('男','女') Select * fromchineseresume where between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。
30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。
32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
34、没有必要时不要用DISTINCT和ORDERBY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNIONALL一样的道理。
select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
'JCNAD00333138','JCNAD00303570','JCNAD00303569',
'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
'JCNAD00254567','JCNAD00254585','JCNAD00254608',
'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
'JCNAD00279196','JCNAD00268613') order by postdate desc
35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
36、当用Select INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是 select INTO. drop table t_lxh begin tran select * intot_lxh from chineseresume where name = 'XYZ' --commit 在另一个连接中Select * from sysobjects可以看到 Select INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。
37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
38、一次更新多条记录比分多次更新每次一条快,就是说批处理好
39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好
40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:
a、计算字段的表达是确定的
b、不能用在TEXT,Ntext,Image数据类型
c、必须配制如下选项 ANSI_NULLS = ON,ANSI_PADDINGS = ON, …….
41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源,如果返回大的结果采用存储过程
42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快
43、Select COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count(Field ofnull) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的!!!
44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。
45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现
46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。
Process:
1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。
2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。
4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk QueueLength计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。
47、分析select emp_name form employeewhere salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。
48、查询的关联同写的顺序
select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = '号码')
select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = '号码', A = '号码')
select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = '号码', A = '号码')
49、
(1)IF 没有输入负责人代码 THEN code1=0code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL语句为: Select 负责人名 FROM P2000 Where 负责人代码>=:code1 AND负责人代码 <=:code2
(2)IF 没有输入负责人代码 THEN Select负责人名 FROM P2000 ELSE code= 负责人代码 Select 负责人代码 FROM P2000 Where 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件; 在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最快的查询运算。我们写程序不要怕麻烦
50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说明索引越小越好。
begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by ReferenceID
select * from @local_variable where Fid > 40 and fid <= 60
end
和
begin
DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))
insert into @local_variable (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from @local_variable where Fid > 40 and fid <= 60
end
的不同
begin
create table #temp (FID int identity(1,1),ReferenceID varchar(20))
insert into #temp (ReferenceID)
select top 100000 ReferenceID from chineseresume order by updatedate
select * from #temp where Fid > 40 and fid <= 60 drop table #temp
end
存储过程编写经验和优化措施
From:网页教学网
一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对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. 注意存储过程中参数和数据类型的关系。
xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。
b)索引的使用规范:
i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。
ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引
iii. 避免对大表查询时进行table scan,必要时考虑新建索引。
iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
v. 要注意索引的维护,周期性重建索引,重新编译存储过程。
c)tempdb的使用规范:
i. 尽量避免使用distinct、order by、groupby、having、join、cumpute,因为这些语句会加重tempdb的负担。
ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。
iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替createtable,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。
iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。
v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。
d)合理的算法使用:
根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on,set statistics time on , set showplan on 等。
解析:Microsoft SQL Server中的锁模式
在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括:
1.共享锁 SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM AUTHORS”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。
2.更新锁更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。
3.排它锁 排它锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。
4.结构锁 执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁。当编译查询时,使用架构稳定性 (Sch-S) 锁。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它锁。因此在编译查询时,其它事务(包括在表上有排它锁的事务)都能继续运行。但不能在表上执行 DDL 操作。
5.意向锁 意向锁说明SQL Server有在资源的低层获得共享锁或排它锁的意向。例如,表级的共享意向锁说明事务意图将排它锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置排它锁来修改数据。共享式排它锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置排它锁。
6.大容量更新锁 当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新锁。大容量更新锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。
详细介绍优化SQL Server 2000的设置
SQL Server已经为了优化自己的性能而进行了良好的配置,比今天市场其他的关系型数据库都要好得多。然而,你仍然有几项设置需要进行修改,以便你的数据库每分钟可以处理更多的事务(TPM)。本篇文章的目的就是讨论这些设置。我们忽略那些可以通过硬件配置或者表或者索引设计提高的性能,因为这些内容在本篇文章范围之外。
破碎页面检测
在我们开始讨论服务器配置开关之前,让我们快速浏览一下你的模型数据库--或者说用作构建新的数据库的基础的模板。默认情况下,你可以在数据库中创建存储过程、函数等类似的东西,随后他们将会被加入新创建的数据库中。
要优化性能,你也许想要关闭模型数据库中的破碎页面检测。当一个页面被成功写入磁盘的时候,破碎页面检测进行识别。如果激活了的话,你可以看到每个写操作对性能产生的每个细小的影响。大多数现代的磁盘阵列都有板上电池,使得阵列可以在突然断电的情况下完成所有的写操作--引起破碎页面的最频繁原因。
以下的步骤可以接受如何关闭破碎页面检测:
exec sp_dboption 'model', 'torn page detection', 'false'
这篇基础知识资源可以为你提供更多有关这个设置的信息。
大多数的配置是通过系统存储过程sp_configure完成的。要显示服务器的全部设置列表以便定制,你可以输入如下命令:
sp_configure 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
你可以配置的选项的数量根据你的SQL Server的版本、服务包,以及位数版本(64位的SQLServer比32位的选项要多)而定。我将直接讨论最能影响SQL Server性能优化的选项。
Affinitymask: Affinity mask让你可以控制SQL Server使用哪个处理器。对于大多数情况,你不应该接触这个设置,让操作系统控制处理器关系。然而,你也许想要用这个选项来将某个处理器专门用于另一个进程(例如,MSSearch 或者 SQL Server磁盘 IO ,以及 SQL Server的平衡)。参考基础知识资源获取更多有关这个设置的信息。
Aweenabled: Awe的启动可以让SQL Server Enterprise版本运行在Windows 2000以及以上高级服务器上,或者Windows 2003 Enterprise以及以上的版本使用超过4GB的内存。如果你的服务器符合这些条件的话,就激活这个设置吧。
并行成本极限:当查询需要进行并行处理的时候,并行的成本极限就定下来了。默认情况是五秒钟。将这个数值改为稍低的数值,俄可以让更多个查询获得并行处理,但是这也会引起CPU瓶颈。这个设置只有在多个处理器的机器上才会起作用。
填充因子:填充因子设置了在创建聚簇索引的时候用来自动填充的因子。在频繁插入的表中,将数值从默认的90%设置为较低的数值,你会获得收益。
轻量级缓冲池:这个设置启动了光纤模式。使用这个选项在CPU利用率很高的8路及其以上的服务器上。这可以让光纤同时为每个线程提供服务,同时在默认情况下运行在每个处理器上。某些任务可以从这些光纤中获得优势。
并行的最大程度:当服务器可以使用并行或者不能使用并行,或者是当某个数量的处理器可以用于并行操作的时候,这个设置就确定了。并行就是多个处理器上发生多个处理。例如,查询的并行操作可以在不同的处理器上同时处理。
服务器最大内存(MB):如果你在SQL Server上运行了其他的处理,并且有足够的内存,那么你有可能想要留出512MB的内存给操作系统和这些进程。例如,你可以在MSSearch或者在本地运行大量的代理的情况下将其设置为512。
最大工作线程:最大工作线程设置与ADO.net中的连接池有些类似。通过这个设置,任何超过限制(255个用户)的用户连接都可以在线程池中等待,直到为某个连接服务的线程得到释放,就好像是ADO.net中的连接与连接池共享。如果你有很大量的连接,并且大量的内存,那么你就可以提高这个数值。
网络包尺寸(B):这个设置控制了网络中传输到你的客户端的包的尺寸。在有损耗的网络中(例如电话线),你可能想要将这个参数设置为比较低的数值,墨人数值是4096。在连接良好的网络中,你可以提高这个设置,特别是涉及BLOB的大型批处理操作。
优先推进:这个设置为SQL Server提供了处理器的推动。在任务管理器中,点击进程标签,定位SQL Server的位置,然后右击它。选择“设置优先级别”。注意,SQL Server应该运行在正常的优先级别上。输入如下命令:
Sp_configure 'priority boost', 1
Reconfigure with override
然后重新启动你的SQL Server。在任务管理器中察看SQL Server现在运行在什么优先级别上。它应该是在高优先级上。SQL Server应该比其他的用户进程运行优先级别要高。在专用于SQL Server的服务器上使用这个设置。
总结
本篇讨论了最常见的SQL Server优化设置。在做出改变之前和之后分别在测试环境中进行基线确定是非常重要的,可以据此来评估在典型的负载下,改变对你的系统的影响。
SQL Server 数据库中关于死锁的分析
SQL Server数据库发生死锁时不会像ORACLE那样自动生成一个跟踪文件。有时可以在[管理]->[当前活动] 里看到阻塞信息(有时SQL Server企业管理器会因为锁太多而没有响应).
设定跟踪1204:
USE MASTER
DBCC TRACEON (1204,-1)
显示当前启用的所有跟踪标记的状态:
DBCCTRACESTATUS(-1)
取消跟踪1204:
DBCCTRACEOFF (1204,-1)
在设定跟踪1204后,会在数据库的日志文件里显示SQL Server数据库死锁时一些信息。但那些信息很难看懂,需要对照SQL Server联机丛书仔细来看。根据PAG锁要找到相关数据库表的方法:
DBCCTRACEON (3604)
DBCC PAGE (db_id,file_id,page_no)
DBCC TRACEOFF (3604)
请参考sqlservercentral.com上更详细的讲解.但又从CSDN学到了一个找到死锁原因的方法。我稍加修改, 去掉了游标操作并增加了一些提示信息,写了一个系统存储过程sp_who_lock.sql。代码如下:
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[sp_who_lock]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_who_lock]
GO
/**//********************************************************
// 创建 : fengyu 邮件 : [email protected]
// 日期 :2004-04-30
// 修改 : 从http://www.csdn.net/develop/Read_Article.asp?id=26566
// 学习到并改写
// 说明 : 查看数据库里阻塞和死锁情况
********************************************************/
use master
go
create procedure sp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR<>0 RETURN @@ERROR
insert into #tmp_lock_who(spid,bl) select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses
where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
IF @@ERROR<>0 RETURN @@ERROR
-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who
IF @@ERROR<>0 RETURN @@ERROR
if @intCountProperties=0
select '现在没有阻塞和死锁信息' as message
-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
begin
if @spid =0
select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10))
+ '进程号,其执行的SQL语法如下'
else
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被'
+ '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
end
-- 循环指针下移
set @intCounter = @intCounter + 1
end
drop table #tmp_lock_who
return 0
end
需要的时候直接调用:
sp_who_lock
就可以查出引起死锁的进程和SQL语句.
SQL Server自带的系统存储过程sp_who和sp_lock也可以用来查找阻塞和死锁, 但没有这里介绍的方法好用。如果想知道其它tracenum参数的含义,请看www.sqlservercentral.com文章
我们还可以设置锁的超时时间(单位是毫秒), 来缩短死锁可能影响的时间范围:
例如:
use master
seelct @@lock_timeout
set lock_timeout 900000
-- 15分钟
seelct @@lock_timeout
优化SQLServer索引的小技巧
SQLServer中有几个可以让你检测、调整和优化SQL Server性能的工具。在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识。
关于索引的常识
影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引。当考察建立什么类型的索引时,你应当考虑数据类型和保存这些数据的 column。同样,你也必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型。
索引的类型
如果column保存了高度相关的数据,并且常常被顺序访问时,最好使用clustered索引,这是因为如果使用clustered索引,SQL Server会在物理上按升序(默认)或者降序重排数据列,这样就可以迅速的找到被查询的数据。同样,在搜寻控制在一定范围内的情况下,对这些 column也最好使用clustered索引。这是因为由于物理上重排数据,每个表格上只有一个clustered索引。
与上面情况相反,如果columns包含的数据相关性较差,你可以使用nonculstered索引。你可以在一个表格中使用高达249个nonclustered索引--尽管我想象不出实际应用场合会用的上这么多索引。
当表格使用主关键字(primary keys),默认情况下SQL Server会自动对包含该关键字的column(s)建立一个独有的cluster索引。很显然,对这些column(s)建立独有索引意味着主关键字的唯一性。当建立外关键字(foreign key)关系时,如果你打算频繁使用它,那么在外关键字cloumn上建立nonclustered索引不失为一个好的方法。如果表格有 clustered索引,那么它用一个链表来维护数据页之间的关系。相反,如果表格没有clustered索引,SQL Server将在一个堆栈中保存数据页。
数据页
当索引建立起来的时候,SQLServer就建立数据页(datapage),数据页是用以加速搜索的指针。当索引建立起来的时候,其对应的填充因子也即被设置。设置填充因子的目的是为了指示该索引中数据页的百分比。随着时间的推移,数据库的更新会消耗掉已有的空闲空间,这就会导致页被拆分。页拆分的后果是降低了索引的性能,因而使用该索引的查询会导致数据存储的支离破碎。当建立一个索引时,该索引的填充因子即被设置好了,因此填充因子不能动态维护。
为了更新数据页中的填充因子,我们可以停止旧有索引并重建索引,并重新设置填充因子(注意:这将影响到当前数据库的运行,在重要场合请谨慎使用)。 DBCC INDEXDEFRAG和DBCCDBREINDEX是清除clustered和nonculstered索引碎片的两个命令。INDEXDEFRAG是一种在线操作(也就是说,它不会阻塞其它表格动作,如查询),而DBREINDEX则在物理上重建索引。在绝大多数情况下,重建索引可以更好的消除碎片,但是这个优点是以阻塞当前发生在该索引所在表格上其它动作为代价换取来得。当出现较大的碎片索引时,INDEXDEFRAG会花上一段比较长的时间,这是因为该命令的运行是基于小的交互块(transactional block)。
填充因子
当你执行上述措施中的任何一个,数据库引擎可以更有效的返回编入索引的数据。关于填充因子(fillfactor)话题已经超出了本文的范畴,不过我还是提醒你需要注意那些打算使用填充因子建立索引的表格。
在执行查询时,SQL Server动态选择使用哪个索引。为此,SQL Server根据每个索引上分布在该关键字上的统计量来决定使用哪个索引。值得注意的是,经过日常的数据库活动(如插入、删除和更新表格),SQL Server用到的这些统计量可能已经“过期”了,需要更新。你可以通过执行DBCC SHOWCONTIG来查看统计量的状态。当你认为统计量已经“过期”时,你可以执行该表格的UPDATE STATISTICS命令,这样SQL Server就刷新了关于该索引的信息了。
建立数据库维护计划
SQL Server提供了一种简化并自动维护数据库的工具。这个称之为数据库维护计划向导(Database Maintenance Plan Wizard ,DMPW)的工具也包括了对索引的优化。如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引所带来的工作量。如果你不想自动定期刷新索引统计量,你还可以在DMPW中选择重新组织数据和数据页,这将停止旧有索引并按特定的填充因子重建索引。
Sybase SQL Server索引的使用和优化
在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡 量应用系统成败的标准。而采用索引来加快数据处理速度也成为广大数据库用户所 接受的优化方法。
在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引。因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了。所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程。但是,索引并不总是提高系统的性能,在增、删、改操作中索引的存在会增加一定的工作量,因此,在适当的地方增加适当的索引并从不合理的地方删除次优的索引,将有助于优化那些性能较差的SQL Server应用。实践表明,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案。本文就SQL Server索引的性能问题进行了一些分析和实践。
一、聚簇索引(clustered indexes)的使用
聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。建立聚簇索引的思想是:
1、 大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。
2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、>、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
3、 在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。
4、 在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。
5、 选择聚簇索引应基于where子句和连接操作的类型。聚簇索引的侯选列是:
● 主键列,该列在where子句中使用并且插入是随机的。
● 按范围存取的列,如pri_order > 100 and pri_order < 200 。
● 在groupby或order by中使用的列。
● 不经常修改的列。
● 在连接操作中使用的列。
二、非聚簇索引(nonclustered indexes)的使用
SQLServer缺省情况下建立的索引是非聚簇索引,由于非聚簇索引不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。换句话说非聚簇索引具有在索引结构和数据本身之间的一个额外级。一个表如果没有聚簇索引时,可有250个非聚簇索引。每个非聚簇索引提供访问数据的不同排序顺序。在建立非聚簇索引时,要权衡索引对查询速度的加快与降低修改速度之间的利弊。另外,还要考虑这些问题:
● 索引需要使用多少空间。
● 合适的列是否稳定。
● 索引键是如何选择的,扫描效果是否更佳。
● 是否有许多重复值。
对更新频繁的表来说,表上的非聚簇索引比聚簇索引和根本没有索引需要更多的额外开销。对移到新页的每一行而言,指向该数据的每个非聚簇索引的页级行也必须更新,有时可能还需要索引页的分理。从一个页面删除数据的进程也会有类似的开销,另外,删除进程还必须把数据移到页面上部,以保证数据的连续性。所以,建立非聚簇索引要非常慎重。非聚簇索引常被用在以下情况:
● 某列常用于集合函数(如Sum,....)。
● 某列常用于join,order by,group by。
● 查寻出的数据不超过表中数据量的20%。
三、覆盖索引(covering indexes)的使用
覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这 种索引之所以比较快也正是因为索引页中包含了查寻所必须的数据,不需去访 问数据页。 如果非聚簇索引中包含结果数据,那么它的查询速度将快于聚簇索引。
但是由于覆盖索引的索引项比较多,要占用比较大的空间。而且update 操 作会引起索引值改变。所以如果潜在的覆盖查询并不常用或不太关键,则覆盖索引的增加反而会降低性能。
四、索引的选择技术
p_detail是住房公积金管理系统中记录个人明细的表,有890000行,观察在不同索引下的查询运行效果,测试在C/S环境下进行,客户机是 IBM PII350(内存64M),服务器是DEC Alpha1000A(内存128M),数据库为SYBASE11.0.3。
1、select count(*) from p_detail where op_date>’19990101’ andop_date<’19991231’ and pri_surplus1>300
2、select count(*),sum(pri_surplus1) from p_detail where op_date>’19990101’ andpay_month between ‘199908’ and ’199912’
不建任何索引 查询1 1分15秒
查询2 1分7秒
在op_date上建非聚簇索引 查询1 57秒
查询2 57秒
在op_date上建聚簇索引 查询1 <1秒
查询2 52秒
在pay_month、op_date、pri_surplus1上建索引 查询1 34秒
查询2 <1秒
在op_date、pay_month、pri_surplus1上建索引 查询1<1秒
查询2 <1秒
从以上查询效果分析,索引的有无,建立方式的不同将会导致不同的查询效果,选择什么样的索引基于用户对数据的查询条件,这些条件体现于where从句和join表达式中。一般来说建立索引的思路是:
(1)、主键时常作为where子句的条件,应在表的主键列上建立聚簇索引,尤其当经常用它作为连接的时候。
(2)、有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚簇索引。
(3)、经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果可能尽量使关键查询形成覆盖查询。
(4)、如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。
(5)、在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表上建索引,则可以把fillfactor置为100。
(6)、在选择索引键时,设法选择那些采用小数据类型的列作为键以使每个索
引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。
五、索引的维护
上面讲到,某些不合适的索引影响到SQL Server的性能,随着应用系统的运行,数据不断地发生变化,当数据变化达到某一个程度时将 会影响到索引的使用。这时 需要用户自己来维护索引。索引的维护包括:
1、重建索引
随着数据行的插入、删除和数据页的分裂,有些索引页可能只包含几页数据,另外应用在执行大块I/O的时候,重建非聚簇索引可以降低分片,维护大块I/O的效率。重建索引实际上是重新组织B-树空间。在下面情况下需要重建索引:
(1)、数据和使用模式大幅度变化。
(2)、排序的顺序发生改变。
(3)、要进行大量插入操作或已经完成。
(4)、使用大块I/O的查询的磁盘读次数比预料的要多。
(5)、由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算。
(6)、dbcc检查出索引有问题。
当重建聚簇索引时,这张表的所有非聚簇索引将被重
建.
2、索引统计信息的更新
当在一个包含数据的表上创建索引的时候,SQL Server会创建分布数据页来存放有关索引的两种统计信息:分布表和密度表。优化器利用这个页来判断该索引对某个特定查询是否有用。但这个统计信息并不动态地重新计算。这意味着,当表的数据改变之后,统计信息有可能是过时的,从而影响优化器追求最有工作的目标。因此,在下面情况下应该运行update statistics命令:
(1)、数据行的插入和删除修改了数据的分布。
(2)、对用truncate table删除数据的表上增加数据行。
(3)、修改索引列的值。
六、结束语
实践表明,不恰当的索引不但于事无补,反而会降低系统的执行性能。因为大量的索引在插入、修改和删除操作时比没有索引花费更多的系统时间。例如下面情况下建立的索引是不恰当的:
● 在查询中很少或从不引用的列不会受益于索引,因为索引很少或从来不必搜索基于这些列的行。
● 只有两个或三个值的列,如男性和女性(是或否),从不会从索引中得到好处。
另外,鉴于索引加快了查询速度,但减慢了数据更新速度的特点。可通过在一个段上建表,而在另一个段上建其非聚簇索引,而这两段分别在单独的物理设备上来改善操作性能。
为了防止某些别有用心的人从外部访问数据库,盗取数据库中的用户姓名、密码、信用卡号等其他重要信息,在我们创建数据库驱动的解决方案时,我们首先需要考虑的的第一条设计决策就是如何加密存储数据,以此来保证它的安全,免受被他人窥测。
SQL Server中有哪一种支持可以用于加密对象和数据?从一开始就讨论一下SQL Server欠缺什么是明智的,或者是对于SQL Server中的加密部分你不应该做什么。
首先,SQL Server有两个内置的密码函数——即,pwdencrypt() 和 pwdcompare()。同时,还有两个SQL Server用来管理密码哈希的没有正式记录的函数:pwdencrypt() 将密码哈希过后进行存储; pwdcompare()将提供的字符串与哈希后的字符串进行比较。不幸的是,这个哈希函数不是非常安全,它可以通过字典攻击算法被破解(类似命令行应用程序!)。
这些函数随着SQL Server的版本发展而不断进行修改,这也是另一个没有使用它们的原因。早期版本的SQL Server对密码进行的哈希,在后来的版本中无法解密,所以如果你依赖一个版本中的函数,那么当升级的时候,所有你的加密数据就都没有用了,除非你可以首先对其解密——这也就违背了加密的最初的目的。
第二,你可能会尝试去创建一个针对你的数据库的自制的加密解决方案,但是有以下三个理由说明你不要这样做:
除非你是加密专家,否则胡乱编写的加密系统只会提供非常低级的价值不高的保护。新鲜的是,单向密码哈希或者 "ROTx "形式的加密几乎不需要费事就可以被轻松打败。
如果由于你自己的能力的缺乏而导致加密被破解,那么你的数据就完蛋了。你需要将所有的东西进行没有加密的备份,是吗?(即使你加密了,那里有没有安全漏洞?)
当市面上提供有专业级别的,具有工业强度的加密解决方案的时候,你就不值得花费时间去自己做。把你的时间用于构建一个好的,坚固的数据库,而不是再重新发明一次车轮。
那么,什么才是好的加密数据的方式呢?
对于新手,微软提供了一个自己生成的加密解决方案,CryptoAPI 。对于轻量级的加密,军用级别的安全就不在考虑范围之内,它具有相对容易实现的优势:管理员可以安装一个名为CAPICOM 的ActiveX 控制,它可以在T-SQL存储过程中提供CryptoAPI 功能。CAPICOM 支持各种类型的双向加密和单向哈希算法,所以管理员可以挑选最适合应用程序的问题的部分。
如果你对使用微软的解决方案不感兴趣,还有一些很好的第三方的方案可以使用。一家名为ActiveCrypt 的软件有限责任公司制造了XP_CRYPT ,它是SQL Server的插件,可以在视图、程序和触发器中通过扩展存储过程和用户自定义函数(在SQL Server 2000中)来完成加密。你可以下载一个支持无线的MD5,DES ,以及SHA1哈希的免费版本的应用程序; 其他的加密模型就是在比特深度上进行的。(完全版本是无限的。)在你自己的代码中,你可以使用XP_CRYPT,与ActiveX 控制一样(在受限的免费版本中)。对于ASP程序员来说,一个名为AspEncrypt 的组件提供了一种将高级加密整合到你的代码中的简单方式。
对数据库文件自身进行加密或者提供传输层上的安全保护怎么样?对于前者,大家可以在Windows系统中持续使用加密文件系统。然而,你必须保存加密密钥的备份,在出现问题的时候,这个数据有可能会丢失。对于后者,有IPSec和SQL Server自己的SSL加密,都是SQL Server和Windows自带的大家的主要精力应该放在避免以明文存储敏感数据,因为从数据库中抽取没有加密的数据同样是最容易受到攻击的薄弱环节。
假如您在安装SQL Server 2005时出现计数器错误,在搜索过所有的方法都不适用的情况下可以采用以下方法:
将4个计数器删除:(如果没有说清楚是哪个计数器的错误)
运行 cmd
unlodctrw3svc
unlodctrmsftpsvc
unlodctrASP
unlodctrinetinfo
执行下面的代码片段后,重新安装SQLServer2005就不会有问题了。
lodctrw3ctrs.ini
lodctrftpctrs.ini
lodctraxperf.ini
lodctrinfoctrs.ini
0 操作成功完成。
1 功能错误。
2 系统找不到指定的文件。
3 系统找不到指定的路径。
4 系统无法打开文件。
5 拒绝访问。
6 句柄无效。
7 存储控制块被损坏。
8 存储空间不足,无法处理此命令。
9 存储控制块地址无效。
10 环境错误。
11 试图加载格式错误的程序。
12 访问码无效。
13 数据无效。
14 存储器不足,无法完成此操作。
15 系统找不到指定的驱动器。
16 无法删除目录。
17 系统无法将文件移到不同的驱动器。
18 没有更多文件。
19 介质受写入保护。
20 系统找不到指定的设备。
21 设备未就绪。
22 设备不识别此命令。
23 数据错误 (循环冗余检查)。
24 程序发出命令,但命令长度不正确。
25 驱动器无法找出磁盘上特定区域或磁道的位置。
26 无法访问指定的磁盘或软盘。
27 驱动器找不到请求的扇区。
28 打印机缺纸。
29 系统无法写入指定的设备。
30 系统无法从指定的设备上读取。
31 连到系统上的设备没有发挥作用。
32 进程无法访问文件,因为另一个程序正在使用此文件。
33 进程无法访问文件,因为另一个程序已锁定文件的一部分。
36 用来共享的打开文件过多。
38 到达文件结尾。
39 磁盘已满。
50 不支持网络请求。
51 远程计算机不可用 。
52 在网络上已有重复的名称。
53 找不到网络路径。
54 网络忙。
55 指定的网络资源或设备不再可用。
56 已到达网络 BIOS 命令限制。
57 网络适配器硬件出错。
58 指定的服务器无法运行请求的操作。
59 发生意外的网络错误。
60 远程适配器不兼容。
61 打印机队列已满。
62 无法在服务器上获得用于保存待打印文件的空间。
63 删除等候打印的文件。
64 指定的网络名不再可用。
65 拒绝网络访问。
66 网络资源类型错误。
67 找不到网络名。
68 超过本地计算机网卡的名称限制。
69 超出网络 BIOS 会话限制。
70 远程服务器已暂停,或正在启动过程中。
71 当前已无法再同此远程计算机连接,因为已达到计算机的连接数目极限。
72 已暂停指定的打印机或磁盘设备。
80 文件存在。
82 无法创建目录或文件。
83 INT 24 失败。
84 无法取得处理此请求的存储空间。
85 本地设备名已在使用中。
86 指定的网络密码错误。
87 参数错误。
88 网络上发生写入错误。
89 系统无法在此时启动另一个进程。
100 无法创建另一个系统信号灯。
101 另一个进程拥有独占的信号灯。
102 已设置信号灯且无法关闭。
103 无法再设置信号灯。
104 无法在中断时请求独占的信号灯。
105 此信号灯的前一个所有权已结束。
107 程序停止,因为替代的软盘未插入。
108 磁盘在使用中,或被另一个进程 锁定。
109 管道已结束。
110 系统无法打开指定的 设备或文件。
111 文件名太长。
112 磁盘空间不足。
113 无法再获得内部文件的标识。
114 目标内部文件的标识不正确。
117 应用程序制作的 IOCTL 调用错误。
118 验证写入的切换参数值错误。
119 系统不支持请求的命令。
120 此功能只被此系统支持。
121 信号灯超时时间已到。
122 传递到系统调用的数据区太小。
123 文件名、目录名或卷标语法不正确。
124 系统调用级别错误。
125 磁盘没有卷标。
126 找不到指定的模块。
127 找不到指定的程序。
128 没有等候的子进程。
130 试图使用操作(而非原始磁盘 I/O)的已打开磁盘分区的文件句柄。
131 试图移动文件指针到文件开头之前。
132 无法在指定的设备或文件上设置文件指针。
133 包含先前加入驱动器的驱动器无法使用 JOIN 或 SUBST 命令。
134 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
135 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
136 系统试图解除未合并驱动器的 JOIN。
137 系统试图解除未替代驱动器的 SUBST。
138 系统试图将驱动器合并到合并驱动器上的目录。
139 系统试图将驱动器替代为替代驱动器上的目录。
140 系统试图将驱动器合并到替代驱动器上的目录。
141 系统试图替代驱动器为合并驱动器上的目录。
142 系统无法在此时运行 JOIN 或 SUBST。
143 系统无法将驱动器合并到或替代为相同驱动器上的目录。
144 目录并非根目录下的子目录。
145 目录非空。
146 指定的路径已在替代中使用。
147 资源不足,无法处理此命令。
148 指定的路径无法在此时使用。
149 企图将驱动器合并或替代为驱动器上目录是上一个替代的目标的驱动器。
150 系统跟踪信息未在 CONFIG.SYS 文件中指定,或不允许跟踪。
151 为 DosMuxSemWait 指定的信号灯事件个数错误。
152 DosMuxSemWait 不可运行。已设置过多的信号灯。
153 DosMuxSemWait 清单错误。
154 输入的卷标超过目标文件系统的 长度限制
155 无法创建另一个线程。
156 接收进程已拒绝此信号。
157 段已被放弃且无法锁定。
158 段已解除锁定。
159 线程标识的地址错误。
160 传递到 DosExecPgm 的参数字符串错误。
161 指定的路径无效。
162 信号已暂停。
164 无法在系统中创建更多的线程。
167 无法锁定文件区域。
170 请求的资源在使用中。
173 对于提供取消区域进行锁定的请求不明显。
174 文件系统不支持锁定类型的最小单元更改。
180 系统检测出错误的段号。
183 当文件已存在时,无法创建该文件。
186 传递的标志错误。
187 找不到指定的系统信号灯名称。
196 操作系统无法运行此应用程序。
197 操作系统当前的配置不能运行此应用程序。
199 操作系统无法运行此应用程序。
错误:1807
在sqlserver创建数据库的时候,系统有时候会提示:未能获得数据库model上的排它锁,自然数据库无法创建
解决方案:
--试试查询分析器中执行下面的语句看看能否建库
use master
go
declare hcforeach cursor global for select 'kill '+rtrim(spid) fromsysprocesses where dbid=db_id('model')
exec sp_msforeach_worker '?'
go
create database aa
SQL SERVER数据类型
字段类型 |
描述 |
bit |
0或1的整型数字 |
int |
从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字 |
smallint |
从-2^15(-32,768)到2^15(32,767)的整型数字 |
tinyint |
从0到255的整型数字 |
|
|
decimal |
从-10^38到10^38-1的定精度与有效位数的数字 |
numeric |
decimal的同义词 |
|
|
money |
从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十 |
smallmoney |
从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十 |
|
|
float |
从-1.79E+308到1.79E+308可变精度的数字 |
real |
从-3.04E+38到3.04E+38可变精度的数字 |
|
|
datetime |
从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒 |
smalldatetime |
从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟 |
|
|
timestamp |
时间戳,一个数据库宽度的唯一数字 |
uniqueidentifier |
全球唯一标识符GUID |
|
|
char |
定长非Unicode的字符型数据,最大长度为8000 |
varchar |
变长非Unicode的字符型数据,最大长度为8000 |
text |
变长非Unicode的字符型数据,最大长度为2^31-1(2G) |
|
|
nchar |
定长Unicode的字符型数据,最大长度为8000 |
nvarchar |
变长Unicode的字符型数据,最大长度为8000 |
ntext |
变长Unicode的字符型数据,最大长度为2^31-1(2G) |
|
|
binary |
定长二进制数据,最大长度为8000 |
varbinary |
变长二进制数据,最大长度为8000 |
image |
变长二进制数据,最大长度为2^31-1(2G) |
在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
在SQL Server 中每个变量、参数、表达式等都有数据类型。系统提供的数据类型分为几大类,如表4-2所示。
其中,BIGINT、SQL_VARIANT 和TABLE 是SQLServer 2000 中新增加的3 种数据类型。下面分类讲述各种数据类型。
一、 整数数据类型
整数数据类型是最常用的数据类型之一。
1、INT(INTEGER)
INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147,483 ,648)到2的31次方-1 (2 ,147,483,647) 之间的所有正负整数。每个INT类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINT
SMALLINT 数据类型存储从-2的15次方(-32, 768) 到2的15次方-1( 32,767 )之间的所有正负整数。每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3、TINYINT
TINYINT数据类型存储从0 到255之间的所有正整数。每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINT
BIGINT 数据类型存储从-2^63 (-9 ,223,372, 036, 854,775, 807) 到2^63-1( 9,223, 372, 036 ,854,775, 807)之间的所有正负整数。每个BIGINT类型的数据占用8个字节的存储空间。
二、 浮点数据类型
浮点数据类型用于存储十进制小数。浮点数值的数据在SQLServer 中采用上舍入(Round up 或称为只入不舍)方式进行存储。所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。如:对3.14159265358979分别进行2 位和12位舍入,结果为3.15和3.141592653590。
1、REAL数据类型
REAL数据类型可精确到第7 位小数,其范围为从-3.40E-38 到3.40E +38。每个REAL类型的数据占用4 个字节的存储空间。
2、FLOAT
FLOAT 数据类型可精确到第15 位小数,其范围为从-1.79E-308 到1.79E +308。 每个FLOAT类型的数据占用8 个字节的存储空间。FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT数据的精度。n 为1到15 之间的整数值。当n 取1 到7 时,实际上是定义了一个REAL类型的数据,系统用4 个字节存储它;当n 取8 到15 时,系统认为其是FLOAT类型,用8 个字节存储它。
3、DECIMAL
DECIMAL数据类型可以提供小数所需要的实际存储空间,但也有一定的限制,您可以用2 到17 个字节来存储从-10的38次方-1 到10的38次方-1 之间的数值。可将其写为DECIMAL[p [s] ]的形式,p 和s 确定了精确的比例和数位。其中p 表示可供存储的值的总位数(不包括小数点),缺省值为18; s 表示小数点后的位数,缺省值为0。 例如:decimal(15 5),表示共有15 位数,其中整数10 位,小数5。 位表4-3列出了各精确度所需的字节数之间的关系。
4、NUMERIC
NUMERIC数据类型与DECIMAL数据类型完全相同。
注意:SQL Server 为了和前端的开发工具配合,其所支持的数据精度默认最大为28位。但可以通过使用命令来执行sqlserver.exe程序以启动SQLServer,可改变默认精度。命令语法如下:SQLSERVR[/Dmaster_device_path][/P precisim_leve1]
例4-4: 用最大数据精度38 启动SQLServer
sqlservr /d c:\ Mssql2000\data\master.dat /p38
/*在使用了/P 参数后,如果其后没有指定具体的精度数值,则默认为38 位./*
三、二进制数据类型
1、BINARY
BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY类型数据占用n+4 个字节的存储空间。在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上述的“0xabc”会被系统自动变为“0x0abc”。
2、VARBINARY
VARBINARY 数据类型的定义形式为VARBINARY(n)。 它与BINARY类型相似,n 的取值也为1 到8000,若输入的数据过长,将会截掉其超出部分。不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度为实际数值长度+4个字节。当BINARY数据类型允许NULL值时,将被视为VARBINARY数据类型。
一般情况下,由于BINARY 数据类型长度固定,因此它比VARBINARY类型的处理速度快。
四、 逻辑数据类型
BIT: BIT数据类型占用1 个字节的存储空间,其值为0 或1 。如果输入0 或1 以外的值,将被视为1。BIT 类型不能定义为NULL 值(所谓NULL值是指空值或无意义的值)。
五、字符数据类型
字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号’或双引号” 。
1 CHAR
CHAR 数据类型的定义形式为CHAR[ (n) 。 以CHAR类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 到8000, 即可容纳8000个ANSI 字符。若不指定n 值,则系统默认值为1。若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
2、NCHAR
NCHAR 数据类型的定义形式为NCHAR[(n)]。 它与CHAR类型相似。不同的是NCHAR数据类型n 的取值为1 到4000。 因为NCHAR类型采用UNICODE 标准字符集(CharacterSet)。UNICODE 标准规定每个字符占用两个字节的存储空间,所以它比非UNICODE标准的数据类型多占用一倍的存储空间。使用UNICODE 标准的好处是因其使用两个字节做存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文、德文等,而不会出现编码冲突。
3、VARCHAR
VARCHAR数据类型的定义形式为VARCHARn)。 它与CHAR类型相似,n 的取值也为1 到8000,若输入的数据过长,将会截掉其超出部分。不同的是,VARCHAR数据类型具有变动长度的特性,因为VARCHAR数据类型的存储长度为实际数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填满设定好的空间。
一般情况下,由于CHAR 数据类型长度固定,因此它比VARCHAR类型的处理速度快。
4、NVARCHAR
NVARCHAR数据类型的定义形式为NVARCHAR[ (n) ]。 它与VARCHAR类型相似。不同的是,NVARCHAR数据类型采用UNICODE标准字符集(Character Set), n 的取值为1 到4000。
六、文本和图形数据类型
这类数据类型用于存储大量的字符或二进制数据。
1、TEXT
TEXT数据类型用于存储大量文本数据,其容量理论上为1 到2的31次方-1 (2,147, 483, 647)个字节,在实际应用时需要视硬盘的存储空间而定。
SQL Server 2000 以前的版本中,数据库中一个TEXT 对象存储的实际上是一个指针,它指向一个个以8KB(8192 个字节)为单位的数据页(Data Page)。这些数据页是动态增加并被逻辑链接起来的。在SQLServer 2000 中,则将TEXT 和IMAGE类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。这就减少了用于存储TEXT 和IMA-GE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。
2 NTEXT
NTEXT数据类型与TEXT.类型相似不同的,是NTEXT类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1,073, 741, 823)个字节。
3 IMAGE
IMAGE 数据类型用于存储大量的二进制数据Binary Data。其理论容量为2的31次方-1(2,147,483,647)个字节。其存储数据的模式与TEXT数据类型相同。通常用来存储图形等OLE Object Linking and Embedding,对象连接和嵌入)对象。在输入数据时同BINARY数据类型一样,必须在数据前加上字符“0X”作为二进制标识
七、 日期和时间数据类型
1 DATETIME
DATETIME 数据类型用于存储日期和时间的结合体。它可以存储从公元1753年1 月1 日零时起到公元9999年12 月31 日23 时59 分59 秒之间的所有日期和时间,其精确度可达三百分之一秒,即3.33毫秒。DATETIME 数据类型所占用的存储空间为8 个字节。其中前4 个字节用于存储1900年1 月1 日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期。后4 个字节用于存储从此日零时起所指定的时间经过的毫秒数。如果在输入数据时省略了时间部分,则系统将12:00:00:000AM作为时间缺省值:如果省略了日期部分,则系统将1900年1 月1 日作为日期缺省值。
2 SMALLDATETIME
SMALLDATETIME 数据类型与DATETIME 数据类型相似,但其日期时间范围较小,为从1900年1 月1 日到2079年6 月6:日精度较低,只能精确到分钟,其分钟个位上为根据秒数四舍五入的值,即以30 秒为界四舍五入。如:DATETIME时间为14:38:30.283
时SMALLDATETIME 认为是14:39:00SMALLDATETIME 数据类型使用4 个字节存储数据。其中前2 个字节存储从基础日期1900年1 月1 日以来的天数,后两个字节存储此日零时起所指定的时间经过的分钟数。
下面介绍日期和时间的输入格式
日期输入格式
日期的输入格式很多大致可分为三类:
* 英文+数字格式
此类格式中月份可用英文全名或缩写,且不区分大小写;年和月日之间可不用逗号;
年份可为4 位或2 位;当其为两位时,若值小于50 则视为20xx年,若大于或等于50 则
视为19xx年;若日部分省略,则视为当月的1号。以下格式均为正确的日期格式:
June 21 2000 Oct 1 1999 January 2000 2000February
2000 May 1 2000 1 Sep 99 June July 00
* 数字+分隔符格式
允许把斜杠(/)、连接符(-)和小数点(.)作为用数字表示的年、月、日之间的分
隔符。如:
YMD:2000/6/222000-6-22 2000.6.22
MDY:3/5/20003-5-2000 3.5.2000
DMY:31/12/199931-12-1999 31.12.2000
* 纯数字格式
纯数字格式是以连续的4 位6、位或8 位数字来表示日期。如果输入的是6 位或8 位
数字,系统将按年、月、日来识别,即YMD格式,并且月和日都是用两位数字来表示:
如果输入的数字是4 位数,系统认为这4 位数代表年份,其月份和日缺省为此年度的1 月
1 日。如:
20000601---2000 年6 月1 日991212---1999 年12 月12 日1998---1998 年 ????
时间输入格式
在输入时间时必须按“小时、分钟、秒、毫秒”的顺序来输入。在其间用冒号“:”隔开。但可将毫秒部分用小数点“.” 分,隔其后第一位数字代表十分之一秒,第二位数字代表百分之一秒,第三位数字代表千分之一秒。当使用12 小时制时用AM。am 和PM(pm)分别指定时间是午前或午后,若不指定,系统默认为AM。AM 与PM 均不区分大小写。如:
3:5:7.2pm---下午3 时5 分7 秒200毫秒
10:23:5.123Am---上午10 时23 分5 秒123毫秒
可以使用SET DATEFORMAT 命令来设定系统默认的日期-时间格式。
八、货币数据类型
货币数据类型用于存储货币值。在使用货币数据类型时,应在数据前加上货币符号,系统才能辨识其为哪国的货币,如果不加货币符号,则默认为“¥”。各货币符号如图4-2所示。
1 MONEY
MONEY 数据类型的数据是一个有4 位小数的DECIMAL值,其取值从-2的63次方(-922,337,203,685,477.5808到2的63次方-1(+922,337,203,685,477.5807),数据精度为万分之一货币单位。MONEY 数据类型使用8个字节存储。
2 SMALLMONEY
SMALLMONEY数据类型类似于MONEY 类型,但其存储的货币值范围比MONEY数据类型小,其取值从-214,748.3648到+214,748.3647,存储空间为4 个字节。
九、 特定数据类型
SQL Server 中包含了一些用于数据存储的特殊数据类型。
1 TIMESTAMP
TIMESTAMP 数据类型提供数据库范围内的惟一值此类型相当于BINARY8或VARBINARY(8),但当它所定义的列在更新或插入数据行时,此列的值会被自动更新,一个计数值将自动地添加到此TIMESTAMP数据列中。每个数据库表中只能有一个TIMESTAMP数据列。如果建立一个名为 “TIMESTAMP”的列,则该列的类型将被自动设为TIMESTAMP数据类型。
2 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER 数据类型存储一个16 位的二进制数字。此数字称为(GUIDGloballyUnique Identifier ,即全球惟一鉴别号)。此数字由SQLServer 的NEWID函数产生的全球惟一的编码,在全球各地的计算机经由此函数产生的数字不会相同。
十、用户自定义数据类型
SYSNAME SYSNAME 数据类型是系统提供给用户的,便于用户自定义数据类型。它被定义为NVARCHAR(128),即它可存储128个UNICODE字符或256个一般字符。其具体使用方法请参见第7章“管理数据库表”中的“自定义数据类型”章节。
十一、 新数据类型
SQL Server 2000 中增加了3 种数据类型:BIGINT、SQL_VARIANT和TABLE。其中BIGINT数据类型已在整数类型中介绍,下面介绍其余两种:
1 SQL_VARIANT
SQL_VARIANT数据类型可以存储除文本、图形数据(TEXT、NTEXT、IMAGE)和TIMESTAMP类型数据外的其它任何合法的SQLServer数据。此数据类型大大方便了SQL Server的开发工作。
2 TABLE
TABLE 数据类型用于存储对表或视图处理后的结果集。这一新类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便快、捷其、使用请参见第13章“游标、视图和自定义函数”。
1.SQL SERVER的数据类型
|
引用内容
- 正在验证 (错误)
消息
错误 0xc0202049: 数据流任务: 无法在只读列“sysid”中插入数据。
(SQL Server 导入和导出向导)
错误 0xc0202045: 数据流任务: 验证列元数据失败。
(SQL Server 导入和导出向导)
错误 0xc004706b: 数据流任务: “组件“目标 - FS_AP_SysPara”(25)”验证失败,返回的验证状态为“VS_ISBROKEN”。
(SQL Server 导入和导出向导)
错误 0xc004700c: 数据流任务: 一个或多个组件未能通过验证。
(SQL Server 导入和导出向导)
错误 0xc0024107: 数据流任务: 任务验证期间出错。
(SQL Server 导入和导出向导)
1.到"选择源表和源视图(选择一个或多个要复制的表和视图)"这一步时.不要急着点"下一步或完成".
2.先点一下"编辑映射"或者双击目标下面的图标
3.弹出"列映射"对话框.然后勾选"启用标识插入"的复选框.
或者将只读列改为"忽略"
4.重复"第3步"为目标下面的每一个表都"启用标识插入"
5.完成.不知道上面的有没有说清楚.
总结在重复那几步时.每一个表都要设置.比较烦.特别是表多的话.那做起来就列麻烦了.
我刚接触2005.不知道能不能一次搞定.或者通过命令把那个"启用标识**"设为默认选中.
这里感谢我林主管的提示
我是用的sqlserver,具体的实现是把一个excel表里的数据(有重复)导入sqlserver数据库里,我的做法是:
先把excel每张表的里数据分别导成数据库里的表(没有约束),然后我再建立与各个表有对应的字段的表(这是我要用的,里面有主键约束),现在我要把没有约束的表导入有约束的表里,总是导不进去.
给个能导入的办法和sql
禁用約束
alter table tablename nocheck constraint all
開啟約束
alter table tablname check constraint all
1. 新建数据库;
2. 生成数据库结构代码;
3. 运行数据库结构代码;
4. 去除数据库所有CHECK;
5. 导入数据,启用标示导入,不优化操作;
6. 加上所有CHECK;
1、关键字 ESCAPE允许在字符串中搜索通配符而不是将其作为通配符使用
语法:ESCAPE'放在通配符前表示此特殊用途的字符'
例:select * from table1 where name like'%/%cs' escape'/'
该例查询姓名中所有以 %cs作为结尾的
例:select * fromtable1 where name like '%/_cs' escape'/'
该例查询姓名中所有以_cs结尾的
2、单引号:SQL中以两个单引号来转义为一h个单引号
如:alter table table1
ADD CONSTRAINT [CK_table1] CHECK (not([pwd] like '%''%'))
Published
by
叶秋on 2007-12-10
in 软件相关
. Tags: SQL Server,Vista,xileju.biz.
近日由于无法抗拒Vista的视觉外观,想把我的开发平台从XP下搬到Vista。上网一看,基本用到的都可以在Vista下跑,大喜。于是首要安装的就是SQL Server2005。可我的Vista遇到我的SQL2005却没有微软官方站点说的那么容易,只要打了SP2补丁就可以。
安装程序检查完系统,两警告,IIS和COM+。在XP下也是这样,可只要安装了Internet信息服务和打开Distributed TransactionCoordinator服务就能搞定。但是我今天就算把Internet信息服务全装了又打开DTC服务,这两个警告仍然还在。无奈!好,先装,安装失败再说。一路有警告当然是在意料中,只要不安装失败就行。20分钟后,安装成功,再次大喜。二话不说马上打SP2,检查说某某服务正在运行,如果要想安装完成后不重新启动系统,请先把服务停了(大意是这样)。当然可以不重启是再好不过的了。于是停了所有列出来的服务。点下一步,又是几十分钟后,安装成功完成。这时系统叫我配置Vista下SQL2005的用户,这下好了,怎么也无法启动用户!好,先不管,看看能不能用,能用也就不管了。这下发现最基本的SQL Server(MSSQLSERVER)服务都不能启动,也就是说明我数据库都连不上,还何谈能用不能用。上网Google一下,有人教说把SQL2005卸了重装一遍再打SP2就搞定,也有人说不用卸,直接覆盖也行。当然不用卸的那自然最好(真不明白为何要这样做)。于是再次安装,那两警告还在,当然视而不见。一分钟后弹出这样一个警告框,大意是:你选择安装的文件和原文件一样,安装将不对原文件做任何改变,安装终止。这时才发现上当了,还是得卸了再装。于是卸载、安装、打补丁,又到那个问我关不关服务的地方,还是懒重启,所以关服务。完成,一试连上,一切正常,狂喜中……把所有SQL的服务改为手动启动,毕竟平时用不到的时候想不出来为何要开它。由于之前有过服务不能开的经历,所以改为手动后试试能不能打开。汗,又打不开,刚还不是还能用的吗?!郁闷,重启电脑看看,还是不能。于是再次改为自动启动,重启电脑,服务它又是开着的了,一试一切正常。汗,难不成非得开成自动?!改为手动它又不能启动。再次Google,却没发现有人碰到我这样的问题。静思,是不是之前打补丁时我把服务关了造成的?!事已至此,再打补丁,到那个问我关不关服务的地方,这次不理,直接下一步。安装完成后,重启电脑。服务是开着,马上改为手动,再次重启服务,哈哈,能打开了。搞定,一切正常。前后花了整整一个晚上。
在日后的使用中发现这样一个问题。我建一用户,这用户只能对一张表有查看的权限。然后开发程序中一直报SQLException某某字段无效,用此用户登陆数据库一看,我的天,这用户竟然每个数据库都能访问!还能删别个库中的表!实在是太不明白!!!
SQL Server 2005 Express附加数据库为“只读”的解决方法
SQL Server 2005 Express附加数 ...
在SQL Server 2005 Express 上附加从另外一台电脑Copy过来的数据库后,数据库为“只读”。 解决办法:打开 SQL Server ConfigurationManager, 打开SQL Server SQLEXPRESS 的属性 在内置帐号处,把“网络服务”改成“本地系统”,重新启动SQL Server 2005 Express 后,再附加数据库一切正常。总结:之所以附加上的数据库为“只读”,是因为启动SQL Server的默认的启动帐号“网络服务”对所附加(Attach)的数据库文件的权限不够造成的。 此文章从网络转载。
=====================================================================
最近2010-3-10
自动关机
shutdown -s -t (时间)
shutdown –a解除自动关机
control 控制面板快捷键
TIMPlatform.exe进程 可以挂两个QQ TXPlatform.exe
《设计模式》
数据库服务错误:
无法连接到WMI 提供程序请注意,你只能使用SQL Server 配置管理器来管理SQL Server2005服务器。找不到指定的模块。[0x8007007e]
解决方法:
这主要是通过Java 或者vc连接数据库遇到的问题
解决问题的方法:检查一下 windows下的system32 中是否有framedyn.dll这个系统文件,如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下
问题一:ApplicationSystem Error (拒绝访问 Unable to open the service'Tomcat X')
网上也有很多网友说有这个问题,除了第一次安装好时运行成功外,第二次就无法打开服务器。
解决: tomcat有windows安装包和zip包两种下载,两者没有差异,效果是一样的,前者比较方便,因为在安装的同时可以把端口号直接改成18080
找到Monitor Tomcat这个文件,单击鼠标右键---属性---兼容性---用兼容模式运行这个程序,改好之后确定保存。然后再对它单击右键---以管理员身份运行。问题就解决了。
问题二:运行Tomcat服务时现严重错误
问题原因:Tomact的端口号8080已经被占用了。
方法一:将你的MyEcplises关闭。打开任务管理器。将所有进程为javaw.exe的全部结束。然后再启动你的MyEcplise。启动你的Tomact6.x的试看看。能不能成功运行。如果还是不行。就采用第二种方法。一定可以的。
方法二:在你的Tomact6.0的安装目录conf文件夹下找到server文件、打开。将里面的
connectionTimeout="20000"
redirectPort="8443"/>
port="8080"中的8080改成没有使用过的端口号。比如:8888.
这样你重新启动一下Tomact服务器。那么你设置端口号就是Tomact的端口号了。
系统常常会自动弹出“xx内存不能为read或written”的错误提示?
解决方法:开始 ——运行—— 输入:cmd 确定——
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s%1 ,直接copy,直到屏幕流动停止,ok
安装SQL2005开发版提示“SQL SERVER安装程序无法获取ASPNET帐户的系统帐户信息……”
解决方法:下载用aspnet_regiis实用工具卸载和重新安装;
具体的操作如下:
进入CMD:
c:\windows\microsoft.net\framework\v2.0.50727文件夹下,运行aspnet_regiis -u卸载
然后运行aspnet_regiis -i 重新安装,上述问题即可解决
sql server 2005 安装完找不到启动图标,只有一个配置工具
解决方法:此时软件未安装完,86文件夹里还有名为TOOls文件夹,打开安装即可。
SQL Server 2005 中为安装程序增加计数器注册表项值,不能安装?
解决方法:
1、单击“开始”、“运行”,然后在“打开”中键入 regedit.exe,再单击“确定”。使用 regedt32.exe 启动注册表编辑器。
2、定位到以下注册表项
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib]
找到里面的Last Counter和LastHelp,注意Last Counter和Last Help值是由 Windows 动态分配的;这两个值会因计算机的不同而不同。我的分别是6760和6761。
3、上一步的“Last Counter”值 (6760) 必须与以下注册表项中“Perflib\004”的“Counter”项的最大值匹配,并且上一步的“Last Help”值 (6761) 必须与以下注册表项中“Perflib\004”的“Help”项的最大值匹配。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\004]
注意 :004 是简体中文中的一个示例 009是英语彼示例
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\009]
比如说:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib\004中的Help,双击后打开编辑框,里面是:
3
System performance object 包含应用于计算机上不止一个组件处理器范例的计数器。
5
Memory performance object
...
中间的都省略掉了
...
6785
写入所有数据源中的BLOB 字节总数。
6787
在整个管道中使用的BLOB 假脱机文件数。
这个最后一个数值6787就应该对应Perflib中Last Help的十进制数值。当然修改的时候别忘了选择十进制。
6、关闭注册表编辑器
7、再次运行 SQL Server 安装程序就应该没问题了。
sql server 2005安装过程中没有iis组件和com+出现错误解决方法
解决方法:1、控制面板里没有“->添加/删除Windows组件->Internet信息服务(IIS)”组件的添加方法。
(某些GHOST系统精简后没有此项)
把IIS列进系统组件并安装。先到网上下载iis5.安装包,解压到D盘的根目录下(最好是根目录,便于后面打命令)把目录名该为iis51
首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,在sysoc.inf中找到“[Components]”这一段,在里面加上这段:“iis=iis2.dll,OcEntry,iis2.inf,,7”,之后保存并关闭。
接下来,在运行中输入“CMD”然后回车,打开命令行模式,在命令行下输入下列的两条命令,在每一行命令结束后回车:
expand d:\iis51\iis.dl_c:\Windows\system32\setup\iis2.dll
expand d:\iis51\iis.in_c:\Windows\inf\iis2.inf
2、COM+组件解决方法。
在CMD下执行以下命令:
msdtc -resetlog
cd %windir%\system32\inetsrv
rundll32 wamreg.dll,CreateIISPackage
regsvr32 asptxn.dll
SQL Server 服务管理器中无法启动SQL,提示“系统找不到指定的文件”。
在SQL的安装目录(X:\X..X\MicrosoftSQL Server\MSSQL\Binn)下的文件sqlservr.exe文件丢失
解决办法:
1.从网上下载一个,但这个方法不好,网上内嵌木马的EXE文件多;
2.从另一个机子上直接拷过来,文件大小为8.72M;
Sql2005卸载后 重新安装安装 存在同名实例
引用:
SQL server Database services 安装失败
Analysis services 安装失败
Reporting services 安装失败
工作站组件 联机丛书和开发工具 安装失败
不想重装系统
1.Stop 所有服务
2.用 Windows InstallClean Up 工具卸载SQL 2005组件
3.用SrvInstw.exe删除所有SQL服务
4.清除注册表
a. 将HKEY_CURRENT_USER---Software----Microsoft下的MicrosoftSQL Server文件夹全部删除
b. 将HKEY_LOCAL_mACHINE---SOFTWARE---Microsoft下的MicrosoftSQL Native Client ,Microsoft SQL Server, Microsoft SQL Server 2005 Redist全部删除。
5.删除残留文件
将C盘——Program File下的MicrosoftSQL Server 文件夹删除。
6.重启电脑,重新安装。
SQL Server 2005安装过程中的 COM+ 检查失败的解决办法
MSDTC服务就是DistributedTransaction Coordinator,主要是协调跨多个数据库、消息队列、文件系统等资源管理器的事务。在开始菜单中输入services.msc后找到Distributed TransactionCoordinator后启动该服务,不料却弹出"windows 不能在 本地计算机启动 Distributed Transaction Coordinator .有关更多信息,查阅系统事件日志。如果这是非 Microsoft 服务,请与厂商联系,并参考特定服务错误代码 -1073737712"。又网上搜索一番,发现要重置下日志,在命令行输入msdtc-resetlog后果然服务成功启动,再安装SQL Server 2005后再没有提示COM+检查失败。
如果启动DistributedTransaction Coordinator失败,弹出“错误1068:依存服务或组无法启动”,可右击Distributed TransactionCoordinator,选择“属性”→“依存关系”,会看到两个依存的系统组建,然后启动这两个服务即可。