Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Sai lầm về hiệu suất:Các biến bảng luôn ở trong bộ nhớ

Tác giả của khách:Derik Hammer (@SQLHammer)


Gần đây Aaron Bertrand đã viết blog về những lầm tưởng về hiệu suất máy chủ SQL có hại, phổ biến. Là một phần mở rộng của loạt blog này, tôi sẽ bác bỏ quan điểm sai lầm phổ biến này:

"Các biến bảng luôn ở trong bộ nhớ, do đó nhanh hơn các bảng tạm thời."

Đọc hướng dẫn sử dụng

Đi thẳng vào nguồn, tôi xem bài báo Sách trực tuyến về bảng bao gồm các biến bảng. Mặc dù bài viết đề cập đến lợi ích của việc sử dụng các biến bảng, nhưng thực tế là chúng có 100% trong bộ nhớ là thiếu rõ ràng.

Tuy nhiên, một câu khẳng định bị thiếu không có nghĩa là một câu phủ định. Kể từ khi bảng OLTP trong bộ nhớ được phát hành, hiện có rất nhiều tài liệu về BOL để xử lý trong bộ nhớ. Đó là nơi tôi tìm thấy bài viết này về cách tạo bảng tạm thời và các biến bảng nhanh hơn bằng cách sử dụng tối ưu hóa bộ nhớ.

Toàn bộ bài viết xoay quanh cách làm cho các đối tượng tạm thời của bạn sử dụng tính năng OLTP trong bộ nhớ và đây là nơi tôi tìm thấy điều khẳng định mà tôi đang tìm kiếm.

"Một biến bảng truyền thống đại diện cho một bảng trong cơ sở dữ liệu tempdb. Để có hiệu suất nhanh hơn nhiều, bạn có thể tối ưu hóa bộ nhớ cho biến bảng của mình."

Các biến bảng không phải là cấu trúc trong bộ nhớ. Để sử dụng công nghệ trong bộ nhớ, bạn phải xác định rõ ràng TYPE được tối ưu hóa bộ nhớ và sử dụng TYPE đó để xác định biến bảng của bạn.

Chứng minh điều đó

Tài liệu là một chuyện nhưng tận mắt chứng kiến ​​lại là chuyện khác. Tôi biết rằng các bảng tạm thời tạo các đối tượng trong tempdb và sẽ ghi dữ liệu vào đĩa. Trước tiên, tôi sẽ cho bạn thấy các bảng tạm thời trông như thế nào và sau đó tôi sẽ sử dụng cùng một phương pháp để xác thực giả thuyết rằng các biến trong bảng hoạt động theo cùng một cách.

Phân tích bản ghi nhật ký

Truy vấn này sẽ chạy một CHECKPOINT để cung cấp cho tôi một điểm khởi đầu rõ ràng và sau đó hiển thị số lượng bản ghi nhật ký và tên giao dịch tồn tại trong nhật ký.

USE tempdb;
GO
 
CHECKPOINT;
GO
 
SELECT COUNT(*) [Count] 
  FROM sys.fn_dblog (NULL, NULL);
 
SELECT [Transaction Name]
  FROM sys.fn_dblog (NULL, NULL)
  WHERE [Transaction Name] IS NOT NULL;


Chạy T-SQL liên tục dẫn đến số lượng ba bản ghi nhất quán trên SQL Server 2016 SP1.

Thao tác này tạo một bảng tạm thời và hiển thị bản ghi đối tượng, chứng minh rằng đây là một đối tượng thực trong tempdb.

USE tempdb;
GO
 
DROP TABLE IF EXISTS #tmp;
GO
 
CREATE TABLE #tmp (id int NULL);
 
SELECT name
  FROM sys.objects o
  WHERE is_ms_shipped = 0;

Bây giờ tôi sẽ hiển thị lại các bản ghi nhật ký. Tôi sẽ không chạy lại lệnh CHECKPOINT.

21 bản ghi nhật ký đã được ghi, chứng minh rằng đây là những bản ghi trên đĩa và TẠO BẢNG TẠO của chúng tôi rõ ràng được bao gồm trong các bản ghi nhật ký này.

Để so sánh các kết quả này với các biến bảng, tôi sẽ đặt lại thử nghiệm bằng cách chạy CHECKPOINT và sau đó thực thi T-SQL bên dưới, tạo một biến bảng.

USE tempdb;
GO
 
