2009-10-20 26 views
9

Sự khác biệt giữa:Sự khác nhau giữa TEMPORARY TABLE và TABLE VARIABLE trong SQL 2008 là gì?

CREATE TABLE #temp ([ID] INT) 

INSERT INTO #temp 
SELECT ... 

DECLARE @temp TABLE ([ID] INT) 

INSERT @temp 
SELECT ... 

trong SQL Server 2008 là gì?

+1

[Câu trả lời của tôi ở đây bao gồm điều này khá toàn diện] (http://dba.stackexchange.com/q/16385/3690) –

+0

@Martin: Câu hỏi thú vị và đặc biệt là câu trả lời. Cảm ơn bạn! – abatishchev

Trả lời

11

Bảng tạm thời giống như các bảng thông thường trong hầu hết các đặc điểm, ngoại trừ chúng đi vào TempDB thay vì cơ sở dữ liệu hiện tại và chúng biến mất sau phạm vi giới hạn (tùy thuộc vào việc chúng là bảng tạm thời hay toàn cục). otoh, bạn cũng có thể thêm bao nhiêu chỉ mục hoặc khung nhìn, hoặc trình kích hoạt, hoặc bất cứ thứ gì khác mà bạn muốn vào một bảng temp chính xác như bạn làm với một cái bình thường.

Biến bảng là loại bảng trong bộ nhớ ngắn (chúng cũng sử dụng DB tạm thời) .Thay đổi chúng không được ghi nhật ký (điều này cải thiện hiệu suất). Nhưng bạn chỉ có thể có một chỉ mục trên chúng, (vì không thể tạo chỉ mục sau khi khai báo ban đầu tatement, chỉ số duy nhất mà bạn có thể tạo ra trên một biến bảng là một trong đó có thể được đưa vào khai biến bảng ban đầu ...

Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20)) 

Vì những đặc điểm, bảng tạm thời là sự lựa chọn tốt hơn cho các bảng lớn, (rộng và với nhiều hàng), và/hoặc sẽ trải qua nhiều mô hình truy cập trong suốt cuộc đời của chúng, trong khi các biến bảng là tốt nhất khi bạn cần một bảng rất hẹp (bảng chỉ khóa, hoặc khóa chỉ với một cột dữ liệu), luôn được truy cập bằng khóa được lập chỉ mục đó ...

+0

Trình tối ưu hóa cũng giả định rằng biến bảng luôn có chính xác 1 hàng. – erikkallen

+2

@erikkallen, không biết điều đó; vui lòng tham khảo ? –

+2

"bạn chỉ có thể nhận được một chỉ mục trên chúng, (vì không thể tạo chỉ mục sau câu lệnh khai báo ban đầu" - khi tuyên bố khai báo ban đầu bao gồm nhiều cấu trúc logic được biết là tạo ra một chỉ mục, ví dụ: 'UNIQUE': 'DECLARE @T TABLE (ID1 INTEGER NOT NULL UNIQUE, ID2 INTEGER NOT NULL UNIQUE);' chắc chắn điều này sẽ tạo ra hai chỉ mục, không? – onedaywhen

1
  1. Không có bản ghi cho các biến bảng
  2. Bảng biến có phạm vi chỉ địa phương (bạn không thể truy cập vào biến cùng một bảng từ các thủ tục khác nhau)
  3. Các thủ tục có bảng tạm thời không thể được biên dịch trước

Để biết thêm chi tiết, xem this topic.

1
  1. Biến bảng có phạm vi được xác định rõ. Chúng sẽ được xóa tự động vào cuối lô (tức là các đợt phát biểu hiện tại), nơi mà bảng tạm thời sẽ được hiển thị cho phiên hiện tại và các thủ tục được lưu trữ lồng nhau. Bảng tạm thời toàn cầu sẽ hiển thị cho tất cả các phiên.

  2. Biến bảng được tạo bằng tuyên bố Khai báo. Chúng ta không thể tạo ra biến bảng sử dụng tuyên bố

    select * into @tableVariableName 
    

    Nhưng chúng ta có thể tạo bảng tạm thời sử dụng Tạo bảng báo cáo cũng như tuyên bố

    select * into #tempTableName 
    
  3. Trong SQL Server 2008 trở đi chúng ta có thể vượt qua các biến bảng như một tham số cho các thủ tục được lưu trữ. Nhưng chúng ta không thể chuyển bảng tạm thời thành tham số cho thủ tục được lưu trữ.

  4. Chúng tôi có thể sử dụng biến bảng bên trong UDF (hàm do người dùng định nghĩa) nhưng chúng tôi không thể sử dụng bảng tạm thời bên trong UDF.

Các vấn đề liên quan