Trong ví dụ đầu tiên của bạn sử dụng ký hiệu "dấu chấm", công cụ con trỏ máy khách được sử dụng và hầu hết mọi thứ được đánh giá cục bộ. Nếu bạn đang chọn từ một bảng lớn và sử dụng mệnh đề WHERE, các bản ghi sẽ được kéo xuống cục bộ từ db từ xa. Khi dữ liệu đã được kéo qua máy chủ được liên kết, chỉ khi đó mệnh đề WHERE mới được áp dụng cục bộ. Thường thì chuỗi này là một lần đánh hiệu suất. Các chỉ mục trên db từ xa về cơ bản là vô dụng.
Ngoài ra, khi bạn sử dụng OPENQUERY, SQL Server sẽ gửi câu lệnh sql đến cơ sở dữ liệu đích để xử lý. Trong quá trình xử lý bất kỳ chỉ mục nào trên bảng đều được sử dụng. Ngoài ra, mệnh đề where được áp dụng ở phía Oracle trước khi gửi tập hợp kết quả trở lại SQL Server.
Theo kinh nghiệm của tôi, ngoại trừ những truy vấn đơn giản nhất, OPENQUERY sẽ mang lại cho bạn hiệu suất tốt hơn.
Tôi khuyên bạn nên sử dụng OpenQuery cho mọi thứ vì những lý do trên.
Một trong những điểm khó khăn khi sử dụng OpenQuery mà bạn có thể đã gặp phải là dấu ngoặc kép. Nếu chuỗi sql được gửi đến db từ xa yêu cầu các dấu ngoặc kép xung quanh chuỗi hoặc ngày tháng thì chúng cần được thoát ra. Nếu không, chúng sẽ vô tình chấm dứt chuỗi sql.
Đây là một mẫu mà tôi sử dụng bất cứ khi nào tôi xử lý các biến trong một câu lệnh truy vấn mở tới một máy chủ được liên kết để giải quyết vấn đề trích dẫn đơn lẻ:
DECLARE @UniqueId int
, @sql varchar(500)
, @linkedserver varchar(30)
, @statement varchar(600)
SET @UniqueId = 2
SET @linkedserver = 'LINKSERV'
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL'
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '
SET @Statement = @Statement + '''' + @SQL + ''')'
EXEC(@Statement)