Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL 2005 - Заявките на свързания сървър към Oracle са изключително бавни

В първия ви пример, използвайки нотация "точка", се използва механизмът на клиентския курсор и повечето неща се оценяват локално. Ако избирате от голяма таблица и използвате клауза WHERE, записите ще бъдат изтеглени локално от отдалечената база данни. След като данните бъдат изтеглени през свързания сървър, само тогава клаузата WHERE се прилага локално. Често тази последователност е хит в изпълнението. Индексите на отдалечената база данни са основно безполезни.

Като алтернатива, когато използвате OPENQUERY, SQL Server изпраща sql израза към целевата база данни за обработка. По време на обработката всички индекси на таблиците се използват. Също така клаузата where се прилага от страна на Oracle, преди да изпрати набора от резултати обратно към SQL Server.

Според моя опит, с изключение на най-простите заявки, OPENQUERY ще ви даде по-добра производителност.

Бих препоръчал да използвате OpenQuery за всичко поради горните причини.

Една от болните точки при използване на OpenQuery, която може би вече сте срещали, са единичните кавички. Ако sql низът, който се изпраща към отдалечената база данни, изисква единични кавички около низ или дата, те трябва да бъдат екранирани. В противен случай те неволно прекратяват sql низа.

Ето един шаблон, който използвам винаги, когато работя с променливи в оператор за отворена заявка към свързан сървър, за да се погрижа за проблема с единичните кавички:

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. Как да генерирам име на таблица по дата и час?

  2. Вземете последните 30 дни записи от днешна дата в SQL Server

  3. T-SQL заявка с множество отговори

  4. SQL GROUP BY CASE оператор с агрегатна функция

  5. Не използвайте sp_depends в SQL Server (оттеглен е)