Oracle.DataAccess(ODP.NET)数组绑定最佳块大小

时间:2014-05-27 09:08:36

标签: oracle odp.net

使用数组绑定插入大量数据时,有没有办法计算最佳块大小?

1 个答案:

答案 0 :(得分:0)

我这样做:当我的应用程序第一次调用此函数时运行命令时:

Public Function GetRowSize(ByVal cmd As OracleCommand) As Integer
  Dim dr As OracleDataReader
  dr = cmd.ExecuteReader()
  Return CInt(dr.GetType.GetField("m_rowSize", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic).GetValue(dr))
End Function

结果我存储在一个类变量中以供进一步使用。 它执行如下:

Dim cmd As OracleCommand
Dim da As OracleDataAdapter, dt As New DataTable
Dim expectedNumberOfRows As Integer

cmd = New OracleCommand("BEGIN :res := GetData(:expectedRows); END;"), server.con)
cmd.Parameters.Add("res", OracleDbType.RefCursor, ParameterDirection.ReturnValue)
cmd.Parameters.Add("expectedRows", OracleDbType.Int32, ParameterDirection.Output)
cmd.Parameters("expectedRows").DbType = DbType.Int32

If rowSize = 0 Then rowSizes = GetRowSize(cmd)
cmd.ExecuteNonQuery()
expectedNumberOfRows = CInt(cmd.Parameters("expectedRows").Value)
cmd.FetchSize = rowSize * expectedNumberOfRows
da = New OracleDataAdapter(cmd)
da.Fill(dt)

在我的PL / SQL中,我运行EXPLAIN PLAN以获得估计的行数,它看起来像这样:

FUNCTION GetData(estimatedRows OUT NUMBER) RETURN SYS_REFCURSOR IS
res SYS_REFCURSOR;
BEGIN

    OPEN res FOR SELECT * FROM MY_TABLE;

    DELETE FROM PLAN_TABLE;
    EXECUTE IMMEDIATE 'EXPLAIN PLAN FOR SELECT * FROM MY_TABLE';
    SELECT CARDINALITY
    INTO estimatedRows
    FROM PLAN_TABLE
    WHERE ID = 0;

    RETURN res;

END;