Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL 2005 - Máy chủ được liên kết với các truy vấn Oracle Cực kỳ chậm

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) 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nối các chuỗi trong SQL Server với CONCAT ()

  2. nối một cột trong TSQL

  3. Không thể bắt đầu một giao dịch phân tán

  4. Tôi có thể lấy tên của tất cả các bảng của cơ sở dữ liệu SQL Server trong ứng dụng C # không?

  5. 3 cách để có được ngày đầu tiên của tháng trong SQL Server