mtdata(我很迷茫): 不知道你發現沒有,SQL 2000的Table變量有很多地方的行為都讓人無法理解,比如說,按你的說的法,Table變量是不能加index,但是,你發現沒有,你可以為table變量加上Primary Key,從而Table變量會自己擁有一個Cluster index.但如果想用Create Index ON table變量,這樣就不行。 還有,如果在table變量中想加Constraint,你是沒辦法直接用這樣子: Declare @p table (ex int Constraint check(ex<200)), MSSQL 2000會說"Server: Msg 156, Level 15, State 1, Line 1 Incorrect syntax near the keyword 'check'.", 但是如果把Constraint去掉,變成這樣: Declare @p table (ex int Check (ex<200)), 這樣就OK了!!!! 實在是不明白MS SQL2000的table變量……各位高手,都來指點一吧…!!
加上index对查询和更新的性能有很大的改善,但是至于性能能改善多少与你建的索引类型和你的查询语句有关
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[ WITH < index_option > [ ,...n] ]
[ ON filegroup ]< index_option > ::=
{ PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE |
SORT_IN_TEMPDB
}
即如果有 Declare @p table (id int)
這樣: Create index idx_zhou ON @p(id) --這一句不行。之所以我想為Table變量加index,是因為我在查看執行計劃的時候,發現每次對table變量的操作都會引起Table Scan的動作。所以我想是否為它加一個index,就能改善速度呢?? 但我試了上面的加索引的方法不行。請各路高手賜教。
~~~~~~~~~~~
即如果有 Declare @p table (id int)
這樣: Create index idx_zhou ON @p(id) --這一句不行
我现在机器上没有MSSQL2000
晚上回家试试看.
我一直都是用2000的。最近有個計算物料需求的SP需要做性能調整,里面有很多Table變量。看Execution Plan竟發現很多的table變量都做了Table Scan動作,頭疼。
沒關系。
以下参考books online:
返回一个 table 的 table 变量和用户定义函数只能用于某些 SELECT 和 INSERT 语句,而且其中 UPDATE、DELETE 和 DECLARE CURSOR 语句支持表。返回 table 的 table 变量和用户定义函数不能用于任何其它 Transact-SQL 语句。
在该表中使用的索引或其它约束必须被定义为 DECLARE variable 或 CREATE FUNCTION 语句的一部分。不得过后再使用它们,因为 CREATE INDEX 或 ALTER TABLE 语句不能引用表变量和用户定义的函数。
不知道你發現沒有,SQL 2000的Table變量有很多地方的行為都讓人無法理解,比如說,按你的說的法,Table變量是不能加index,但是,你發現沒有,你可以為table變量加上Primary Key,從而Table變量會自己擁有一個Cluster index.但如果想用Create Index ON table變量,這樣就不行。
還有,如果在table變量中想加Constraint,你是沒辦法直接用這樣子: Declare @p table (ex int Constraint check(ex<200)), MSSQL 2000會說"Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'check'.",
但是如果把Constraint去掉,變成這樣:
Declare @p table (ex int Check (ex<200)),
這樣就OK了!!!!
實在是不明白MS SQL2000的table變量……各位高手,都來指點一吧…!!
与 CREATE TABLE 中定义表所用的信息子集相同的信息子集。表声明包括列定义、名称、数据类型和约束。允许的约束类型仅为 PRIMARY KEY、UNIQUE KEY 和 NULL。
涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
不支持在表变量之间进行赋值操作。另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。