【发布时间】:2013-04-11 12:59:26
【问题描述】:
我在使用 ODP.Net 中的 OracleDataReader 时遇到了很多问题。基本上,我有一个参数化查询,它需要 1-5 秒才能运行(返回大约 450 条记录),然后需要 60-90 秒循环(甚至没有代码在循环中运行,字面上迭代记录集并执行什么都没有)。
当我从 Aqua Data Studio 运行它时,它需要 1-5 秒。 当我从 .Net 运行它时, cmd.ExecuteReader() 需要 1-5 秒才能返回。 当我使用 OracleDataReader.Read 遍历 450 条记录时,需要 60-90 秒才能完成。
我什至取出了循环中的所有代码,只有一个空白的“While dr.Read”,循环这 450 条记录仍然需要 60 到 90 秒(我使用秒表来获取时间cmd.ExecuteReader 然后围绕空的 dr.Read 循环)。
我尝试设置 FetchSize,但没有帮助(而且,我的测试用例中只有 450 条记录)。 我试过用连接字符串关闭自动调整,它进一步降低了性能。
当返回少量数据时,为什么 OracleDataReader.Read 需要这么长时间(而其他工具在很短的时间内为相同的查询返回相同的数据)?
Using conn As New Oracle.DataAccess.Client.OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings("oracle_dss").ConnectionString)
conn.Open()
Using cmd As OracleCommand = conn.CreateCommand
cmd.BindByName = True
cmd.CommandText = "" ' removed SQL to make this more readable
' Month end
Dim paramMonthEndDate As OracleParameter = cmd.CreateParameter
paramMonthEndDate.ParameterName = ":month_end_date"
paramMonthEndDate.DbType = DbType.Date
paramMonthEndDate.Value = monthEnd
cmd.Parameters.Add(paramMonthEndDate)
Dim sw As New System.Diagnostics.Stopwatch
sw.Start()
cmd.FetchSize = 1000
Dim dr As OracleDataReader = cmd.ExecuteReader
dr.FetchSize = dr.RowSize * 1000
sw.Stop()
Me.Log(String.Format("Month End Query: {0}s", sw.ElapsedMilliseconds / 1000))
sw.Reset()
sw.Start()
While dr.Read
End While
sw.Stop()
Me.Log(String.Format("Month End Query through recordset: {0}s", sw.ElapsedMilliseconds / 1000))
dr.Close()
End Using
conn.Close()
End Using
【问题讨论】:
-
你能显示你的代码吗..也许你正在做一些打开和关闭连接的事情,基本上往返太多了,但如果没有看到任何现有代码就无法判断。您是否还查看了查询是否为
Hitting the Indexes(如果您正在查询的表上有) -
让我得到我的代码,我会更新问题。它已编入索引.. 它在 Aqua Data Studio(第三方查询实用程序)中运行完成,所有结果在几秒钟内返回。我认为如果索引不起作用,那也将是相当慢的。
-
您确定服务器响应时间吗? oracle配置也可能有问题。
-
SQL 数据读取器更快,但差别很大。
-
我已经用秒表计时了 .Net 代码的每一行,并且我刚刚读取了第 3 方实用程序的执行时间(然后滚动它的数据网格以验证所有数据在那里)。
标签: .net vb.net oracle odp.net