Trong hầu hết các trường hợp, tốt nhất nên tránh các hàm có giá trị vô hướng tham chiếu bảng vì (như những người khác đã nói) về cơ bản chúng là hộp đen cần được chạy một lần cho mỗi hàng và không thể được tối ưu hóa bởi công cụ kế hoạch truy vấn. Do đó, chúng có xu hướng chia tỷ lệ tuyến tính ngay cả khi các bảng được liên kết có chỉ mục.
Bạn có thể muốn xem xét sử dụng một hàm giá trị bảng nội tuyến, vì chúng được đánh giá nội tuyến với truy vấn và có thể được tối ưu hóa. Bạn nhận được gói mà bạn muốn, nhưng hiệu suất của việc dán các biểu thức ngay trong câu lệnh select.
Như một tác dụng phụ của việc được nội tuyến, chúng không thể chứa bất kỳ mã thủ tục nào (không khai báo @variable; set @variable =..; return). Tuy nhiên, chúng có thể trả về một số hàng và cột.
Bạn có thể viết lại các hàm của mình như sau:
create function usf_GIS_GET_LAT(
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 lat
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
GO
create function usf_GIS_GET_LON (
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 LON
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
Cú pháp để sử dụng chúng cũng hơi khác một chút:
select
Lat.Lat,
Lon.Lon
from
Address_Location with (nolock)
cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
WHERE
ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)