作者flakchen (flak)
看板Database
标题Re: [SQL ] 在SQL Server中,有没有暂存table的功能?
时间Mon Dec 4 11:59:35 2006
MS-SQL可以用暂存资料表,用create table的语法即可
差别是Table名称前面要加「#」 ,例如create table #T(col1 int,col2 varchar(255)...)
则Server会建立一个资料表在tempdb资料库中,只有你的工作阶段存取得到
呼叫Drop Table #T,或是工作阶段、预存程序结束後就消失
SQL 2000後有资料表变数,要用变数方式宣告,但必须单独宣告,不能与其他变数一起
宣告:
Declare @T Table(col1 int,col2 varchar(255)...
资料表变数的生命周期比较短,在以SQL Query Analyzer中宣告时,每执行一次就消失
了,跟变数一样。但暂存资料表会继续留着,直到Query Analyzer的工作中视窗关闭为
止,所以要再次执行同一视窗的指令的话,要先Drop Table #T才能再Create Table #T
微软宣称资料表变数是把资料放在记忆体,就像程式语言的阵列变数一样,所以速度最快
,希望大家用它来取代暂存资料表。但实际上,国外使用者都怀疑这种说法,资料表变数
似乎仍然是有资料写在硬碟里面,所以存取它还是有硬碟I/O。不过可能它的资料结构比
较简单,所以一般资料不大的时候真的比较快。
但资料表变数的问题是不能建Index,所以存放资料笔数多的时候,反而比较慢
而暂存资料表因为是完整的资料表,所以还是可以建Index,也可以用Index Hint的方法
替大量资料的查询最佳化。但要注意的是暂存资料表其实就是tempdb资料库里面的资料表
所以存取速度会被tempdb所安装的硬碟速度所影响,也要注意该硬碟的容量是否足够
※ 引述《artingo (鱼与熊掌如何兼得)》之铭言:
: 假设我要把某一个select的结果集
: 存到记忆体中的一个暂存table
: 以便再对该暂存table作SQL指令存取
: 有这个指令吗?
: 我只知道在Foxpro中可以用Into cursor tempXXX 的方式来作
: 那SQL server或是Access所支援的指令是?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.64.110.97