sql >> Database teknologi >  >> RDS >> Sqlserver

SQL 2005 - Linket server til Oracle-forespørgsler ekstremt langsom

I dit første eksempel med "dot"-notation bruges klientmarkørmotoren, og det meste bliver evalueret lokalt. Hvis du vælger fra en stor tabel og bruger en WHERE-klausul, vil posterne blive trukket ned lokalt fra den eksterne db. Når først dataene er blevet trukket på tværs af den sammenkædede server, er WHERE-sætningen først anvendt lokalt. Ofte er denne sekvens et præstationshit. Indekser på den eksterne db er dybest set gjort ubrugelige.

Når du bruger OPENQUERY, sender SQL Server sql-sætningen til måldatabasen til behandling. Under behandlingen bliver eventuelle indekser på tabellerne udnyttet. Også where-klausulen anvendes på Oracle-siden, før resultatsættet sendes tilbage til SQL Server.

Efter min erfaring, bortset fra de enkleste forespørgsler, vil OPENQUERY give dig bedre ydeevne.

Jeg vil anbefale at bruge OpenQuery til alt af ovenstående grunde.

Et af smertepunkterne ved brug af OpenQuery, som du måske allerede er stødt på, er enkelte anførselstegn. Hvis sql-strengen, der sendes til den eksterne db, kræver enkelte anførselstegn omkring en streng eller dato, skal de escapes. Ellers afslutter de utilsigtet sql-strengen.

Her er en skabelon, som jeg bruger, når jeg beskæftiger mig med variabler i en openquery-sætning til en forbundet server for at tage mig af problemet med enkelt citat:

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. SQL Server svarende til Oracle MINDST?

  2. Hvordan henter man værdier gemt i JSON-array i selve MySQL-forespørgslen?

  3. Hvordan får jeg det første ubrugte ID i tabellen?

  4. Givet år, måned, dag og ugenummer, hvordan finder man datoen? (Sql Server 2005 Set baseret)