sql >> Database >  >> RDS >> Sqlserver

SQL 2005 - Gekoppelde server aan Oracle-query's extreem traag

In uw eerste voorbeeld met behulp van "dot"-notatie, wordt de client-cursor-engine gebruikt en worden de meeste dingen lokaal geëvalueerd. Als u uit een grote tabel selecteert en een WHERE-component gebruikt, worden de records lokaal opgehaald uit de externe db. Zodra de gegevens over de gekoppelde server zijn getrokken, wordt alleen de WHERE-clausule lokaal toegepast. Vaak is deze reeks een prestatiehit. Indexen op de externe db worden in principe onbruikbaar gemaakt.

Als u OPENQUERY gebruikt, verzendt SQL Server de sql-instructie ook naar de doeldatabase voor verwerking. Tijdens de verwerking worden eventuele indexen op de tabellen gebruikt. Ook wordt de where-clausule aan de Oracle-kant toegepast voordat de resultatenset naar SQL Server wordt teruggestuurd.

In mijn ervaring zal OPENQUERY, behalve voor de eenvoudigste vragen, betere prestaties leveren.

Ik zou aanraden om OpenQuery voor alles te gebruiken om de bovenstaande redenen.

Een van de pijnpunten bij het gebruik van OpenQuery die u mogelijk al bent tegengekomen, zijn enkele aanhalingstekens. Als de sql-tekenreeks die naar de externe database wordt verzonden, enkele aanhalingstekens rond een tekenreeks of datumdatum vereist, moeten deze worden geëscaped. Anders beëindigen ze per ongeluk de sql-tekenreeks.

Hier is een sjabloon die ik gebruik wanneer ik te maken heb met variabelen in een openquery-instructie naar een gekoppelde server om het probleem met enkele aanhalingstekens op te lossen:

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. Hoe 'hebben' te gebruiken met pagina in de kolom van de relatie in laravel 5

  2. Hoe alle rijen van alle tabellen in mysql leeg te maken (in sql)

  3. Verkrijg de aanmaakdatum van de database op PostgreSQL

  4. Symfony3 - SQLSTATE [HY000] [2002] Geen dergelijk bestand of map