Hiệu suất INSERT giữa bảng tạm thời và biến bảng


12

Tôi có một vấn đề sau trong SQL Server 2005: cố gắng chèn một số hàng vào một biến bảng mất rất nhiều thời gian so với cùng một tệp chèn bằng bảng tạm thời.

Đây là mã để chèn vào biến bảng

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

Đây là mã để chèn vào bảng tạm thời

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

Bảng tạm thời không có bất kỳ khóa hoặc chỉ mục nào, phần chọn giống nhau giữa 2 truy vấn và số kết quả được trả về bởi lựa chọn là ~ 10000 hàng. Thời gian cần thiết để thực hiện chọn một mình là ~ 10 giây.

Phiên bản bảng tạm thời mất tới 10 giây để thực thi, tôi đã phải dừng phiên bản biến bảng sau 5 phút.

Tôi phải sử dụng biến bảng vì truy vấn là một phần của hàm giá trị bảng, không cho phép truy cập vào bảng tạm thời.

Kế hoạch thực hiện cho phiên bản biến bảng Kế hoạch thực hiện

Kế hoạch thực hiện cho phiên bản bảng tạm thời Kế hoạch thực hiện

Câu trả lời:


8

Sự khác biệt rõ ràng giữa hai kế hoạch là kế hoạch nhanh song song và kế hoạch chậm hơn.

Đây là một trong những hạn chế của các kế hoạch chèn vào các biến bảng. Như đã đề cập trong các bình luận (và dường như nó có hiệu quả mong muốn) bạn có thể thử làm

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

để xem nếu điều đó được xung quanh giới hạn.


Đó là một gợi ý tuyệt vời, mặc dù tôi mặc dù bạn không thể sử dụng EXECchức năng .... đoán tôi đã sai
Lamak

1
@Lamak - Đừng! Bạn không thể làm việc này cho OP. Invalid use of a side-effecting operator 'INSERT EXEC' within a function.. Công OPENQUERYviệc xung quanh có thể làm việc mặc dù.
Martin Smith

À, thật tốt khi biết, cảm ơn vì đã làm rõ
Lamak

2
Theo nguyên tắc chung, bạn không muốn sử dụng các biến của bảng nếu bạn muốn nhận được một dữ liệu lớn được trả về. Bảng Temp thường là trường hợp inthis nhanh hơn.
HLGEM

1
@munissor, sau đó không sử dụng hàm có giá trị bảng. Nếu bạn muốn tư vấn tốt hơn đăng chính xác những gì bạn đang làm.
HLGEM

-1

Biến bảng đôi khi chậm hơn vì không có số liệu thống kê về biến bảng và do đó trình tối ưu hóa luôn giả định chỉ có một bản ghi.

Tuy nhiên tôi không thể đảm bảo rằng đây là trường hợp ở đây, bạn sẽ phải xem thông tin "các hàng ước tính" trong kế hoạch truy vấn cho biến bảng.


Làm thế nào điều đó sẽ ảnh hưởng đến một chèn vào một biến bảng?
Martin Smith

Đó là những gì dường như đang diễn ra, vì bạn có thể thấy rằng không chỉ có sự khác biệt giữa song song và nối tiếp mà còn giữa các hàm băm và vòng lặp lồng nhau, rõ ràng trình tối ưu hóa giả định rằng vì biến bảng giữ một bản ghi trong tâm trí nên kết quả của truy vấn cũng sẽ là một bản ghi, một lần nữa cách duy nhất để chứng minh nó là xem các số liệu thống kê thực tế cho từng phần của truy vấn, nhưng thực tế là tất cả các truy vấn liên quan đến các biến của bảng đều kết hợp với phép nối vòng và xử lý nối tiếp, vì vậy tôi nghĩ thật công bằng khi nghi ngờ nó ở đây
yoel halb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.