30/09/2019, 08:25

Temp Table SQL Server - Bảng tạm trong SQL Server

Sẽ rất có lợi khi lưu trữ dữ liệu trong các bảng tạm thời của SQL Server thay vì thao tác hoặc làm việc với các bảng cố định. Khi bạn muốn có đầy đủ quyền truy cập vào các bảng trong Database, nhưng bạn lại không có. Bạn có thể sử dụng quyền truy cập đọc ...

Sẽ rất có lợi khi lưu trữ dữ liệu trong các bảng tạm thời của SQL Server thay vì thao tác hoặc làm việc với các bảng cố định.

Khi bạn muốn có đầy đủ quyền truy cập vào các bảng trong Database, nhưng bạn lại không có. Bạn có thể sử dụng quyền truy cập đọc hiện có của mình để kéo dữ liệu vào bảng tạm thời của SQL-Server và thực hiện các điều chỉnh từ đó.

Hoặc bạn không có quyền để tạo bảng trong cơ sở dữ liệu hiện có, bạn có thể tạo bảng tạm thời SQL Server mà bạn có thể thao tác.

Cuối cùng, bạn có thể rơi vào tình huống chỉ cần hiển thị dữ liệu trong phiên hiện tại, và muốn update insert data trước khi hiển thị.

Bảng tạm chính là giải pháp mà bạn cần để xài !

  • Vậy bảng tạm trong SQL server là gì ?
temp-table-variable-table Các kiểu bảng tạm trong SQL Server

Bảng tạm là các có cấu trúc và chức năng như một bảng cố định bình thường trong SQL Server. Nhưng thay vì tạo ra một bảng trong Database, bảng tạm được tạo ra và lưu trữ trong tempdb. Chúng ta thường tạo bảng tạm trong một câu truy vấn, trong xử lý của một procedure hoặc trong một function (chỉ sử dụng được biến kiểu bảng). (Nguồn)

Có 2 loại bảng tạm đó là #tenbang1 và ##tenbang2. Với bảng chỉ có một tiền tố #, bảng này sẽ được tạo và truy vấn sử dụng cục bộ, tức là username nào tạo ra thì chỉ có user đó được xài. Vậy với bảng có tiền tố là ## thì một user tạo ra, những user khác cũng có thể truy cập đến và thao tác.
Đến đây chắc có bạn sẽ hỏi là: Nó khác gì so với bảng cố định ? Câu trả lời là nó sẽ biến mất khi user tạo ra nó kết thúc phiên đăng nhập. (tham khảo tại đây).

  • Sử dụng bảng tạm. Cú pháp :
	--Create temp table
        CREATE TABLE #TempTable1 
	(
	   ID INT IDENTITY PRIMARY KEY NOT NULL, 
	   Name VARCHAR(10) NOT NULL, 
	   DOB DATETIME null
	)
	GO
        CREATE TABLE ##TempTable2 
	(
	   ID INT IDENTITY PRIMARY KEY NOT NULL, 
	   Name VARCHAR(10) NOT NULL, 
	   DOB DATETIME null
	)
	GO
        INSERT INTO ##TempTable2
            (  Name, DOB )
        VALUES  ( 
              'TONA', -- Name - varchar(10)
              GETDATE()  -- DOB - datetime
              )
	GO
        SELECT * FROM ##TempTable2

Như ví dụ trên cho thấy, bạn có thể tao key cho bảng, và bạn cũng có thể tạo index luôn.

Do bảng tạm được lưu trong bộ nhớ nên chúng ta chỉ cần tạo ra một lần sau đó có thể sử dụng câu lệnh insert, update, delete mà không cần phải create bảng lại. 

  • Xóa bảng tạm. Cú pháp:
DROP TABLE #TempTable1
DROP TABLE ##TempTable2

Một dạng khác của bảng tạm đó chính là biến bảng. Với cú pháp:

	DECLARE @TableName TABLE(
		ID INT IDENTITY PRIMARY KEY NOT NULL, 
		Name VARCHAR(10) NOT NULL, 
		DOB DATETIME null
		)		
	INSERT INTO @TableName
            (  Name, DOB )
        VALUES  ( 
              'TONA', -- Name - varchar(10)
              GETDATE()  -- DOB - datetime
              )	
	SELECT * FROM @TableName
  • Biến bảng là biến dữ liệu kiểu bảng, được khởi tạo và lưu trong RAM như một biến bình thường chỉ khác là nó kiểu bảng. Do đó biến bảng cũng đóng vai trò như một bảng tạm. Chỉ khác là bảng tạm chỉ tạo một lần và có thể sử dụng trong suốt phiên đăng nhập, còn biến bảng sẽ mất khi khi kết thúc đoạn truy vấn.

Ngoài ra, khi bạn muốn tạo một function trong SQl-Server, bạn không thể sử dụng cú pháp Create Table được, do đó, biến bảng sẽ là lựa chọn khả dĩ nhất cho bạn.

  • Vậy hiệu năng khi sử dụng hai dạng này có chệnh lệch nhiều không ?

Theo một nghiên cứu chưa được xác mình thì 2 dạng trên không có chênh lệch nhiều về hiệu năng khi các bảng có số lượng bản ghi không lớn (<10k rows).

Nhưng khi bạn phải xử lý với một bảng có số lượng bảng ghi lớn (>=1m rows ), sẽ có sự chênh lệch về hiệu năng giữa những câu lệnh insert, update và select.
Cụ thể:

Đối với câu lệnh Insert, biến bảng sẽ có hiệu năng lớn hơn rất đáng kể. Nhưng khi Select, bảng tạm sẽ có hiệu năng tốt hơn, do bảng tạm có thể thiết lập index, điều này là bất khả thi khi bạn declare một biến bảng. Tương tự, với cậu lệnh delete thì nếu bảng tạm có thiết lập index, việc xóa chúng sẽ mất nhiều thời gian hơn so với một biến bảng chỉ có dữ liệu.

Như vậy vấn đề chỉ có ở index của bảng, do đó, nếu muốn sử dụng bạn có thể yên tâm là 2 dạng này không có nhiều sự chênh lệch về hiệu năng, nhưng tùy trường hợp và mục đích mà bạn có thể cất nhắc lựa chọn loại bảng phù hợp với bài toán mình.

HAPPY CODING !!!

Chi tiết đánh giá hiệu năng, tham khảo tại đây)

Tags: temp-table sql-server table-variable
0