0

我有两个问题集。我最好寻找的是结合两者的解决方案。

问题 1:我有一张可以说 20 行的表格。我正在从其他表(比如表 2)中读取 150,000 行。对于从表 2 读取的每一行,我必须将其与表 1 的特定行匹配(不匹配整行,几列。比如 if table2.col1 = table1.col && table2.col2 = table1.col2)等等。是有一种方法可以缓存表 1,这样我就不必一次又一次地查询它?

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

现在我要问的是如何进行动态查询以将其与表 1 进行比较?有任何想法吗 ?

4

2 回答 2

0

对于问题1,正如评论中提到的,让数据库来处理它。这就是它做得很好的地方。如果它经常被击中,那么如果缓冲区高速缓存的大小适当,则表的块应该保留在数据库缓冲区高速缓存中。DBA 调整的一部分是确定适当的大小,将表固定到“保留”池中,等等。但可能不需要担心。

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

对于问题 2,如下格式的查询可能对您有用:

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

如果输入参数v_filter为空,则自动匹配现有列。这假设现有的过滤器列本身永远不会为空(因为您不能=用于空比较)。此外,它假设子句中还有其他索引部分,WHERE因为类似的函数COALESCE无法利用索引。

于 2013-06-28T02:28:44.670 回答
0

对于问题 1,您只需加入表格。如果有一个等值连接并且一个表很小而另一个很大,那么你很可能会得到一个散列连接。这实际上是一种缓存机制,读取表和执行连接的总成本仅比读取表高一点(只要哈希表适合内存)。

如果查询是通过立即执行构造并运行的,这没有什么区别——RDBMS 散列连接仍将充当有效的缓存。

于 2013-06-27T20:58:50.193 回答