问题描述
据我所知,由不同用户一遍又一遍执行的相同查询以某种方式存储(忽略技术细节)在 SGA 内存中,并且通过这样做提高了性能。我的问题是服务器如何识别同一查询是由不同的用户执行的,而无需进行新的硬解析,因为有关查询的原始信息存储在第一个进行调用的用户的 PRIVATE sql 区域中。老实说,我有点困惑。我的意思是,您说不是每个查询都将存储在 SHARED sql 区域中,而是一个哈希值,我的问题是,如果 Private sql 将执行相同的查询,另一个会话将如何知道另一个用户不知道 SHARED sql AREA 中相同查询的哈希值的区域。
提前致谢
解决方法
因为有关查询的原始信息存储在第一个发出调用的用户的 PRIVATE SQL 区域中。
不,这不正确。您需要阅读 Library cache、v$sqlarea、v$sql、parent cursor,child cursor、SQL_ID 和 HASH_VALUE。每个游标都有参数 parsing_schema,所以这取决于它被解析的模式。
我推荐 Jonathan Lewis 的两本最好的书:
- Oracle Core:DBA 和开发人员的基本内部结构
- 基于成本的 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 的一个。