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