我通过链接服务器连接到外部数据库。我在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条记录的表也会超时。所以真的不确定发生了什么。