4
votes

We have a linked server (OraOLEDB.Oracle) defined in the SQL Server environment. Oracle 12c, SQL Server 2016. There is also an Oracle client (64 bit) installed on SQL Server.

When retrieving data from Oracle (a simple query, getting all columns from a 3M row, fairly narrow table, with varchars, dates and integers), we are seeing the following performance numbers:

sqlplus: select from Oracle > OS File on the SQL Server itself less than 2k rows/sec

SSMS: insert into a SQL Server table select from Oracle using OpenQuery (passthrough to Oracle, so remote execution) less than 2k rows/sec

SQL Export/Import tool (in essence, SSIS): insert into a SQL Server table, using the OLEDB Oracle for source and OLEDB SQL Server for target over 30k rows/second

Looking for ways to improve throughput using OpenQuery/OpenResultSet, to match SSIS throughput. There is probably some buffer/flag somewhere that allows to achieve the same?

Please advise...

Thank you!

--Alex

2
It is normal that SSIS is faster then INSERT queries since it uses BULK INSERT, you must try to minimize logging during INSERT to improve the performance.Yahfoufi

2 Answers

0
votes

There is probably some buffer/flag somewhere that allows to achieve the same?

Probably looking for the FetchSize parameter

FetchSize - specifies the number of rows the provider will fetch at a time (fetch array). It must be set on the basis of data size and the response time of the network. If the value is set too high, then this could result in more wait time during the execution of the query. If the value is set too low, then this could result in many more round trips to the database. Valid values are 1 to 429,496, and 296. The default is 100.

eg

exec sp_addlinkedserver N'MyOracle', 'Oracle', 'ORAOLEDB.Oracle', N'//172.16.8.119/xe', N'FetchSize=2000', ''

See, eg https://blogs.msdn.microsoft.com/dbrowne/2013/10/02/creating-a-linked-server-for-oracle-in-64bit-sql-server/

0
votes

I think there are many way to enhance the performance on the INSERT query, I suggest reading the following article to get more information about data loading performance.

There are one method you can try which is minimizing the logging by using clustered index. check the link below for more information: