我有两个问题集。我最喜欢的是一种结合两者的解决方案。
问题1:我有一张20行表。我正从其他表中读取150,000行(比如表2)。对于从表2中读取的每一行,我必须将它与表1的特定行匹配(不匹配整行,几列。如果table2.col1 = table1.col&& table2.col2 = table1.col2)有没有办法可以缓存表1,这样我就不必一次又一次地查询它?
问题2:我想动态生成查询字符串,即,如果参数2为null,则不要将其放在where子句中。现在剩下的唯一选择是使用非常缓慢的即时执行。
现在我要问的是,如何将动态查询与表1进行比较?有任何想法吗 ?
答案 0 :(得分:0)
对于问题1,您只需加入表格即可。如果有一个等值连接并且一个表非常小而另一个表很大则那么你可能会得到一个哈希连接。这实际上是一种缓存机制,读取表和执行连接的总成本仅略高于读取表(只要哈希表适合内存)。
如果构造查询并通过执行立即运行,则没有区别--RDBMS散列连接仍将充当有效的缓存。
答案 1 :(得分:0)
对于问题1,如评论中所述,让数据库处理它。这就是它真正做得很好的。如果它经常被击中,那么如果缓冲区高速缓存的大小适当,则表的块应保留在数据库缓冲区高速缓存中。 DBA调优的一部分是识别适当的大小,将表固定到“保持”池等等。但可能不需要担心的事情。
如果只是为了简化编写查询而不是性能,那么视图或存储过程可以简化连接的重复使用。
对于问题2,使用这种格式的查询可能适合您:
SELECT id, val
FROM myTable
WHERE filter = COALESCE(v_filter, filter)
如果输入参数v_filter
为空,则只是自动匹配现有列。这假设现有的过滤器列本身永远不为空(因为您不能使用=
进行空比较)。此外,它假设WHERE
子句中还有其他索引部分,因为像COALESCE
这样的函数无法利用索引。