临时表vs.表变量以及它们对SQLServer性能的影响
在临时表
create table #T (…)
和表变量
declare @T table (…)
之间主要有3个理论上的不同。
第一个不同使事务日志不会记录表变量。因此,它们脱离了事务机制的范围,从下面的例子可显而易见:
create table #T (s varchar(128))
declare @T table (s varchar(128))
insert into #T select 'old value #'
insert into @T select 'old value @'
begin transaction
update #T set s='new value #'
update @T set s='new value @'
rollback transaction
select * from #T
select * from @T
s
---------------
old value #
s
---------------
new value @
在声明临时表#T和表变量@T之后,给它们分配一个相同的值为old value字符串。然后,开始一个事务去更新它们。此时,它们都将有新的相同的值new value字符串。但当事务回滚时,正如你所看到的,表变量@T保留了这个新值而没有返回old value字符串。这是因为即使表变量在事务内被更新了,它本身不是事务的一部分。
第二个主要的不同是任何一个使用临时表的存储过程都不会被预编译,然而使用表变量的存储过程的执行计划可以预先静态的编译。预编译一个脚本的主要好处在于加快了执行的速度。这个好处对于长的存储过程更加显著,因为对它来说重新编译代价太高。
最后,表变量仅存在于那些变量能存在的相同范围内。和临时表相反,它们在内部存储过程和exec(string)语句里是不可见的。它们也不能在insert/exec语句里使用。
性能比较
首先,准备一个有100万记录的测试表:
create table NUM (n int primary key, s varchar(128))
GO
set nocount on
declare @n int
set @n=1000000
while @n>0 begin
insert into NUM
select @n,'Value: '+convert(varchar,@n)
set @n=@n-1
end
GO
准备测试存储过程T1:
create procedure T1
@total int
as
create table #T (n int, s varchar(128))
insert into #T select n,s from NUM
where n%100>0 and n<=@total
declare @res varchar(128)
select @res=max(s) from NUM
where n<=@total and
相关文档:
写了一个存储过程对视图进行分页查询,但数据增多后发现基效率低得要命,三万多条数据要查询一个半小时都没出来,这不是要了命,于是想到了索引,应用过后仍无济于事。最后对sql进行分析和实践中得出,使用临时表可以大大加快视图的查询速度,见如下sql语句
性能超低的视图分页sql语句:
select top 100 * from
view_c ......
第一种 JavaScript连接数据库:
<mce:script language="JavaScript"><!--
// 创建数据库对象
var objdbConn = new ActiveXObject("ADODB.Connection");
// DSN字符串
var strdsn = "Driver={SQL Server};SERVER=192.168.0.210;UID=xhb;PWD=xhb;DATABASE=books";
// 打开数据源
objdbConn.Open(strdsn);
// ......
SqlServer 表中当之前有记录的时候发现表设计的不合理要加字段,
但是alter table Skating_Consumption add MemberCardId numeric(9)只能加可为空的字段,
解决办法,
第一、加个为空的字段
第二、更新表中记录这个字段为某个值
第三、再更改表字段为非空
语句
alter table Skating_Consumption add MemberCardId nu ......
查看是否区分大小写-执行存储过程sys.sp_server_info
exec sys.sp_server_info
查看第18行COLLATION_SEQ-collation属性
charset=cp936 collation=Chinese_PRC_CS_AS
cs为区分大小写,CI为不区分大小写
将区分大小写改为不区分大小写
alter database yourDB COLLATE Chinese_PRC_CI_AS
将不区分大小写改为区分大小写
......
<Language from="SQL" To="C#">
<Type from="bigint" To="long" />
<Type from="binary" To="object" />
<Type from="bit" To="bool" />
<Type from="char" To="string" />
<Type from="datetime" To="DateTime" ......