【问题标题】:Shared SQL Queries共享 SQL 查询
【发布时间】:2021-07-18 11:02:31
【问题描述】:

据我所知,不同用户一遍又一遍地执行的相同查询会以某种方式存储(了解技术细节)在 SGA 内存中,这样可以提高性能。我的问题是服务器如何识别相同的查询是由不同的用户执行的,而不需要新的硬解析,因为有关查询的原始信息存储在第一个拨打电话的用户的 PRIVATE SQL 区域中。老实说,我有点困惑。我的意思是,您说不是每个查询都将存储在共享 SQL 区域中,而是存储一个哈希值,我的问题是,如果私有 SQL,另一个会话将如何知道将执行相同的查询另一个用户不知道共享 SQL 区域中同一查询的哈希值的区域。

提前致谢

【问题讨论】:

  • 这称为 缓存。这是提高多种软件系统性能的常用方法。
  • 同一事物的hash值是一样的,hash值就是这样工作的。

标签: sql oracle query-optimization database-performance sqlperformance


【解决方案1】:

因为有关查询的原始信息存储在第一个拨打电话的用户的 PRIVATE SQL 区域中。

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

我会推荐两本 Jonathan Lewis 的最佳书籍:

  1. Oracle Core:DBA 和开发人员必备的内部知识
  2. 基于成本的 Oracle 基础知识

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

【讨论】:

    【解决方案2】:

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

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

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

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

    改为使用这样的语句

    SELECT first, middle, last FROM user WHERE user_id = ?
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多