共享 SQL 查询

问题描述

据我所知,由不同用户一遍又一遍执行的相同查询以某种方式存储(忽略技术细节)在 SGA 内存中,并且通过这样做提高了性能。我的问题是服务器如何识别同一查询是由不同的用户执行的,而无需进行新的硬解析,因为有关查询的原始信息存储在第一个进行调用用户的 PRIVATE sql 区域中。老实说,我有点困惑。我的意思是,您说不是每个查询都将存储在 SHARED sql 区域中,而是一个哈希值,我的问题是,如果 Private sql 将执行相同的查询,另一个会话将如何知道另一个用户不知道 SHARED sql AREA 中相同查询的哈希值的区域。

提前致谢

解决方法

因为有关查询的原始信息存储在第一个发出调用的用户的 PRIVATE SQL 区域中。

不,这不正确。您需要阅读 Library cachev$sqlareav$sqlparent cursor,child cursor、SQL_ID 和 HASH_VALUE。每个游标都有参数 parsing_schema,所以这取决于它被解析的模式。

我推荐 Jonathan Lewis 的两本最好的书:

  1. Oracle Core:DBA 和开发人员的基本内部结构
  2. 基于成本的 Oracle 基础

它们几乎涵盖了您可能需要了解的有关此主题的所有信息。

,

您的查询文本经过哈希处理,哈希用作在缓存中查找查询的键。实际上,缓存在连接之间共享。

因此,最好的办法是确保每个用户准确使用相同的查询文本发出查询。为这些查询使用准备好的语句,并为这些语句提供参数值。

也就是说,不要使用像这样嵌入常量的语句:

SELECT first,middle,last FROM user WHERE user_id = 345 -- defeats cache!

相反,使用这样的语句

SELECT first,last FROM user WHERE user_id = ?

并在每次运行查询时为 ? 参数提供值。

您没有说明您使用的是哪种应用程序编程语言,而且这种使用准备好的语句的业务因语言而异。

这是一个 explanation for Java JDBC。这是 php oci8 的一个。