程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQLServer中暫時表與表變量的差別剖析

SQLServer中暫時表與表變量的差別剖析

編輯:MSSQL

SQLServer中暫時表與表變量的差別剖析。本站提示廣大學習愛好者:(SQLServer中暫時表與表變量的差別剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer中暫時表與表變量的差別剖析正文


在現實應用的時刻,我們若何靈巧的在存儲進程中應用它們,固然它們完成的功效根本上是一樣的,可若何在一個存儲進程中有時刻去應用暫時表而不應用表變量,有時刻去應用表變量而不應用暫時表呢?
暫時表

  暫時表與永遠表類似,只是它的創立是在Tempdb中,它只要在一個數據庫銜接停止後或許由SQL敕令DROP失落,才會消逝,不然就會一向存在。暫時表在創立的時刻都邑發生SQL Server的體系日記,雖它們在Tempdb中表現,是分派在內存中的,它們也支撐物理的磁盤,但用戶在指定的磁盤裡看不到文件。

  暫時表分為當地和全局兩種,當地暫時表的稱號都是以“#”為前綴,只要在當地以後的用戶銜接中才是可見的,當用戶從實例斷開銜接時被刪除。全局暫時表的稱號都是以“##”為前綴,創立後對任何用戶都是可見的,當一切援用該表的用戶斷開銜接時被刪除。

  上面我們來看一個創立暫時表的例子:

CREATE TABLE dbo.#News 
  ( 
  News_id int NOT NULL, 
  NewsTitle varchar(100), 
  NewsContent varchar(2000), 
  NewsDateTime datetime 
  ) 


暫時表可以創立索引,也能夠界說統計數據,所以可以用數據界說說話(DDL)的聲明來阻攔暫時表添加的限制,束縛,並參照完全性,如主鍵和外鍵束縛。好比來講,我們如今來為#News表字段NewsDateTime來添加一個默許的GetData()以後日期值,而且為News_id添加一個主鍵,我們便可以應用上面的語句:

ALTER TABLE dbo.#News 
  ADD 
  CONSTRAINT [DF_NewsDateTime] DEFAULT (GETDATE()) FOR [NewsDateTime], 
  PRIMARY KEY CLUSTERED 
  ( 
  [News_id] 
  ) ON [PRIMARY] 
  GO 


暫時表在創立以後可以修正很多已界說的選項,包含:

  1)添加、修正、刪除列。例如,列的稱號、長度、數據類型、精度、小數位數和為空性都可停止修正,只是有一些限制罷了。

  2)可添加或刪除主鍵和外鍵束縛。

  3)可添加或刪除 UNIQUE 和 CHECK 束縛及 DEFAULT 界說(對象)。

  4)可以使用 IDENTITY 或 ROWGUIDCOL 屬性添加或刪除標識符列。固然 ROWGUIDCOL 屬性也可添加至現有列或從現有列刪除,然則任什麼時候候在表中只能有一列可具有該屬性。

  5)表及表中所選定的列已注冊為全文索引。

  表變量

  表變量創立的語法相似於暫時表,差別就在於創立的時刻,必需要為之定名。表變量是變量的一種,表變量也分為當地及全局的兩種,當地表變量的稱號都是以“@”為前綴,只要在當地以後的用戶銜接中才可以拜訪。全局的表變量的稱號都是以“@@”為前綴,普通都是體系的全局變量,像我們經常使用到的,如 @@Error代表毛病的號,@@RowCount代表影響的行數。

  如我們看看創立表變量的語句:

DECLARE @News Table
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )

比擬暫時表及表變量都可以經由過程SQL的選擇、拔出、更新及刪除語句,它們的的分歧重要表現在以下這些:

  1)表變量是存儲在內存中的,當用戶在拜訪表變量的時刻,SQL Server是不發生日記的,而在暫時表中是發生日記的;

  2)在表變量中,是不許可有非集合索引的;

  3)表變量是不許可有DEFAULT默許值,也不許可有束縛;

  4)暫時表上的統計信息是健全而靠得住的,然則表變量上的統計信息是弗成靠的;

  5)暫時表中是有鎖的機制,而表變量中就沒有鎖的機制。

  我們如今來看一個完全的例子,來看它們的用法的異同:

  應用暫時表  

CREATE TABLE dbo.#News
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News
  DROP TABLE dbo.[#News]

應用表變量 

DECLARE @News table
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

我們可以看到下面兩種情形完成的是一樣的後果,第一種應用暫時表的時刻,暫時表普通被創立後,假如在履行的時刻,沒有經由過程DROP Table的操作,第二次就不克不及再被創立,而界說表變量也不須要停止DROP Table的操作,一次履行完成後就會消逝。






  其其實選擇暫時表照樣表變量的時刻,我們年夜多半情形下在應用的時刻都是可以的,但普通我們須要遵守上面這個情形,選擇對應的方法:

  1)應用表變量重要須要斟酌的就是運用法式對內存的壓力,假如代碼的運轉實例許多,就要特殊留意內存變量對內存的消費。我們關於較小的數據或許是經由過程盤算出來的推舉應用表變量。假如數據的成果比擬年夜,在代碼頂用於暫時盤算,在拔取的時刻沒有甚麼分組的聚合,便可以斟酌應用表變量。

  2)普通關於年夜的數據成果,或許由於統計出來的數據為了便於更好的優化,我們就推舉應用暫時表,同時還可以創立索引,因為暫時表是寄存在Tempdb中,普通默許分派的空間很少,須要對tempdb停止調優,增年夜其存儲的空間。




3)假如要在自界說函數中前往一個表,要用表變量如:

dbo.usp_customersbyPostalCode

( @PostalCode VARCHAR(15) )
RETURNS
@CustomerHitsTab TABLE (
[CustomerID] [nchar] (5),
[ContactName] [nvarchar] (30),
[Phone] [nvarchar] (24),
[Fax] [nvarchar] (24)
)
AS
BEGIN
DECLARE @HitCount INT

INSERT INTO @CustomerHitsTab
SELECT [CustomerID],
[ContactName],
[Phone],
[Fax]
FROM [Northwind].[dbo].[Customers]
WHERE PostalCode = @PostalCode

SELECT @HitCount = COUNT(*)


FROM @CustomerHitsTab

IF @HitCount = 0
--No Records Match Criteria
INSERT INTO @CustomerHitsTab (
[CustomerID],
[ContactName],
[Phone],
[Fax] )
VALUES ('','No Companies In Area','','')
RETURN
END
GO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved