我有一个似乎很慢的存储过程。
在Oracle SQL Developer中执行
SET TIMING ON;
DECLARE
CUR_OUT UTILS.T_CURSOR;
P_ARTTYID NUMBER;
P_ORDERST VARCHAR2(200);
P_DRUMNO VARCHAR2(200);
P_SHIPPINGNO VARCHAR2(200);
P_DELIVERYDATEFROM DATE;
BEGIN
P_ARTTYID := 2;
P_ORDERST := '3';
P_DRUMNO := '611-480';
P_SHIPPINGNO := NULL;
P_DELIVERYDATEFROM := '2005-01-01';
C_T_ORDER_GETOVERVIEW(
CUR_OUT => CUR_OUT,
P_ARTTYID => P_ARTTYID,
P_ORDERST => P_ORDERST,
P_DRUMNO => P_DRUMNO,
P_SHIPPINGNO => P_SHIPPINGNO,
P_DELIVERYDATEFROM => P_DELIVERYDATEFROM
);
--DBMS_OUTPUT.PUT_LINE('CUR_OUT = ' || CUR_OUT); -- Doesn´t work ;|
END;
给出"语句输出"
anonymous block completed
139ms elapsed
现在的问题是当我从我的VB调用它。. NET应用程序Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader()返回一个System.Data. data . .IDataReader和下面的函数将IDataReader转换为DataSet
Public Shared Function ConvertIDataReaderToDataSet(ByVal reader As IDataReader) As DataSet
Dim schemaTable As DataTable = reader.GetSchemaTable()
Dim dataTable As DataTable = New DataTable
For intCounter As Integer = 0 To schemaTable.Rows.Count - 1
Dim dataRow As DataRow = schemaTable.Rows(intCounter)
Dim columnName As String = CType(dataRow("ColumnName"), String)
Dim column As DataColumn = New DataColumn(columnName, CType(dataRow("DataType"), Type))
dataTable.Columns.Add(column)
Next
Dim dataSet As DataSet = New DataSet
dataSet.Tables.Add(dataTable)
'dataSet.Load(reader, LoadOption.OverwriteChanges, dataTable) ' DEBUG
While reader.Read()
Dim dataRow As DataRow = dataTable.NewRow()
For intCounter As Integer = 0 To reader.FieldCount - 1
dataRow(intCounter) = reader.GetValue(intCounter)
Next
dataTable.Rows.Add(dataRow)
End While
Return dataSet
End Function
调试和遍历函数到"While reader.Read()"行结束。还尝试了使用DataSet.Load()的另一个版本,但结果相同。
在MSDN上发现了这个线程,其他有同样问题的人似乎已经通过添加索引来调整查询来解决了这个问题。
我怎么能继续调查问题,当它看起来像过程工作(响应在~100 - 200ms)和IDataReader.Read()刚刚结束(或继续在后台?)
- 我可以用另一种(更好的)方法来计时吗?
- 可以有任何表或事务锁涉及?
我们非常感谢所有的建议
您在SQL Developer中的测试只是测量打开游标所需的时间。打开游标并不会导致Oracle实际执行查询——直到您从游标中获取数据,并且每次获取数据时,Oracle将继续处理查询以获取下一组行。通常,Oracle不需要在任何时间点执行整个查询。要进行类似的测试,PL/SQL块需要从游标中获取所有数据。就像
DECLARE
CUR_OUT UTILS.T_CURSOR;
P_ARTTYID NUMBER;
P_ORDERST VARCHAR2(200);
P_DRUMNO VARCHAR2(200);
P_SHIPPINGNO VARCHAR2(200);
P_DELIVERYDATEFROM DATE;
BEGIN
P_ARTTYID := 2;
P_ORDERST := '3';
P_DRUMNO := '611-480';
P_SHIPPINGNO := NULL;
P_DELIVERYDATEFROM := '2005-01-01';
C_T_ORDER_GETOVERVIEW(
CUR_OUT => CUR_OUT,
P_ARTTYID => P_ARTTYID,
P_ORDERST => P_ORDERST,
P_DRUMNO => P_DRUMNO,
P_SHIPPINGNO => P_SHIPPINGNO,
P_DELIVERYDATEFROM => P_DELIVERYDATEFROM
);
LOOP
FETCH cur_out
INTO <<list of variables to fetch data into>>;
EXIT WHEN cur_out%notfound;
END LOOP;
--DBMS_OUTPUT.PUT_LINE('CUR_OUT = ' || CUR_OUT); -- Doesn´t work ;|
END;
你是说在你的。net代码中,reader.Read()
行永远不会返回吗?或者你是说你的代码在那个点中止了?