超时使用ODBC而不是Openquery到链接服务器

时间:2015-04-29 01:20:15

标签: c# sql-server odbc openquery

我通过链接服务器连接到外部数据库。我在C#中使用多线程控制台程序来分解这个SELECT语句。

SELECT * 
FROM (
    SELECT 
        C.Part_Key,
        C.Part_Operation_Key,
        C.Net_Weight,
        C.Plexus_Customer_No,
        C.Serial_No,
        ROW_NUMBER() OVER (ORDER BY C.Serial_No) AS row 
    FROM Part_v_Container AS C
) a
 WHERE a.row > 0 AND a.row <= 1000000

它就像一个魅力,当我得到10个线程,每个抓取100000条记录时,它将时间从8分钟缩短到1分钟。但在测试过程中,我只用了一个线程来获得整个1000000的记录。基本代码如下:

try
{
    adapter = new OdbcDataAdapter(sqlStatement, connection);
    DataTable dataTable = new DataTable();
    adapter.Fill(dataTable);
    TimeSpan span = (timerStart - DateTime.Now);
    Console.WriteLine("Data collected for thread " + threadNumber + " in the time of " + span);
    timeTest(span);
    Console.WriteLine("Rows collected = " + dataTable.Rows.Count);
    retries = 0;
    dataCollected = true;
}

它再次起作用,所以它不是真正的问题。问题是当我尝试获取整个1000000记录时,我不断从plex获得超时错误:

  

从线程编号为0的数据库中提取数据时出现问题               错误消息如下所示:System.Data.Odbc.OdbcException(0x80131937):ERROR [HYT00] [Plex] [ODBC ODBC报告数据源   驱动程序] [OpenAccess SDK SQL Engine]查询超时已到期[10246] at   System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle,   RetCode retcode)at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   behavior,String方法,Boolean needReader,Object [] methodArguments,   SQL_API odbcApiMethod)at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   behavior,String方法,Boolean needReader)at   System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
  在System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior   行为)   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior   在System.Data.Common.DbDataAdapter.FillInternal(DataSet。)的行为)   dataset,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,   字符串srcTable,IDbCommand命令,CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables,Int32   startRecord,Int32 maxRecords,IDbCommand命令,CommandBehavior   在System.Data.Common.DbDataAdapter.Fill(DataTable   dataTable)at   ShippedContainerSettlement.DataCollectionThread.dataCollectionThread()   在   C:\ Users \用户DKB \源\工作区\工作区\ Danrex \ ShippedContainerSettlement \ ShippedContainerSettlement \ DataCollectionThread.cs:线   39               和sqlQuery是:               SELECT * FROM(SELECT C.Part_Key,C.Part_Operation_Key,C.Net_Weight,C.Plexus_Customer_No,C.Serial_No,               ROW_NUMBER()OVER(由C.Serial_No订购)AS行               FROM Part_v_Container AS C)a WHERE a.row&gt; 0和a.row&lt; = 1005066

如果我使用openquery在SQL管理工作室中运行相同的查询,尽管它可以收集整个1000000条记录。

我不知道为什么,因为我对数据库知之甚少,所以我希望有人可以解释为什么会出现这种情况?

编辑: 这可能是我在forum上找到的答案。

在服务器上执行Openquery,它可以更快地处理行,并且只通过网络返回一行。在visual studio中执行此操作可能会获取完整的结果集,然后在接收(客户端)服务器上对其进行过滤。这可能是它与视觉工作室而不是SSMS超时的原因。

似乎合理吗?

我刚刚在c#中测试了一个openquery,即使对于有3000条记录的表也会超时。所以真的不确定发生了什么。

0 个答案:

没有答案