为什么数据表的加载方法有时会这么慢?

时间:2011-06-27 15:06:10

标签: vb.net performance oracle datatable decode

该项目是ASP / VB.net中的Web应用程序。问题是有些页面令人费解。在尝试追踪瓶颈之后,在使用查询结果填充数据表时,发现它是加载方法。

我们正在使用Oracle数据库,并且在存储过程中执行查询。作为一个例子,我们在一个过程中有一个相对简单的select语句,它返回2列6行,确定需要大约0.015秒才能执行。但是,将OracleDataReader加载到数据表中平均需要7秒钟 - 对于如此小的记录集来说,这是一段荒谬的时间。在搞乱查询之后,我发现一个简单的解码语句似乎导致了这个问题。 decode语句的用法类似如下:

WHERE     iDate1和iDate2之间的DECODE(iBln,1,column1,column2)

iBln变量只是一个传入的数字,用作布尔变量,用于确定哪个列应该在两个日期之间。如果我将这个解码语句注释掉并简单地将它命名为“column1 BETWEEN iDate1和iDate2”,那么load方法根本就没有时间,表明它确实是导致问题的解码语句。

所以我只是希望听到任何人可以知道是什么导致这个或如何解决它。这是一个简单的解码,它甚至如何影响负载方法?

2 个答案:

答案 0 :(得分:4)

我将验证column1和column2是否存在索引。如果是这样,可能的问题是DECODE阻止了索引的使用。尝试重写为:

WHERE ( ( iBin = 1 AND column1 BETWEEN iDate1 AND iDate2)
        OR
        ( (iBin IS NULL OR iBin <> 1) AND column2 BETWEEN iDate1 AND iDate2)
      )

答案 1 :(得分:3)

如果存储过程返回REF CURSOR,则无论您正在执行哪个查询,打开存储过程中的光标都会非常快。打开游标不需要Oracle执行任何实际运行查询的工作,它只需要Oracle确定应该或多或少是瞬时的查询计划。

在SQL * Plus之类的东西中从REF CURSOR获取数据需要多长时间?如果它需要接近7秒(我怀疑它会),你可以消除OracleDataReader类作为问题的根源。在这种情况下,问题几乎肯定是查询计划效率低下。

根据您的描述,我的猜测是column1被编入索引。 column2也可能被编入索引,目前尚不清楚。但是column1column2上的常规索引不能用于评估涉及DECODE函数调用的谓词。如果索引列上没有其他谓词,则可能会强制Oracle对基础表执行表扫描(发布完整查询,表定义和查询计划会很有帮助)。