Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL 2005 — Wyjątkowo powolne zapytania dotyczące serwera połączonego z Oracle

W pierwszym przykładzie z notacją "kropkową" używany jest silnik kursora klienta i większość rzeczy jest oceniana lokalnie. Jeśli wybierasz z dużej tabeli i używasz klauzuli WHERE, rekordy zostaną ściągnięte lokalnie ze zdalnej bazy danych. Gdy dane zostaną ściągnięte przez połączony serwer, tylko wtedy klauzula WHERE jest stosowana lokalnie. Często ta sekwencja jest hitem wydajności. Indeksy w zdalnej bazie danych są w zasadzie bezużyteczne.

Alternatywnie, gdy używasz OPENQUERY, SQL Server wysyła instrukcję sql do docelowej bazy danych w celu przetworzenia. Podczas przetwarzania wszelkie indeksy w tabelach są lewarowane. Również klauzula where jest stosowana po stronie Oracle przed wysłaniem zestawu wyników z powrotem do SQL Server.

Z mojego doświadczenia wynika, że ​​oprócz najprostszych zapytań, OPENQUERY zapewni lepszą wydajność.

Polecam używać OpenQuery do wszystkiego z powyższych powodów.

Jednym z problemów podczas korzystania z OpenQuery, z którym już się zetknąłeś, są pojedyncze cudzysłowy. Jeśli ciąg sql wysyłany do zdalnej bazy danych wymaga pojedynczych cudzysłowów wokół ciągu lub daty daty, należy je zmienić. W przeciwnym razie nieumyślnie kończą ciąg sql.

Oto szablon, którego używam za każdym razem, gdy mam do czynienia ze zmiennymi w instrukcji openquery do połączonego serwera, aby rozwiązać problem pojedynczego cudzysłowu:

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. Przyznaj wybór w widoku, który nie jest tabelą podstawową, gdy tabela podstawowa znajduje się w innej bazie danych

  2. Pobieranie relacji SQL jako ciągu rozdzielanego przecinkami

  3. Znajdź całkowity czas przepracowany z wieloma zadaniami / zamówieniami z nakładającymi się / nakładającymi się czasami dla każdego pracownika i zadania / zamówienia

  4. Odmowa uprawnienia EXECUTE do typów tabel zdefiniowanych przez użytkownika?

  5. Jak zignorować parametr w procedurze składowanej, jeśli jego wartość to null?