DECLARE @var TABLE (id int NULL);
 
SELECT name
  FROM sys.objects o
  WHERE is_ms_shipped = 0;

Một lần nữa chúng ta có một bản ghi đối tượng mới. Tuy nhiên, lần này, tên này ngẫu nhiên hơn so với các bảng tạm thời.

Có tám mươi hai bản ghi nhật ký mới và tên giao dịch chứng minh rằng biến của tôi đang được ghi vào nhật ký và do đó, vào đĩa.

Thực tế là trong bộ nhớ

Bây giờ đã đến lúc tôi làm cho các bản ghi nhật ký biến mất.

Tôi đã tạo một nhóm tệp OLTP trong bộ nhớ và sau đó tạo một loại bảng được tối ưu hóa cho bộ nhớ.

USE Test;
GO
 
CREATE TYPE dbo.inMemoryTableType  
  AS TABLE 
  ( id INT NULL INDEX ix1 )
  WITH (MEMORY_OPTIMIZED = ON);  
GO

Tôi thực hiện lại CHECKPOINT và sau đó tạo bảng được tối ưu hóa bộ nhớ.

USE Test;
GO
 
DECLARE @var dbo.inMemoryTableType;
 
INSERT INTO @var (id) VALUES (1)
 
SELECT * from @var;  
GO

Sau khi xem lại nhật ký, tôi không thấy bất kỳ hoạt động nhật ký nào. Trên thực tế, phương pháp này nằm trong bộ nhớ 100%.

Mang đi

Các biến bảng sử dụng tempdb tương tự như cách các bảng tạm thời sử dụng tempdb. Biến bảng không phải là cấu trúc trong bộ nhớ nhưng có thể trở thành chúng nếu bạn sử dụng loại bảng do người dùng xác định được tối ưu hóa bộ nhớ. Thường thì tôi thấy các bảng tạm thời là một lựa chọn tốt hơn nhiều so với các biến bảng. Lý do chính cho điều này là vì các biến bảng không có thống kê và, tùy thuộc vào phiên bản SQL Server và cài đặt, ước tính hàng có thể là 1 hàng hoặc 100 hàng. Trong cả hai trường hợp, đây là những phỏng đoán và trở thành những thông tin sai lệch có hại trong quá trình tối ưu hóa truy vấn của bạn.

Lưu ý rằng một số khác biệt về tính năng này có thể thay đổi theo thời gian - ví dụ:trong các phiên bản SQL Server gần đây, bạn có thể tạo chỉ mục bổ sung trên một biến bảng bằng cú pháp chỉ mục nội tuyến. Bảng sau có ba chỉ mục; khóa chính (được nhóm theo mặc định) và hai chỉ mục không được nhóm:

DECLARE @t TABLE
(
  a int PRIMARY KEY,
  b int,
  INDEX x (b, a DESC),
  INDEX y (b DESC, a)
);

Có một câu trả lời tuyệt vời trên DBA Stack Exchange nơi Martin Smith trình bày chi tiết đầy đủ về sự khác biệt giữa các biến bảng và bảng #temp:

  • Sự khác biệt giữa bảng tạm thời và biến bảng trong SQL Server là gì?

Giới thiệu về tác giả

Derik là một Microsoft Data Platform MVP chuyên nghiệp và mới mẻ, tập trung vào SQL Server. Niềm đam mê của anh ấy tập trung vào tính sẵn sàng cao, khắc phục thảm họa, tích hợp liên tục và bảo trì tự động. Kinh nghiệm của ông đã trải dài trong việc quản trị cơ sở dữ liệu dài hạn, tư vấn và các dự án kinh doanh làm việc trong ngành tài chính và chăm sóc sức khỏe. Anh hiện là Quản trị viên Cơ sở dữ liệu Cấp cao phụ trách nhóm Vận hành Cơ sở dữ liệu tại Trụ sở chính của Subway Franchise World. Khi anh ấy không theo dõi hoặc viết blog tại SQLHammer.com, Derik dành thời gian của mình cho #sqlfamily với tư cách là người đứng đầu chương của nhóm người dùng FairfieldPASS SQL Server ở Stamford, CT.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mô hình dữ liệu giao hàng tại nhà hàng

  2. Sao chép dữ liệu gia tăng trong IRI Workbench

  3. Percona DB là gì

  4. Chốt DBCC_OBJECT_METADATA

  5. Kết nối PowerShell với Salesforce.com