版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、IT笔试题全集_数据库SQL Server篇_追雨制作_2011版SQL Server面试题 面试要点 1.1000人左右的企业SQL Server 2000标准版,5000人左右的企业SQL Server 2000企业版。2.SQL Server 2000有几种安装方式?1)本地全新安装:家里装的一般就是这种,默认为系统用户,域用户也可以,但密码修改后会出问题,所以启动服务帐户的密码在安全性里改;2)本地升级安装;3)远程安装;4)无人值守安装。3.本地全新安装中身份验证模式分为:1)Windows身份验证模式;2)混合模式(Windows 身份验证和 SQL Server 身份验证)。4.
2、安装后生成的组件有哪些?1)企业管理器2)事件探查器(跟踪)3)查询分析器(执行T-SQL语句)4)客户端网络实用工具5)联机丛书(帮助)。1.SQL Server服务有哪几种?1)SQL Server服务(主服务);2)SQL Server Agent服务;3)Microsoft Search(全文本检索引擎服务);4)Disibuted Transaction Coordinator(管理分布式事务服务);5)MSSQL ServerADHelper服务(发布到活动目录)。1)和2)的每一个实例都要一一对应。2.如何管理服务?1)通过Windows 2000服务管理器管理;2)win200
3、3管理工具服务(自带)。另外,对服务可以进行启动、暂停、停止。暂停的作用是:已连接到服务器的用户可完成任务,但不允许有新的连接。3.对SQL Server服务进行管理的是企业管理器,管理时要注册;把企业管理器和服务器进行连接;也可以注册远程服务器。4.对SQL Server属性配置:1)常规2)内存3)处理器4)安全性5)还原6)服务器设置7)数据库设置8)复制9)Active Directory。(修改完后要重启。)5.客户机如何连接服务器?在客户机上安装仅客户端工具,再通过企业管理器去连接。6.客户机与服务器连接两种协议:TCP/IP协议和命名管道协议。7.如何提高访问服务器的安全性?1)
4、修改端口(默认为1433);2)删除命名管道。1.常见的数据库对象有哪些:表、索引、视图、存储过程、触发器、用户定义函数、数据库关系图、全文索引。2.数据库分类:系统数据库和用户数据库;数据库管理:创建、修改和查看。3.默认的系统数据库有哪些?1)master数据库(主);2)tempdb数据库(临时);3)model 数据库(模板);4)msdb数据库(计划任务);5)disibution数据库(发布)。4.pubs和Northwind都是用户数据库。5.默认创建一个数据库,会生成哪些文件?1)主文件(.mdf),2)日志文件(.ldf),无次要文件(.ndf)。6.创建数据库时,能不能把数
5、据文件和日志文件分开?可以分开,起到优化作用。把数据文件放到高速读写区,把日志文件放到低速读写区。7.文件组的作用:提高读写的效率。8.为什么要做数据库的收缩,有何作用:释放磁盘空间。为什么要移动数据库:为了数据库的升级。9.如何实现数据库的移动?1)分离数据库;2)把数据文件、日志文件移动到其他路径上去;3)在另一台计算机上进行附加。 SQL SERVER面试资料 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么?答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的
6、完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。什么是事务?什么是锁?答:事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。锁是在多用户环境中对数据的访问的限制。SqlServer自动锁定特定记录、字段或文件,防止用户访问,以维护数据安全或防止并发数据操作问题,锁可以保证事务的完整性和并发性。什么是索引,有什么优点?答:索引象书的目录类似,索引使数据库程序无需扫描整个表,就可以在其中找到所需要的数据,索引包含了一个表中包含值的列表,其中包含了各个值的行所存储的位
7、置,索引可以是单个或一组列,索引提供的表中数据的逻辑位置,合理划分索引能够大大提高数据库性能。视图是什么?游标是什么?答:视图是一种虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增该查操作,视图通常是一个或多个表的行或列的子集,视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如需要隐藏某些行或列),维护更方便。游标对查询出来的结果集作为一个单元来有效的处理,游标可以定位在结果集的特定行、从结果集的当前位置检索一行或多行、可以对结果集中当前位置进行修改、什么是存储过程?有什么优点?答:存储过程是一组予编译的SQL语句,它的优点有1.允许
8、模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。什么是触发器?答:出发器是一种特殊类型的存储过程,出发器主要通过事件触发而被执行的,触发器的优点:1.强化约束,触发器能够提供比CHECK约束。2.跟踪变化,触发器可以跟踪数据库内的操作,从而不允许未经允许许可的更新和变化。3.联级运算,比如某个
9、表上的触发器中包含对另一个表的数据操作,而该操作又导致该表上的触发器被触发。 如何提高SQL Server的安全性? 1.安装最新的服务包为了提高服务器安全性,最有效的一个方法就是升级到 SQL Server 2000 Service Pack 3a (SP3a)。要下载 SP3a,请访问SQL Server 2000 SP3a 页面。另外,您还应该安装所有已发布的安全更新。要订阅新安全更新的通知,请访问产品安全通知页面。2.使用 Microsoft 基线安全性分析器(MBSA)来评估服务器的安全性MBSA 是一个扫描多种 Microsoft 产品的不安全配置的工具,包括 SQL Server
10、 和 Microsoft SQL Server 2000 Desktop Engine (MSDE 2000)。它可以在本地运行,也可以通过网络运行。该工具针对下面问题对 SQL Server 安装进行检测:过多的sysadmin固定服务器角色成员。授予sysadmin以外的其他角色创建 CmdExec 作业的权利。空的或简单的密码。脆弱的身份验证模式。授予管理员组过多的权利。SQL Server数据目录中不正确的访问控制表(ACL)。安装文件中使用纯文本的sa密码。授予guest帐户过多的权利。在同时是域控制器的系统中运行SQL Server。所有人(Everyone)组的不正确配置,提供对
11、特定注册表键的访问。SQL Server 服务帐户的不正确配置。没有安装必要的服务包和安全更新。网络安全论坛3.使用 Windows 身份验证模式在任何可能的时候,您都应该对指向 SQL Server 的连接要求 Windows 身份验证模式。它通过限制对Microsoft Windows?用户和域用户帐户的连接,保护 SQL Server 免受大部分 Internet 的工具的侵害,。而且,您的服务器也将从 Windows 安全增强机制中获益,例如更强的身份验证协议以及强制的密码复杂性和过期时间。另外,凭证委派(在多台服务器间桥接凭证的能力)也只能在 Windows 身份验证模式中使用。在客
12、户端,Windows 身份验证模式不再需要存储密码。存储密码是使用标准 SQL Server 登录的应用程序的主要漏洞之一。要在 SQL Server 的 Enterprise Manager 安装 Windows 身份验证模式,请按下列步骤操作:展开服务器组。右键点击服务器,然后点击属性。在安全性选项卡的身份验证中,点击仅限 Windows。4.隔离您的服务器,并定期备份物理和逻辑上的隔离组成 了SQL Server 安全性的基础。驻留数据库的机器应该处于一个从物理形式上受到保护的地方,最好是一个上锁的机房,配备有洪水检测以及火灾检测/消防系统。数据库应该安装在企业内部网的安全区域中,不要直
13、接连接到 Internet。定期备份所有数据,并将副本保存在安全的站点外地点。有关备份过程和其他操作性最佳实践的指南,请参阅SQL Server 2000操作指南。5.分配一个强健的sa密码sa帐户应该总拥有一个强健的密码,即使在配置为要求 Windows 身份验证的服务器上也该如此。这将保证在以后服务器被重新配置为混合模式身份验证时,不会出现空白或脆弱的sa。要分配sa密码,请按下列步骤操作:展开服务器组,然后展开服务器。展开安全性,然后点击登录。6.限制 SQL Server服务的权限SQL Server 2000 和 SQL Server Agent 是作为 Windows 服务运行的。
14、每个服务必须与一个 Windows 帐户相关联,并从这个帐户中衍生出安全性上下文。SQL Server允许sa 登录的用户(有时也包括其他用户)来访问操作系统特性。这些操作系统调用是由拥有服务器进程的帐户的安全性上下文来创建的。如果服务器被攻破了,那么这些操作系统调用可能被利用来向其他资源进行攻击,只要所拥有的过程(SQL Server服务帐户)可以对其进行访问。因此,为 SQL Server 服务仅授予必要的权限是十分重要的。我们推荐您采用下列设置:SQL Server Engine/MSSQLServer如果拥有指定实例,那么它们应该被命名为MSSQL$InstanceName。作为具有一
15、般用户权限的 Windows 域用户帐户运行。不要作为本地系统、本地管理员或域管理员帐户来运行。SQL Server Agent Service/SQLServerAgent如果您的环境中不需要,请禁用该服务;否则请作为具有一般用户权限的Windows域用户帐户运行。不要作为本地系统、本地管理员或域管理员帐户来运行。重点: 如果下列条件之一成立,那么 SQL Server Agent 将需要本地 Windows管理员权限:SQL Server Agent 使用标准的 SQL Server 身份验证连接到SQL Server(不推荐)。SQL Server Agent 使用多服务器管理主服务器(
16、MSX)帐户,而该帐户使用标准 SQL Server 身份验证进行连接。SQL Server Agent 运行非sysadmin固定服务器角色成员所拥有的 Microsoft ActiveX?脚本或 CmdExec 作业。如果您需要更改与 SQL Serve r服务相关联的帐户,请使用 SQL Server Enterprise Manager。Enterprise Manager 将为 SQL Server 所使用的文件和注册表键设置合适的权限。不要使用 Microsoft 管理控制台的服务(在控制面板中)来更改这些帐户,因为这样需要手动地调制大量的注册表键和NTFS文件系统权限以及Mico
17、rsoft Windows用户权限。帐户信息的更改将在下一次服务启动时生效。如果您需要更改与 SQL Server 以及 SQL Server Agent 相关联的帐户,那么您必须使用 Enterprise Manager 分别对两个服务进行更改。7.在防火墙上禁用 SQL Server 端口SQL Server 的默认安装将监视 TCP 端口 1433 以及UDP端口 1434。配置您的防火墙来过滤掉到达这些端口的数据包。而且,还应该在防火墙上阻止与指定实例相关联的其他端口。8.使用最安全的文件系统NTFS 是最适合安装 SQL Server 的文件系统。它比 FAT 文件系统更稳定且更容易
18、恢复。而且它还包括一些安全选项,例如文件和目录 ACL 以及文件加密(EFS)。在安装过程中,如果侦测到 NTFS,SQL Server 将在注册表键和文件上设置合适的 ACL。不应该去更改这些权限。通过 EFS,数据库文件将在运行 SQL Server 的帐户身份下进行加密。只有这个帐户才能解密这些文件。如果您需要更改运行 SQL Server 的帐户,那么您必须首先在旧帐户下解密这些文件,然后在新帐户下重新进行加密。9.删除或保护旧的安装文件SQL Server 安装文件可能包含由纯文本或简单加密的凭证和其他在安装过程中记录的敏感配置信息。这些日志文件的保存位置取决于所安装的SQL Ser
19、ver版本。在 SQL Server 2000 中,下列文件可能受到影响:默认安装时:Program FilesMicrosoft SQL ServerMSSQLInstall文件夹中,以及指定实例的:Program FilesMicrosoft SQL Server MSSQL$Install文件夹中的sqlstp.log, sqlsp.log和setup.iss如果当前的系统是从 SQL Server 7.0 安装升级而来的,那么还应该检查下列文件:%Windir% 文件夹中的setup.iss以及Windows Temp文件夹中的sqlsp.log。Microsoft发布了一个免费的实用
20、工具 Killpwd,它将从您的系统中找到并删除这些密码。10.审核指向 SQL Server 的连接SQL Server 可以记录事件信息,用于系统管理员的审查。至少您应该记录失败的 SQL Server 连接尝试,并定期地查看这个日志。在可能的情况下,不要将这些日志和数据文件保存在同一个硬盘上。要在 SQL Server 的 Enterprise Manager 中审核失败连接,请按下列步骤操作:展开服务器组。右键点击服务器,然后点击属性。在安全性选项卡的审核等级中,点击失败。要使这个设置生效,您必须停止并重新启动服务器。在细节窗格中,右键点击SA,然后点击属性。在密码方框中,输入新的密码
21、。 如何在 SQL Server 2005 实例之间传输登录和密码 服务器 A 和服务器 B 是不同的服务器。 此外, 服务器 A 和 B 服务器都运行 SQL Server 2005。将数据库从服务器 A 上的 SQLServer 实例移到 B, 服务器上的 SQLServer 实例后用户可能不能够登录到数据库 B 另外服务器上, 用户可能收到以下错误信息:对于用户 MyUser #8216; #8216; 登录失败。 (MicrosoftSQLServer、 错误 18456:)发生此问题是因为没有您做从服务器 A 上的 SQLServer 实例传输和密码登录到服务器 B 上的 SQLSe
22、rver 实例要从服务器 A 上的 SQLServer 实例传输到服务器 B, 上的 SQLServer 实例登录和密码请按照下列步骤操作:1. 在服务器 A, 启动 SQLServerManagementStudio, 并然后连接到 SQLServer 从中移动数据库的实例。2. 打开新查询编辑器窗口, 然后运行以下脚本。USE masterGOIF OBJECT_ID (#8216;sp_hexadecimal#8217;) IS NOT NULL Drop PROCEDURE sp_hexadecimalGOCreate PROCEDURE sp_hexadecimal
23、60; binvalue varbinary(256), hexvalue varchar (514) OUTPUTASDECLARE charvalue varchar (514)DECLARE i intDECLARE length intDECLARE hexsing char(16)Select charvalue = #8217;0x#8217;Select i = 1Select length = DATALENGTH (binvalue)Select hexsing = #8217;0123456789ABCDEF#82
24、17;WHILE (i <= length)BEGIN DECLARE tempint int DECLARE firstint int DECLARE secondint int Select tempint = CONVERT(int, SUBSTRING(binvalue,i,1) Select firstint = FLOOR(tempint/16) Select secondint = tempint (firstint*16) Select charvalue = charvalue +
25、60; SUBSTRING(hexsing, firstint+1, 1) + SUBSTRING(hexsing, secondint+1, 1) Select i = i + 1ENDSelect hexvalue = charvalueGOIF OBJECT_ID (#8216;sp_help_revlogin#8217;) IS NOT NULL Drop PROCEDURE sp_help_revloginGOCreate PROCEDURE sp_help_revlogin login_name s
26、ysname = NULL ASDECLARE name sysnameDECLARE type varchar (1)DECLARE hasaccess intDECLARE denylogin intDECLARE is_disabled intDECLARE PWD_varbinary varbinary (256)DECLARE PWD_sing varchar (514)DECLARE SID_varbinary varbinary (85)DECLARE SID_sing varchar (514)DECLARE tmps varchar (10
27、24)DECLARE is_policy_checked varchar (3)DECLARE is_expiration_checked varchar (3)DECLARE defaulb sysnameIF (login_name IS NULL) DECLARE login_curs CURSOR FOR Select p.sid, , p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROMsys.ser
28、ver_principals p LEFT JOIN sys.syslogins l ON ( = ) Where p.type IN ( #8216;S#8217;, #8216;G#8217;, #8216;U#8217; ) AND <> #8216;sa#8217;ELSE DECLARE login_curs CURSOR FOR Select p.sid, , p.type, p.is_
29、disabled, p.default_database_name, l.hasaccess, l.denylogin FROMsys.server_principals p LEFT JOIN sys.syslogins l ON ( = ) Where p.type IN ( #8216;S#8217;, #8216;G#8217;, #8216;U#8217; ) AND = login_nameOPEN login_cursFETCH NEXT FROM login_curs INTO
30、 SID_varbinary, name, type, is_disabled, defaulb, hasaccess, denyloginIF (fetch_status = -1)BEGIN PRINT #8216;No login(s) found.#8217; CLOSE login_curs DEALLOCATE login_curs RETURN -1ENDSET tmps = #8216; sp_help_revlogin script #8216;PRINT tmpsSET tmps = #8216;* Generated #82
31、16; + CONVERT (varchar, GETDATE() + #8216; on #8216; + SERVERNAME + #8216; #8217;PRINT tmpsPRINT WHILE (fetch_status <> -1)BEGIN IF (fetch_status <> -2) BEGIN PRINT SET tmps = #8216; Login: #8216; + name PRINT tmps &
32、#160; IF (type IN ( #8216;G#8217;, #8216;U#8217;) BEGIN NT authenticated account/group SET tmps = #8216;Create LOGIN #8216; + QUOTENAME( name ) + #8216; FROM WINDOWS WITH DEFAULT_DATABASE = ' + defaulb + '#8216; END
33、; ELSE BEGIN SQL Server authentication obtain password and sid SET PWD_varbinary = CAST( LOGINPROPERTY( name, #8216;PasswordHash#8217; ) AS varbinary (256) )
34、; EXEC sp_hexadecimal PWD_varbinary, PWD_sing OUT EXEC sp_hexadecimal SID_varbinary,SID_sing OUT obtain password policy state Select is_policy_checked = CAS
35、E is_policy_checked WHEN 1 THEN #8216;ON#8217; WHEN 0 THEN #8216;OFF#8217; ELSE NULL END FROM sys.sql_logins Where name = name Select is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN #8216;ON#8217; WHEN 0 THEN #8216;OFF#8217; ELSE NULL END FROM
36、 sys.sql_logins Where name = name SET tmps = #8216;Create LOGIN #8216; + QUOTENAME( name ) + #8216; WITH PASSWORD = #8216; + PWD_sing + #8216; HASHED, SID = #8216; + SID_sing + #8216;, DEFAULT_DATABASE = ' + defaulb + '#8216;&
37、#160; IF ( is_policy_checked IS NOT NULL ) BEGIN SET tmps = tmps + #8216;, CHECK_POLICY = #8216; + is_policy_checked END
38、 IF ( is_expiration_checked IS NOT NULL ) BEGIN SET tmps = tmps + #8216;, CHECK_EXPIRATION = #8216; + is_expiration_checked EN
39、D END IF (denylogin = 1) BEGIN login is denied access SET tmps = tmps + #8216; DENY CONNECT SQL TO #8216; + QUOTENAME( name ) END ELSE IF (hasaccess = 0) BEGIN lo
40、gin exists but does not have access SET tmps = tmps + #8216; REVOKE CONNECT SQL TO #8216; + QUOTENAME( name ) END IF (is_disabled = 1) BEGIN login is disabled SET tmps = tmps + #8216; Al
41、ter LOGIN #8216; + QUOTENAME( name ) + #8216; DISABLE#8217; END PRINT tmps END FETCH NEXT FROM login_curs INTO SID_varbinary, name, type, is_disabled, defaulb, hasaccess, denylogin ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO此脚本 注意 在
42、master 数据库中创建两个存储过程。 两个存储过程命名为 sp_hexadecimal 存储过程和 sp _ help _ revlogin < 存储过程。3.运行下列语句。EXEC sp_help_revlogin由 sp _ help _ revlogin < 存储过程生成输出脚本是登录脚本。 此登录脚本创建具有原始安全标识符 (SID) 和原始密码登录。4. 在服务器 B, 启动 SQLServerManagementStudio, 并再连接到的数据库移动到 SQLServer 实例。要点 之前请您转到步骤 5, 查阅 备注 部分中信息。5. 打开新查询编辑器窗口, 并运
43、行步骤 3 中生成输出脚本。在 SQL Server 2005, 用于登录 SID 用于作为基础实现数据库级访问。 登录服务器上两个不同数据库中可能有两个不同的 SID。此例, 登录只能访问数据库具有 SID 匹配 SID sys.server_principals 视图中。如果是从两个不同服务器合并两个数据库可能会发生此问题。 要解决此问题, 通过 DropUSER 语句具有 SID 匹配数据库中手动删除登录。再次通过 Create USER 语句然后, 添加登录。 介绍一下sql server的安全性 1、两种登陆方式:标准登陆方式(sqlserver和windows),采用sqlserv
44、er提供的用户名和密码登陆连接,可用 sp_denylogin #8216;builtinadminisators#8217;拒绝操作系统管理员登陆连接(sp_grantlogin #8216;builtinadminisators#8217;反转),也称非信任登陆机制;这种认证方式是两种方式中最安全的。集成登陆方式(仅windows),将windows的用户和工作组映射为sqlserver的登陆方式,也称信任机制。2、一个特殊帐户:sa,为系统默认帐户,不能删除,拥有最高的管理权限,可以执行sqlserver服务器范围内的所有操作,所以一定要给sa加上密码,密码推荐不少于6位,最后是字母、数
45、字和特殊符号的组合。3、两个特殊数据库用户:dbo,数据库的拥有者,在安装sqlserver时,被设置到model数据库中,不能被删除,所以dbo在每个数据库中都存在。dbo是数据库的最高权力者,对应于创建该数据库的登陆用户,即所有的数据库的dbo都对应于sa帐户;guest,这个用户可以使任何已经登陆到sqlserver服务器的用户都可以访问数据库,即使它还没有成为本数据库的用户。所有的系统数据库除model以外都有 guest用户。所有新建的数据库都没有这个用户,如果油必要添加guest用户,请用sp_granbaccess来明确建立这个用户。4、还原数据库的时候之所以要删除本数据库的用户
46、如user,然后在安全性登陆里重新建这个用户和指定相应的访问权限,是因为这个用户在master里不存在。当然你也可以用sp_addlogin #8216;user#8217;,'resu#8217;来新建user用户,sp_change_users_login #8216;update_one#8217;,'user#8217;,'user#8217;来指定在master中的对应。5、具有system adminisators服务器角色的成员拥有与sa一样的权限,具有db_owner数据库角色的用户具有对本数据库的完全操作权限。如果在创建 login的时候,选择了sys
47、tem adminisators角色,那么该用户创建的对象都属于dbo用户。 介绍一下SQL Server的全文索引? 全文索引可以对存储在SQL Server数据库中的文本数据执行快速检索功能。同LIKE谓词不同,全文索引只对字符模式进行操作,对字和语句执行搜索功能。全文索引对于查询非结构化数据非常有效。一般情况下,可以对char、varchar和nvarchar数据类型的列创建全文索引,同时,还可以对二进制格式的列创建索引,如image和varbinary数据类型列。对于这些二进制数据,无法使用LIKE谓词。为了对表创建全文索引,表必须包含单个、唯一、非空列。当执行全文检索的时候,SQL
48、Server搜索引擎返回匹配搜索条件的行的键值。一般情况,使用sql server中的全文索引,经过大体4个步骤:l 安装全文索引服务;l 为数据表建立全文索引目录;l 使全文索引与数据表内容同步;l 使用全文索引进
49、行查询。 SQL Server里面什么样的视图才能创建索引? 在为视图创建索引前,视图本身必须满足以下条件:l 视图以及视图中引用的所有表都必须在同一数据库中,并具有同一个所有者。l 索引视图无需包含要供优化器使用的查询中引用的所有表。l 必须先为视图创建唯一群集索引,然后才可以创建其它索引。l
50、160; 创建基表、视图和索引以及修改基表和视图中的数据时,必须正确设置某些 SET 选项(在本文档的后文中讨论)。另外,如果这些 SET 选项正确,查询优化器将不考虑索引视图。l 视图必须使用架构绑定创建,视图中引用的任何用户定义的函数必须使用 SCHEMABINDING 选项创建。l 另外,还要求有一定的磁盘空间来存放由索引视图定
51、义的数据。 介绍一下SQL Server里面的索引视图? 复杂报表的场景经常会在数据仓储应用程序中遇到,它在查询过程中会对数据库服务器产生大量请求。当这些查询访问视图时,因为数据库将建立视图结果集所需的逻辑合并到从基本表数据建立完整查询结果集所需的逻辑中,所以性能将会下降。这一操作的开销可能会比较大,尤其当视图涉及到复杂的大量行处理如大量数据聚合或多表联结时。因为结果集并不永久存放在数据库(标准视图)中,以后对该视图的访问可能导致在每次执行查询时建立结果集的代价。SQL Server允许为视图创建独特的聚集索引,从而让访问此类视图的查询的性能得到极大地改善。在创建了这样一个索引后,视图将被执行
52、,结果集将被存放在数据库中,存放的方式与带有聚集索引的表的存放方式相同。这就在数据库中有效地实现了查询结果。对于那些在FROM子句中不直接指定视图名的查询,SQL Server查询优化器将使用视图索引。现有查询将受益于从索引视图检索数据而无需重新编写程序原码的高效率。对于某些特定类型的视图,甚至可以获得指数级的性能改善。如果在视图上创建索引,那么视图中的数据会被立即存储在数据库中,对索引视图进行修改,那么这些修改会立即反映到基础表中。同理,对基础表所进行的数据修改也会反映到索引视图那里。索引的惟一性大大提高了SQL Server 查找那些被修改的数据行。维护索引视图比维护基础表的索引更为复杂。
53、所以,如果认为值得以因数据修改而增加系统负担为代价来提高数据检索的速度,那么应该在视图上创建索引。 什么是唯一索引? 唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。例如,如果在 last_name、first_name 和 middle_initial 列的组合上创建了唯一索引 full_name,则该表中任何两个人都不可以具有相同的全名。聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引。只有当唯一性是数据本身的特征时,指定唯一索引才有意义。如果必须实施唯
54、一性以确保数据的完整性,则应在列上创建 UNIQUE 或 PRIMARY KEY 约束,而不要创建唯一索引。例如,如果打算经常查询雇员表(主键为 emp_id)中的社会安全号码 (ssn) 列,并希望确保社会安全号码的唯一性,则在 ssn 列上创建 UNIQUE 约束。如果用户为一个以上的雇员输入了同一个社会安全号码,则会显示错误。 什么是聚集索引和非聚集索引? 分布介绍一下 (1)非聚集索引非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未
55、创建聚集索引,则无法保证这些行具有任何特定的顺序。典型的桌面数据库使用的是非聚集索引。在这类索引中,索引键值是有序的,而每个索引节点所指向的数据行是无序的。一个SQL Server表最多可以拥有255个非聚集索引。非聚集索引与聚集索引一样有 B-树结构,但是有两个重大差别:l 数据行不按非聚集索引键的顺序排序和存储。l 非聚集索引的叶层不包含数据页。相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个
56、或多个行定位器,这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在 SQL Server中,非聚集索引中的行定位器有两种形式:l 如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。l 如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识
57、符 (ID)、页码和页上的行数生成。整个指针称为行 ID。由于非聚集索引将聚集索引键作为其行指针存储,因此使聚集索引键尽可能小很重要。如果表还有非聚集索引,请不要选择大的列作为聚集索引的键。在创建非聚集索引之前,应先了解您的数据是如何被访问的。可考虑将非聚集索引用于:l 包含大量非重复值的列,如姓氏和名字的组合(如果聚集索引用于其它列)。如果只有很少的非重复值,如只有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。l
58、60; 不返回大型结果集的查询。l 返回精确匹配的查询的搜索条件(WHERE 子句)中经常使用的列。l 经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引。l 在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚
59、集索引的访问。(2)聚集索引聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。聚集索引在系统数据库表sysindexes 内有一行,其 indid = 1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。SQL Server将索引组织为B-树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B-树
60、的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。对于聚集索引,sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。为找到键的范围,SQL Server 浏览索引以找到这个范围的起始键值,然后用向前或向后指针扫描数据页。为找到数据页链的首页,SQL Server 从索引的根节点开始沿最左边的指针进行扫描.聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用
61、程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。对于聚集索引,人们往往有一些错误的认识。其中,最常见的错误有:l 聚集索引会降低insert操作的速度,因为必须要向后移动一半的数据来为新插入的行腾出空间。这种认识是错误的,因为可以利用填充因子控制填
62、充的百分比,从而在索引页上为新插入的数据保留空间。如果索引页填满了,SQL Server将会进行页拆分,在这种情况下只有第一个页才会受到影响。l 在使用标识列的主键上创建聚集索引是一种好的设计方法,它可以使对表的操作达到最快速度。这种认识是错误的,它浪费了创建其它更有效的聚集索引的机会。并且,使用这种方法会把每个新插入的记录行都存储到表尾部的同一个的数据页中,这将导致数据库的热点和锁争用。笔者曾经见过采用这种方法设计的数据库,对于每一个新订单,客户服务人员都不得不等待数分钟来加以确认。l
63、 聚集索引是具有魔力的。如果哪个查询的速度不够快,那么就在该列上创建聚集索引,对于表的操作速度一定会得到提高。这种认识也是错误的,聚集索引只是比非聚集索引稍稍快了那么一点点。因为在每个表上只能创建一个聚集索引,所以它也是一种宝贵的性能资源,只有在那些经常作为条件查询一组记录行的列上才应该建立聚集索引。在创建聚集索引之前,应先了解数据是如何被访问的。可考虑将聚集索引用于:l 包含大量非重复值的列。l
64、0; 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。l 被连续访问的列。l 返回大型结果集的查询。l 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对
65、ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。l OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。注意,聚集索引不适用于:l 频繁更改的列,这将导致整行移动(因为 SQL Server 必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026国内正规GEO优化公司排名:传声港领跑媒体资源型赛道
- 计算机中的人工智能
- 芳香油原料加工工安全意识竞赛考核试卷含答案
- 液压元件及液压系统制造工5S执行考核试卷含答案
- 盐酸生产工安全实践测试考核试卷含答案
- 电子设备波峰焊装接工安全文明能力考核试卷含答案
- 茶叶采摘机操作工安全宣贯能力考核试卷含答案
- 中药散剂(研配)工岗前基础能力考核试卷含答案
- 白酒原料粉碎工安全培训效果考核试卷含答案
- 电力电容器及其装置制造工岗中合规考核试卷含答案
- 2025福建福州港务集团有限公司春季校园招聘11人笔试历年参考题库附带答案详解
- 2026年福建省厦门市辅警招聘真题解析含答案
- 2026年吉林镇赉县社区就业服务专员招聘考试试卷(完整版含答案解析)
- 2026年全民健康生活方式宣传月专题讲座课件
- 企业声誉危机处理协议2026
- 山东省淄博市2025-2026学年高二下学期7月期末考试英语试卷
- 作业活动安全风险评估管理办法
- 应急预案培训计划
- 人教版七年级下册数学期末测试卷(含答案)
- 保安员考试题库500道(含答案)
- DL∕T 1315-2013 电力工程接地装置用放热焊剂技术条件
评论
0/150
提交评论