Plsql 动态查询和缓存

Plsql 动态查询和缓存,plsql,oracle11g,Plsql,Oracle11g,我有两套习题。我更愿意寻找的是一个结合两者的解决方案 问题1:我有一张20行的桌子。我从另一个表(比如表2)中读取了150000行。对于从表2中读取的每一行,我必须将其与表1中不匹配整行、几列的特定行进行匹配。比如,如果table2.col1=table1.col&&table2.col2=table1.col2等等,有没有一种方法可以缓存表1,这样我就不必一次又一次地查询它 问题2:我想动态生成查询字符串,即,如果参数2为null,则不要将其放入where子句中。现在剩下的唯一选项是使用imm

我有两套习题。我更愿意寻找的是一个结合两者的解决方案

问题1:我有一张20行的桌子。我从另一个表(比如表2)中读取了150000行。对于从表2中读取的每一行,我必须将其与表1中不匹配整行、几列的特定行进行匹配。比如,如果table2.col1=table1.col&&table2.col2=table1.col2等等,有没有一种方法可以缓存表1,这样我就不必一次又一次地查询它

问题2:我想动态生成查询字符串,即,如果参数2为null,则不要将其放入where子句中。现在剩下的唯一选项是使用immidate执行,这将非常慢


现在我要问的是,如何使用动态查询将其与表1进行比较?有什么想法吗

对于问题1,您只需加入表即可。如果有一个equijoin,一个表很小,另一个表很大,那么很可能会得到一个哈希连接。这是一种有效的缓存机制,只要哈希表适合内存,读取表和执行连接的总成本仅略高于读取表的总成本


如果查询是通过execute immediate构造和运行的,则没有什么区别-RDBMS哈希连接仍将充当有效缓存。

对于问题1,如注释中所述,让数据库处理它。这就是它真正擅长的地方。如果它经常被命中,那么如果缓冲区缓存的大小适当,那么表的块应该保留在数据库缓冲区缓存中。DBA调优的一部分是确定适当的大小,将表固定到keep池中,等等,但可能不需要担心

如果只是希望简化查询的编写而不是性能,那么视图或存储的过程可以简化连接的重复使用

对于问题2,以下格式的查询可能适合您:

SELECT id, val
  FROM myTable
  WHERE filter = COALESCE(v_filter, filter)

如果输入参数v_filter为null,则只需自动匹配现有列即可。这假设现有筛选器列本身永远不会为null,因为不能使用=进行null比较。此外,它还假设WHERE子句中还有其他索引部分,因为像COALESCE这样的函数无法利用索引。

您想得太多了。您应该让数据库、操作系统和文件系统为您完成这项工作。这是他们设计的目的,所以你想出的任何东西都远远不如他们。一切都是。。。让它这样做。嗯,那么这个小表会被oracle自动缓存吗?是的@EmAe,会的。当然,这取决于数据库中的数据量,但Oracle将为您提供相当数量的缓存。只需尝试运行相同的查询两次。第二次会快得多。假设我想做一个select语句。i、 例如,从表2中选择*,其中col1=col1\u val和col2=col2\u val。。。现在有可能taht col2_val为null,所以在这里添加它没有意义,所以我想从表1中选择*其中col1=col1_val,也就是说,它是一个动态查询。它可以通过执行立即命令来执行