共享SQL查询
据我所知,不同用户反复执行的相同查询以某种方式存储在SGA内存中(忽略了技术细节),这样可以提高性能。我的问题是,由于查询的原始信息存储在进行调用的第一个用户的私有SQL区域中,因此服务器如何识别相同的查询是由不同的用户执行的,而不需要新的硬解析。老实说,我有点困惑。我的意思是,您说的不是每个查询都存储在共享SQL区域中,而是一个哈希值,我的问题是,如果另一个用户的私有SQL区域不知道共享SQL区域中相同查询的哈希值,那么另一个会话如何知道将执行相同的查询 提前谢谢 因为有关查询的原始信息存储在发出调用的第一个用户的私有SQL区域中 不,那不对。您需要阅读、、SQL\u ID和哈希值。每个游标都有参数parsing_schema,因此它取决于解析它的模式 我推荐乔纳森·刘易斯的两本最好的书:共享SQL查询,sql,oracle,query-optimization,database-performance,sqlperformance,Sql,Oracle,Query Optimization,Database Performance,Sqlperformance,据我所知,不同用户反复执行的相同查询以某种方式存储在SGA内存中(忽略了技术细节),这样可以提高性能。我的问题是,由于查询的原始信息存储在进行调用的第一个用户的私有SQL区域中,因此服务器如何识别相同的查询是由不同的用户执行的,而不需要新的硬解析。老实说,我有点困惑。我的意思是,您说的不是每个查询都存储在共享SQL区域中,而是一个哈希值,我的问题是,如果另一个用户的私有SQL区域不知道共享SQL区域中相同查询的哈希值,那么另一个会话如何知道将执行相同的查询 提前谢谢 因为有关查询的原始信息存储在
它们几乎涵盖了您可能需要了解的有关此主题的所有信息。查询的文本是散列的,散列用作在缓存中查找查询的键。实际上,缓存是在连接之间共享的 因此,最好的办法是确保每个用户发出的查询具有完全相同的查询文本。为这些查询使用准备好的语句,并为这些语句提供参数值 也就是说,不要使用具有以下嵌入常量的语句:
SELECT first, middle, last FROM user WHERE user_id = 345 -- defeats cache!
相反,使用这样的语句
SELECT first, middle, last FROM user WHERE user_id = ?
并在每次运行查询时为?
参数提供值
您没有说您使用哪种应用程序编程语言,而且使用准备好的语句的业务因语言而异
这是一个例子。这里有一个。这叫做缓存。在许多类型的软件系统中,这是提高性能的常用方法。同一事物的哈希值是相同的,这就是哈希值的工作方式。