该项目是ASP/VB.net中的一个Web应用程序。问题在于,有些页面非常缓慢。在尝试追查瓶颈后,发现它是用查询结果填充数据表时的加载方法。为什么datatable的加载方法有时非常慢?
我们正在使用Oracle数据库,并在存储过程中执行查询。作为一个例子,我们在一个过程中有一个相对简单的select语句,该过程返回2列6行,这被确定需要大约0.015秒来执行。但是,平均需要7秒才能将OracleDataReader加载到数据表中 - 对于这样一个小记录集来说,这是一个荒谬的时间。在查询之后,我发现一个简单的解码语句似乎导致了这个问题。译码语句用于类似于如下:
WHERE DECODE(iBln,1,列1,列2)BETWEEN iDate1和iDate2
的iBln变量被简单地传递在一个号码,作为一个布尔变量用于确定哪个列应该在两个日期之间。如果我注释这个解码语句,并简单地将其设置为“column1 BETWEEN iDate1和iDate2”,那么加载方法根本不需要任何时间,这意味着它确实是导致问题的解码语句。
所以我只是希望听到任何人可以有一个想法是什么导致这个或如何解决它。这是一个简单的解码,它如何影响负载方法呢?
这很棒!我向Justin Cave提出了这个问题,因为我仍然很好奇 - 你知道为什么DECODE会阻止在存储过程中使用查询时使用索引,但是当我运行查询时索引工作得很好本身在查询工具中? – Nick
@ ibar98:当您交互式地执行查询时,是否为'iBin'硬编码了一个值?如果是这样,那可能已经允许解析器将DECODE表达式解析为单个列名称,因此使用索引访问路径。 –
啊是的,我做了硬编码的价值。我只是没有意识到解析器会走这么远来优化查询。感谢所有的帮助! – Nick