2012-01-30 21 views
5

Tôi có thể giả định rằng tôi đã lưu các thủ tục bằng cách sử dụng tempdb để viết bảng tạm thời hay không.Có sử dụng các biến Table nhanh hơn so với các bảng tạm thời

+1

Có bao nhiêu bản ghi trong các bảng tạm thời, cấu hình máy chủ của bạn như các biến bảng có thể được đẩy lên tempdb như thế nào. http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx – Kane

+0

Dữ liệu thay đổi, nhưng đó là một điểm tốt . Nếu một biến bảng sẽ hoạt động hiệu quả hơn với lượng dữ liệu nhỏ, thì tôi sẽ chuyển đổi nó. –

+0

có thể trùng lặp của [Sự khác biệt giữa bảng tạm thời và biến bảng trong SQL Server là gì?] (Http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table -variable-in-sql-server) hoặc điều này: http: // stackoverflow.com/questions/6991511/sql-server-temp-table-vs-table-variable và có thể nhiều hơn – gbn

Trả lời

1

Bảng tạm thời có hiệu suất tốt hơn. Nếu bạn sử dụng biến Bảng và Dữ liệu trong Biến quá lớn, SQL Server sẽ tự động chuyển Biến thành bảng tạm thời.

Điều đó phụ thuộc, giống như hầu hết mọi câu hỏi liên quan đến Cơ sở dữ liệu, về những gì bạn cố gắng làm. Vì vậy, rất khó để trả lời mà không cần thêm thông tin.

Vì vậy, câu trả lời của tôi là, hãy thử và xem xét kế hoạch thực hiện. Sử dụng cách nhanh nhất với chi phí thấp nhất.

+0

Nhận xét của tôi ở trên cùng có hợp lý không và tôi có nên chuyển đổi không? –

+0

Thật khó để nói, chuyển đổi hay không. Nếu bạn muốn trả về một biến bảng và hoạt động của bạn nhanh chóng theo cả hai cách, vâng tôi sẽ chuyển đổi. Bạn thực sự nên thử nó. Ví dụ, tuần trước tôi đã tối ưu hóa một truy vấn trở nên quá chậm. 20 giờ trước, bây giờ là 2 phút. Tôi chỉ thay đổi từ một biến bảng thành một bảng tạm thời. Dữ liệu trả về không lớn, chỉ có 2000 hàng, nhưng nhiều hoạt động và bộ lọc. – dknaack

+3

"Nếu bạn sử dụng Biến Bảng và Dữ liệu trong Biến quá lớn, SQL Server sẽ tự động chuyển Biến thành bảng tạm thời". Tuyên bố này hoàn toàn sai. –

1

@Table có thể nhanh hơn là có ít "thời gian thiết lập" vì đối tượng là chỉ trong bộ nhớ.

@Tables có rất nhiều sản phẩm khai thác.

Bạn có thể có khóa chính trên @Table nhưng đó là khóa chính. Các chỉ mục khác Clustered NonClustered để kết hợp các cột là không thể.

Ngoài ra nếu bảng của bạn sẽ chứa bất kỳ khối lượng dữ liệu thực (nhiều hơn thì khoảng 200 có thể 1000 hàng) thì việc truy cập vào bảng sẽ chậm hơn. Đặc biệt là khi bạn có thể sẽ không có một chỉ số hữu ích trên đó.

#Tables là nỗi đau trong procs vì chúng cần được giảm khi gỡ lỗi, Chúng mất nhiều thời gian hơn để tạo. và họ mất nhiều thời gian để thiết lập khi bạn cần thêm chỉ mục làm bước thứ hai. Nhưng nếu bạn có rất nhiều dữ liệu thì #tables của nó mọi lúc.

Ngay cả trong trường hợp bạn có ít hơn 100 hàng dữ liệu trong bảng, bạn vẫn có thể muốn sử dụng #Tables vì ​​bạn có thể tạo chỉ mục hữu ích trên bảng.

Tóm lại tôi sử dụng @Tables hầu hết thời gian để dễ dàng khi thực hiện đơn giản proc vv Nhưng bất cứ điều gì cần thực hiện phải là một #Table.

+0

Tôi cũng đã từng tin vào câu chuyện này, cho đến khi gần đây tôi đã dọn dẹp một truy vấn và (một trong những điều cuối cùng tôi đã làm) cùng một truy vấn (được chạy thử nhiều lần, sử dụng cùng một tham số) trong 5 giây bằng cách sử dụng '# TempTable' so với 16 giây bằng '@ TableVar' – Jason

0

@Tables không có số liệu thống kê để kế hoạch thực hiện đòi hỏi nhiều phỏng đoán hơn. Do đó giới hạn trên được đề xuất của 1000 hàng ish. #Tables có thống kê nhưng những số này can be cached giữa các lời gọi. Nếu hồng y của bạn khác nhau đáng kể mỗi khi SP chạy, bạn sẽ muốn REBUILDRECOMPILE mỗi lần. Đây là một chi phí, tất nhiên, nhưng một trong đó phải được cân đối với chi phí của một kế hoạch rác.

Cả hai loại sẽ làm IO to TempDB.

Vì vậy, không, @Tables không phải là thuốc chữa bách bệnh.

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