文秘114 发表于 2009-10-8 15:26:31

使用 SQL Server 时需要经常用到的几个设置选项

. set deadlock_priority<br/><br/>说明:控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。<br/><br/>语法:set deadlock_priority { low | normal | @deadlock_var }<br/><br/>参数:low&nbsp;&nbsp;指定当前会话为首选死锁牺牲品。microsoft? sql server? 自动回滚死锁牺牲品的事务,并给客户端应用程序返回 1205 号死锁错误信息。<br/>   normal&nbsp;&nbsp;指定会话返回到默认的死锁处理方法。<br/>   @deadlock_var&nbsp;是指定死锁处理方法的字符变量。如果指定 low,则 @deadlock_var 为 3;如果指定 normal,则 @deadlock_var 为 6。<br/><br/>注释:set deadlock_priority 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set deadlock_priority 权限默认授予所有用户。<br/><br/>&nbsp;<br/><br/>2. set lock_timeout<br/><br/>说明:指定语句等待锁释放的毫秒数。<br/><br/>语法:set lock_timeout timeout_period<br/><br/>参数:timeout_period&nbsp;是在 microsoft? sql server? 返回锁定错误前经过的毫秒数。值为 -1(默认值)时表示没有超时期限(即无限期等待)。<br/>   &nbsp;&nbsp;&nbsp;当锁等待超过超时值时,将返回错误。值为 0 时表示根本不等待,并且一遇到锁就返回信息。<br/><br/>注释:在连接开始时,该设置的值为 -1。设置更改后,新设置在其余的连接时间里一直有效。<br/>   set lock_timeout 的设置是在执行或运行时设置,而不是在分析时设置。<br/>   readpast 锁定提示为该 set 选项提供了另一种方式。<br/><br/>权限:set lock_timeout 权限默认授予所有用户。<br/><br/>示例:下例将锁超时期限设置为 1,800 毫秒。<br/><br/>   set lock_timeout 1800<br/>   go<br/><br/>&nbsp;<br/><br/>3. @@lock_timeout<br/><br/>说明:返回当前会话的当前锁超时设置,单位为毫秒。<br/><br/>语法:@@lock_timeout<br/><br/>返回类型:integer<br/><br/>注释:set lock_timeout 允许应用程序设置语句等待阻塞资源的最长时间。当一条语句已等待超过 lock_timeout 所设置的时间,则被锁住的语句将自动取消,并给应用程序返回一条错误信息。<br/>   在一个连接的开始,@@lock_timeout 返回一个 –1值。<br/><br/>示例:下面的示例显示当一个 lock_timeout 值未被设置时的结果集。<br/><br/>   select @@lock_timeout<br/>   下面是结果集:<br/>   ----------------<br/>   -1<br/><br/>   下面的示例设置 lock_timeout 为 1800 毫秒,然后调用 @@lock_timeout。<br/><br/>   set lock_timeout 1800<br/>   select @@lock_timeout<br/><br/>   下面是结果集:<br/>   ------------------------------<br/>   1800<br/><br/>&nbsp;<br/><br/>4. set identity_insert<br/><br/>说明:允许将显式值插入表的标识列中。<br/><br/>语法:set identity_insert [ database.[ owner.] ] { table } { on | off }<br/><br/>参数:database&nbsp;是指定的表所驻留的数据库名称。<br/>   owner&nbsp;是表所有者的名称。<br/>   table&nbsp;是含有标识列的表名。<br/><br/>注释:任何时候,会话中只有一个表的 identity_insert 属性可以设置为 on。如果某个表已将此属性设置为 on,并且为另一个表发出了 set identity_insert on 语句,则 microsoft? sql server? 返回一个错误信息,指出 set identity_insert 已设置为 on 并报告此属性已设置为 on 的表。<br/>   如果插入值大于表的当前标识值,则 sql server 自动将新插入值作为当前标识值使用。<br/>   set identity_insert 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:执行权限默认授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色以及对象所有者。<br/><br/>示例:下例创建一个含有标识列的表,并显示如何使用 set identity_insert 设置填充由 delete 语句导致的标识值中的空隙。<br/><br/>   -- create products table.<br/>   create table products (id int identity primary key, product varchar(40))<br/>   go<br/>   -- inserting values into products table.<br/>   insert into products (product) values (screwdriver)<br/>   insert into products (product) values (hammer)<br/>   insert into products (product) values (saw)<br/>   insert into products (product) values (shovel)<br/>   go<br/><br/>   -- create a gap in the identity values.<br/>   delete products <br/>   where product = saw<br/>   go<br/><br/>   select * <br/>   from products<br/>   go<br/><br/>   -- attempt to insert an explicit id value of 3;<br/>   -- should return a warning.<br/>   insert into products (id, product) values(3, garden shovel)<br/>   go<br/><br/>   -- set identity_insert to on.<br/>   set identity_insert products on<br/>   go<br/><br/>   -- attempt to insert an explicit id value of 3<br/>   insert into products (id, product) values(3, garden shovel)<br/>   go<br/><br/>   select * <br/>   from products<br/>   go<br/><br/>   -- drop products table.<br/>   drop table products<br/>   go<br/><br/>&nbsp;<br/><br/>5. set implicit_transactions<br/><br/>说明:为连接设置隐性事务模式。<br/><br/>语法:set implicit_transactions { on | off }<br/><br/>注释:当设置为 on 时,set implicit_transactions 将连接设置为隐性事务模式。当设置为 off 时,则使连接返回到自动提交事务模式。<br/>   当连接是隐性事务模式且当前不在事务中时,执行下列语句将启动事务:<br/><br/>   alter table fetch revoke <br/>   create&nbsp; grant select <br/>   delete insert truncate table <br/>   drop open update <br/><br/>   如果连接已经在打开的事务中,则上述语句不启动新事务。<br/>   对于因为该设置为 on 而自动打开的事务,用户必须在该事务结束时将其显式提交或回滚。否则当用户断开连接时,事务及其所包含的所有数据更改将回滚。在事务提交后,执行上述任一语句即可启动新事务。<br/>   隐性事务模式将保持有效,直到连接执行 set implicit_transactions off 语句使连接返回到自动提交模式。在自动提交模式下,如果各个语句成功完成则提交。<br/>   在进行连接时,sql server odbc 驱动程序和用于 sql server 的 microsoft ole db 提供程序自动将 implicit_transactions 设置为 off。对来自 db-library 应用程序的连接,set implicit_transactions 默认为 off。<br/>   当 set ansi_defaults 为 on 时,将启用 set implicit_transactions。<br/>   set implicit_transactions 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例演示在将 implicit_transactions 设置为 on 时显式或隐式启动事务。它使用 @@trancount 函数演示打开的事务和关闭的事务。<br/><br/>   use pubs<br/>   go<br/><br/>   create table t1 (a int)<br/>   go<br/>   insert into t1 values (1)<br/>   go<br/><br/>   print use explicit transaction<br/>   begin tran<br/>   insert into t1 values (2)<br/>   select tran count in transaction= @@trancount<br/>   commit tran<br/>   select tran count outside transaction= @@trancount<br/>   go<br/><br/>   print setting implicit_transactions on<br/>   go<br/>   set implicit_transactions on<br/>   go<br/><br/>   print use implicit transactions<br/>   go<br/>   -- no begin tran needed here.<br/>   insert into t1 values (4)<br/>   select tran count in transaction= @@trancount<br/>   commit tran<br/>   select tran count outside transaction= @@trancount<br/>   go<br/><br/>   print use explicit transactions with implicit_transactions on<br/>   go<br/>   begin tran<br/>   insert into t1 values (5)<br/>   select tran count in transaction= @@trancount<br/>   commit tran<br/>   select tran count outside transaction= @@trancount<br/>   go<br/><br/>   select * from t1<br/>   go<br/><br/>   -- need to commit this tran too!<br/>   drop table t1<br/>   commit tran<br/>   go<br/><br/>&nbsp;<br/><br/>6. set nocount<br/>说明:使返回的结果中不包含有关受 transact-sql 语句影响的行数的信息。<br/><br/>语法:set nocount { on | off } <br/><br/>注释:当 set nocount 为 on 时,不返回计数(表示受 transact-sql 语句影响的行数)。当 set nocount 为 off 时,返回计数。<br/>   即使当 set nocount 为 on 时,也更新 @@rowcount 函数。<br/>   当 set nocount 为 on 时,将不给客户端发送存储过程中的每个语句的 done_in_proc 信息。当使用 microsoft? sql server? 提供的实用工具执行查询时,在 transact-sql 语句(如 select、insert、update 和 delete)结束时将不会在查询结果中显示"nn rows affected"。<br/>   如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。<br/>   set nocount 设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set nocount 权限默认授予所有用户。<br/><br/>示例:下例在 osql 实用工具或 sql server 查询分析器中执行时,可防止显示有关受影响的行数的信息。<br/><br/>   use pubs<br/>   go<br/>   -- display the count message.<br/>   select au_lname <br/>   from authors<br/>   go<br/>   use pubs<br/>   go<br/>   -- set nocount to on and no longer display the count message.<br/>   set nocount on<br/>   go<br/>   select au_lname <br/>   from authors<br/>   go<br/>   -- reset set nocount to off.<br/>   set nocount off<br/>   go<br/><br/>&nbsp;<br/><br/>7. @@rowcount<br/>说明:返回受上一语句影响的行数。<br/><br/>语法:@@rowcount<br/><br/>返回类型:integer<br/><br/>注释:任何不返回行的语句将这一变量设置为 0 ,如 if 语句。<br/><br/>示例:下面的示例执行 update 语句并用 @@rowcount 来检测是否有发生更改的行。<br/><br/>   update authors set au_lname = jones<br/>   where au_id = 999-888-7777<br/>   if @@rowcount = 0<br/>   &nbsp;&nbsp; print warning: no rows were updated<br/><br/>&nbsp;<br/><br/>8. set rowcount<br/><br/>说明:使 microsoft? sql server? 在返回指定的行数之后停止处理查询。 <br/><br/>语法:set rowcount { number | @number_var } <br/><br/>参数:number | @number_var&nbsp;是在停止给定查询之前要处理的行数(整数)。<br/><br/>注释:建议将当前使用 set rowcount 的 delete、insert 和 update 语句重新编写为使用 top 语法。有关更多信息,请参见 delete、insert 或 update。<br/>   对于在远程表和本地及远程分区视图上执行的 insert、update 和 delete 语句,忽略 set rowcount 选项设置。<br/>   若要关闭该选项(以便返回所有的行),请将 set rowcount 指定为 0。<br/>   说明&nbsp; 设置 set rowcount 选项将使大多数 transact-sql 语句在已受指定数目的行影响后停止处理。这包括触发器和 insert、update 及 delete 等数据修改语句。rowcount 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 select 语句一起使用。<br/>   如果行数的值较小,则 set rowcount 替代 select 语句 top 关键字。<br/>   set rowcount 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>权限:set rowcount 权限默认授予所有用户。<br/><br/>示例:set rowcount 在指定的行数后停止处理。在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。rowcount 影响所有的 transact-sql 语句。<br/><br/>   use pubs<br/>   go<br/>   select count(*) as cnt<br/>   from titles <br/>   where advance &gt;= 5000<br/>   go<br/><br/>   下面是结果集:<br/><br/>   cnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>   ----------- <br/>   11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/><br/>   (1 row(s) affected)<br/><br/>   现在,将 rowcount 设置为 4,并更新预付款等于或大于 $5,000 的所有行。<br/><br/>   -- set rowcount to 4.<br/>   set rowcount 4<br/>   go<br/>   update titles<br/>   set advance = 5000<br/>   where advance &gt;= 5000<br/>   go<br/><br/>&nbsp;<br/><br/>9. set transaction isolation level<br/>说明:控制由连接发出的所有 microsoft? sql server? select 语句的默认事务锁定行为。<br/><br/>语法:set transaction isolation level<br/>   { read committed<br/>   &nbsp;&nbsp;&nbsp; | read uncommitted<br/>   &nbsp;&nbsp;&nbsp; | repeatable read<br/>   &nbsp;&nbsp;&nbsp; | serializable <br/>   }<br/><br/>参数:read committed&nbsp;指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 sql server 的默认值。<br/>   read uncommitted&nbsp;执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 nolock 相同。这是四个隔离级别中限制最小的级别。<br/>   repeatable read&nbsp;锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。<br/>   serializable&nbsp;在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 select 语句中的所有表上设置 holdlock 相同。<br/><br/>注释:一次只能设置这些选项中的一个,而且设置的选项将一直对那个连接保持有效,直到显式更改该选项为止。这是默认行为,除非在语句的 from 子句中在表级上指定优化选项。<br/>   set transaction isolation level 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例为会话设置 transaction isolation level。对于每个后续 transact-sql 语句,sql server 将所有共享锁一直控制到事务结束为止。<br/><br/>   set transaction isolation level repeatable read<br/>   go<br/>   begin transaction<br/>   select * from publishers<br/>   select * from authors<br/>   ...<br/>   commit transaction<br/><br/>&nbsp;<br/><br/>10. set xact_abort<br/><br/>说明:指定当 transact-sql 语句产生运行时错误时,microsoft? sql server? 是否自动回滚当前事务。<br/><br/>语法:set xact_abort { on | off }<br/><br/>注释:当 set xact_abort 为 on 时,如果 transact-sql 语句产生运行时错误,整个事务将终止并回滚。为 off 时,只回滚产生错误的 transact-sql 语句,而事务将继续进行处理。编译错误(如语法错误)不受 set xact_abort 的影响。<br/>   对于大多数 ole db 提供程序(包括 sql server),隐性或显式事务中的数据修改语句必须将 xact_abort 设置为 on。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 <br/>   set xact_abort 的设置是在执行或运行时设置,而不是在分析时设置。<br/><br/>示例:下例导致在含有其它 transact-sql 语句的事务中发生违反外键错误。在第一个语句集中产生错误,但其它语句均成功执行且事务成功提交。在第二个语句集中,set xact_abort 设置为 on。这导致语句错误使批处理终止,并使事务回滚。 <br/><br/>   create table t1 (a int primary key)<br/>   create table t2 (a int references t1(a))<br/>   go<br/>   insert into t1 values (1)<br/>   insert into t1 values (3)<br/>   insert into t1 values (4)<br/>   insert into t1 values (6)<br/>   go<br/>   set xact_abort off<br/>   go<br/>   begin tran<br/>   insert into t2 values (1)<br/>   insert into t2 values (2) /* foreign key error */<br/>   insert into t2 values (3)<br/>   commit tran<br/>   go<br/><br/>   set xact_abort on<br/>   go<br/><br/>   begin tran<br/>   insert into t2 values (4)<br/>   insert into t2 values (5) /* foreign key error */<br/>   insert into t2 values (6)<br/>   commit tran<br/>   go<br/><br/>   /* select shows only keys 1 and 3 added. <br/>   &nbsp;&nbsp; key 2 insert failed and was rolled back, but<br/>   &nbsp;&nbsp; xact_abort was off and rest of transaction<br/>   &nbsp;&nbsp; succeeded.<br/>   &nbsp;&nbsp; key 5 insert error with xact_abort on caused<br/>   &nbsp;&nbsp; all of the second transaction to roll back. */<br/><br/>   select * <br/>   from t2<br/>   go<br/><br/>   drop table t2<br/>   drop table t1<br/>   go<br/>
页: [1]
查看完整版本: 使用 SQL Server 时需要经常用到的几个设置选项