2012-04-11 30 views
6

Nếu tôi có một câu lệnh chọn với hàm vô hướng trong nó được sử dụng trong các phép tính khác nhau, được gọi nhiều lần? Nếu có, có cách nào để tối ưu hóa điều này vì vậy nó chỉ gọi funciton một lần cho mỗi lựa chọn, như trong truy vấn thực sự của tôi, nó sẽ được gọi là hàng ngàn lần, X 6 lần cho mỗi lựa chọn.Không gọi hàm vô hướng trong câu lệnh chọn nhiều lần chạy hàm nhiều lần, và cách lấy xung quanh nếu có

Ví dụ:

SELECT 
[dbo].[fn_Days](@Account) + u.[DayRate], 
[dbo].[fn_Days](@Account)/u.[WorkDays] 
FROM [dbo].[tblUnit] u 

Tất cả fn_days làm là trả lại một int ngày làm việc.

+0

Tôi nhận ra rằng nó chạy cho mọi hàng, nhưng vì nó được chạy 2 lần trong cùng hàng, tôi có thể sử dụng cùng một giá trị như vậy vì vậy tôi không phải chạy nó nhiều lần mỗi hàng? – mameesh

+0

Nhận thấy rằng ngay khi bạn đăng bình luận của mình. Nó có thể, về mặt lý thuyết, lưu trữ giá trị, nhưng tôi nghi ngờ nó. Một cách thô lỗ để tìm ra nó có thể là tạo ra một hàm mà cố ý mất một thời gian dài để chạy và sau đó gọi nó là truy vấn và hai lần trong một truy vấn và so sánh thời gian chạy. – Corbin

+0

Xem kế hoạch truy vấn là gì nếu tham gia vào một tập hợp đã có kết quả của hàm làm cột. –

Trả lời

10

Có vô hướng được gọi nhiều lần theo cách bạn đã mã hóa nó. Một cách để làm cho nó hoạt sẽ được quấn nó vào một subquery như thế này: fn_Days

SELECT t.[days] + t.[DayRate], 
     t.[days]/t.[WorkDays] 
FROM (
    SELECT 
    [dbo].[fn_Days](@Account) as days, 
    u.[DayRate], 
    u.[WorkDays] 
    FROM [dbo].[tblUnit] u) as t 

Bằng cách này chỉ được gọi một lần cho mỗi hàng, chứ không phải hai lần, hoặc sáu lần như bạn đề cập.

Hy vọng điều này sẽ hữu ích.

2

Các hàm là xác định nghĩa là nó sẽ luôn trả về cùng một giá trị cho một tham số nhất định. Bạn đang sử dụng một biến làm tham số để bạn có thể gọi hàm một lần trước khi thực hiện truy vấn và sử dụng kết quả trong truy vấn thay vì gọi hàm.

DECLARE @Days int 
SET @Days = [dbo].[fn_Days](@Account) 

SELECT 
    @Days + u.[DayRate], 
    @Days/u.[WorkDays] 
FROM [dbo].[tblUnit] u 
Các vấn đề liên quan