2008-10-20 22 views
5

Tôi có một tập lệnh cần trích xuất dữ liệu tạm thời để thực hiện các thao tác bổ sung trên đó, nhưng sau đó không cần lưu trữ thêm bất kỳ thông tin nào sau khi tập lệnh đã chạy. Tôi hiện đang có dữ liệu được đề cập trong một loạt các bảng cục bộ tạm thời (CREATE TABLE #table), sau đó sẽ bị xóa khi sử dụng xong. Tôi đã xem xét việc chuyển sang bảng vật lý, được xử lý theo cùng một cách (bảng TẠO TẠO), nếu có sự cải thiện về tốc độ của kịch bản cho nó (hoặc các lợi thế khác, có thể?).Tốc độ so sánh của bảng tạm thời với bảng vật lý trong SQL là bao nhiêu?

... Vì vậy, có sự khác biệt về hiệu suất, giữa các bảng tạm thời và bảng vật lý không? Từ những gì tôi đang đọc, các bảng tạm thời chỉ là các bảng vật lý mà chỉ có phiên chạy kịch bản có thể xem xét (cắt giảm các vấn đề về khóa).

EDIT: Tôi nên chỉ ra rằng tôi đang nói về bảng vật lý so với bảng tạm thời. Có rất nhiều thông tin có sẵn về các bảng tạm thời so với các biến bảng, ví dụ: http://sqlnerd.blogspot.com/2005/09/temp-tables-vs-table-variables.html.

Trả lời

1

Bảng tạm thời là NO lớn trong SQL Server.

  • Chúng kích hoạt tính năng biên dịch kế hoạch truy vấn tốn kém.
  • Tạo và thả bảng cũng là các hoạt động tốn kém mà bạn đang thêm vào quy trình của mình.
  • Nếu có một lượng lớn dữ liệu chuyển đến dữ liệu tạm thời, hoạt động của bạn sẽ chậm khi thiếu chỉ mục. Bạn CÓ THỂ tạo các chỉ mục trên các bảng tạm thời. Nhưng tôi sẽ không bao giờ đề nghị một bảng tạm thời cho bất cứ điều gì với một số lượng lớn hồ sơ.

Cách tiếp cận khác của bạn: Để tạo và sau đó thả các bảng thông thường chỉ tạo cùng một chi phí.

Cách tiếp cận khác: Sử dụng bảng hiện có, tăng thêm các hàng có cột bổ sung để phân biệt các hàng liên quan đến mỗi người dùng/phiên có thể được sử dụng. Loại bỏ gánh nặng để tạo/thả các bảng nhưng, sau đó, bạn sẽ cần phải hoang tưởng với mã tạo ra giá trị để phân biệt các hàng VÀ bạn sẽ phải phát triển một cách để duy trì bảng cho những trường hợp mà phiên kết thúc sớm và còn dư thừa (các hàng không được gỡ bỏ ở cuối quá trình xử lý).

Tôi khuyên bạn nên suy nghĩ lại chiến lược xử lý của mình. Một số lựa chọn thay thế dễ dàng như sử dụng các truy vấn có liên quan, các bảng có nguồn gốc hoặc các biến bảng. Hãy xem tại địa chỉ: http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx


Edit: Cách tiếp cận của việc tạo ra và thả bảng thường xuyên và phương pháp tái sử dụng một bảng thông thường augumented với một trường bổ sung: Cả hai sẽ tạo ra recompilations kế hoạch truy vấn vì số lượng dữ liệu thay đổi sẽ kích hoạt đánh giá lại các thống kê bảng. Một lần nữa, cách tiếp cận tốt nhất của bạn là tìm cách thay thế để xử lý dữ liệu của bạn.

+5

-1 #temp tables có thể sẽ tốt hơn trong trường hợp này. [Xem câu trả lời này để được giải thích] (http://stackoverflow.com/questions/3175427/sql-server-temporary-vs-physical-tables/3175531#3175531). Ngoài ra 'tempdb' có ghi nhật ký tối ưu so với cơ sở dữ liệu thông thường.Các Biến được lưu trữ chính xác giống như các bảng tạm thời để đề xuất không có ý nghĩa. Bài viết mà bạn liên kết là hoàn toàn sai về việc ghi nhật ký giao dịch cho các biến bảng. –

0

Đối với MySql ít nhất, tiết kiệm thời gian duy nhất bạn sẽ nhận được là tiết kiệm thời gian thực sự tạo bảng tạm thời. AFAIK tất cả các bảng được xử lý giống nhau trên đĩa, chúng chỉ xảy ra để biến mất vào cuối phiên của bạn. Đây là những gì tôi đã thấy trong thực tế là tốt. Một lần nữa, đây là mysql 4.x và 5.x

0

Tôi không chắc chắn 100% về điều này, nhưng tôi tin rằng các biến bảng nằm trong bộ nhớ nhưng các bảng tạm thời nằm trong tempdb, được lưu trữ trên đĩa. Điều này đang sử dụng SQL Server, tôi không chắc chắn như thế nào phù hợp khác nhau của RDMS về việc này.

1

Bạn đang làm việc với loại dữ liệu nào và bạn đang làm việc với bao nhiêu dữ liệu?

Tôi sẽ gắn bó với các bảng tạm thời - đối với các tập dữ liệu lớn, tôi luôn tìm thấy nó là một cách tốt nhất để đi, và không chỉ trong SQL Server. Bạn có thể thử một bảng tạm thời toàn cục (CREATE TABLE ## tablename), nó không chỉ nằm trong phạm vi của câu lệnh create.

Từ SQL Server Books Online (2005):

Nếu bạn tạo bảng tạm thời ## nhân viên toàn cầu, bất kỳ người dùng trong cơ sở dữ liệu thể làm việc với bảng này. Nếu không có người dùng nào khác làm việc với bảng này sau khi bạn tạo bảng, bảng sẽ bị xóa khi bạn ngắt kết nối. Nếu một người dùng khác làm việc với bảng sau khi bạn tạo, SQL Server xóa nó sau khi bạn ngắt kết nối và sau khi tất cả các phiên khác không còn là chủ động sử dụng nó.

1

Một điều cần xem xét là liệu bạn có thể dựa vào chỉ một người dùng đang chạy proc này tại một thời điểm hay không. Nếu bạn có người dùng đồng thời, thì tùy chọn bảng thông thường có thể có nhiễu. Bảng tạm thời có thể là duy nhất cho người dùng.

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