PHP+;Oracle软解析动态排序查询

PHP+;Oracle软解析动态排序查询,php,sql,oracle,oracle11g,Php,Sql,Oracle,Oracle11g,我有一个与Oracle 11g数据库有OCI连接的php站点。我在所有查询中绑定变量,这样它们就不必进行硬解析,从而大大提高了性能。 但假设我希望能够通过单击页面上的按钮来动态排序输出。 据我所知,我无法在oracle查询中将变量绑定到Order By cause,因此我可以在PHP中构建一个if语句,并根据单击的Order By按钮分配$orderby变量。 但我的理解是,每当ORDERBY子句发生更改时,都需要进行硬解析,并且我的语句运行缓慢。我能做些什么来帮助你?请帮忙 这是我的疑问之一:

我有一个与Oracle 11g数据库有OCI连接的php站点。我在所有查询中绑定变量,这样它们就不必进行硬解析,从而大大提高了性能。 但假设我希望能够通过单击页面上的按钮来动态排序输出。 据我所知,我无法在oracle查询中将变量绑定到Order By cause,因此我可以在PHP中构建一个if语句,并根据单击的Order By按钮分配$orderby变量。 但我的理解是,每当ORDERBY子句发生更改时,都需要进行硬解析,并且我的语句运行缓慢。我能做些什么来帮助你?请帮忙

这是我的疑问之一:

SELECT * FROM V_SOPI_PURCHASE_ORDER
WHERE CONTRACTOR = :CONTRACTORNAME
这可以是我的if伪代码:

if (clicked search by contractor) {
$orderby = "ORDER BY CONTRACTOR";
}
elseif (clicked search by customer) {
$orderby = "ORDER BY CUSTOMER";
}
等等

提前谢谢你!
Maksim

您有两个不同的查询。。如果使用prepared语句,解析只会发生2次。。你无法避免。。问题只在于查询字符串中使用的运行时值。当您使用绑定变量时,一切都很好!从未使用过Oracle,它可能是这样的:
ORDER BY CASE:ORDER_列当“CONTRACTOR”时,然后CONTRACTOR当“CUSTOMER”时,然后CUSTOMER END,但这可能远远不能提高性能…Maheswaran,你确定吗?所以基本上我的性能不会受到太大的影响?Maheswaran,我刚刚做了一个测试,不太好,一旦我改变顺序,它就会重新进行艰难的解析。例如,我第一次运行查询,大约需要20秒才能完成(硬解析)。然后我再次运行它(需要0.6秒-软解析)。更改订单,再次运行20分钟seconds@MaxKay-作为硬解析的惩罚,这种差异似乎不太合理(特别是假设您没有在负载较重的实时生产系统上进行实验)。除非真的出了问题,否则硬解析不会花费19秒。您确定没有描述第二次运行查询时缓存数据的效果吗?