Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
共享SQL查询_Sql_Oracle_Query Optimization_Database Performance_Sqlperformance - Fatal编程技术网

共享SQL查询

共享SQL查询,sql,oracle,query-optimization,database-performance,sqlperformance,Sql,Oracle,Query Optimization,Database Performance,Sqlperformance,据我所知,不同用户反复执行的相同查询以某种方式存储在SGA内存中(忽略了技术细节),这样可以提高性能。我的问题是,由于查询的原始信息存储在进行调用的第一个用户的私有SQL区域中,因此服务器如何识别相同的查询是由不同的用户执行的,而不需要新的硬解析。老实说,我有点困惑。我的意思是,您说的不是每个查询都存储在共享SQL区域中,而是一个哈希值,我的问题是,如果另一个用户的私有SQL区域不知道共享SQL区域中相同查询的哈希值,那么另一个会话如何知道将执行相同的查询 提前谢谢 因为有关查询的原始信息存储在

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

提前谢谢

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

不,那不对。您需要阅读、、SQL\u ID和哈希值。每个游标都有参数parsing_schema,因此它取决于解析它的模式

我推荐乔纳森·刘易斯的两本最好的书:

  • Oracle Core:DBA和开发人员的基本内部构件
  • 基于成本的Oracle基础知识

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

    查询的文本是散列的,散列用作在缓存中查找查询的键。实际上,缓存是在连接之间共享的

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

    也就是说,不要使用具有以下嵌入常量的语句:

    SELECT first, middle, last FROM user WHERE user_id = 345 -- defeats cache!
    
    相反,使用这样的语句

    SELECT first, middle, last FROM user WHERE user_id = ?
    
    并在每次运行查询时为
    参数提供值

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


    这是一个例子。这里有一个。这叫做缓存。在许多类型的软件系统中,这是提高性能的常用方法。同一事物的哈希值是相同的,这就是哈希值的工作方式。