我正在使用OCI与Oracle通信的客户端服务器应用程序。过去,我们的应用程序经常将会话视为无限资源,这很可能损害共享该Oracle服务器的其他应用程序。
我试图说服我的开发人员,对我们的应用程序来说,与他人一起玩耍而不是浪费资源很重要。
在什么时候,Oracle DBA会认为应用程序过度使用(或滥用)会话?
编辑:当前会话的最大消费者之一是使用直接路径加载来批量并行加载几张(20-30)表的组件。
我正在使用OCI与Oracle通信的客户端服务器应用程序。过去,我们的应用程序经常将会话视为无限资源,这很可能损害共享该Oracle服务器的其他应用程序。
我试图说服我的开发人员,对我们的应用程序来说,与他人一起玩耍而不是浪费资源很重要。
在什么时候,Oracle DBA会认为应用程序过度使用(或滥用)会话?
编辑:当前会话的最大消费者之一是使用直接路径加载来批量并行加载几张(20-30)表的组件。
Answers:
与所有事物一样,这取决于。
如果您使用的是OCI,则假定您正在开发客户端/服务器应用程序。我通常希望那种情况下的数据库支持共享服务器连接,而当应用程序连接到数据库时,我希望请求共享服务器连接。通过限制数据库为创建新会话而必须执行的工作量,可以提高应用程序的性能。这样做的副作用是在服务器上留给其他人更多的资源。当数据库执行后续查询时,使用共享服务器连接的确需要更长的代码路径,因为必须将查询发送到共享服务器进程,但是如果共享服务器进程的数量合理,通常这并不重要。
如果DBA不使用自动PGA管理,则打开多个会话也可能是一个问题。如果您使用手动PGA管理,则PGA是在每个会话的基础上配置的,因此每个会话可以SORT_AREA_SIZE
为其他PGA组件之间的排序分配一个单独的类别。如果您使用手动PGA管理在数据库中创建了大量会话,并且每个会话都试图最大化其PGA使用率,则很容易使服务器的RAM不足,并给每个人造成性能问题。但是,假设您使用的是Oracle 10.1或更高版本,则可以使用自动PGA管理。在那种情况下,DBA配置一个PGA_AGGREGATE_TARGET
(或MEMORY_TARGET
在11g中包括PGA ),数据库负责确保限制所有会话之间的聚合PGA,从而使数据库用尽资源。
如果数据库支持共享服务器连接,则您的应用程序将获得共享服务器连接,并且数据库使用自动PGA管理,大多数DBA不会在乎您创建的会话数。
现在,如果您要创建许多会话,以便可以并行执行更多工作,那么这将在会话数之外产生性能问题。配置数据库以支持1000个会话非常容易,例如,如果所有1000个会话同时对数据仓库发出严重查询,则将数据库配置为不死不掉要困难得多。如果您的应用程序用尽了数据库可用于查询的所有资源,那么DBA可能会考虑使用Oracle Resource Manager。优先处理不同的应用程序和/或不同的用户。例如,DBA可以配置资源管理器,以便如果CPU利用率达到100%,则聚合中的应用程序将获得50%的CPU,聚合中的某些其他应用程序将获得25%,其余所有应用程序将获得剩余的25% 。如果没有其他请求待处理,则您的应用程序可以自由使用所有100%的CPU。
如果您正在并行运行事务,那么研究Oracle并行运行语句的能力可能也很有用,因为与编写您自己的并行化代码相比,这可能涉及较少的开销。例如,我希望编写一个客户端应用程序来串行提交使用Oracle并行查询执行的语句,而不是打开多个会话并从应用程序的单独线程中执行每个语句,这将容易得多,而且可能更快。 Oracle没有使用并行查询来执行任何语句。如果使用并行查询,数据库还可以调整产生的并行从属服务器的数量,以便在数据库特别繁忙时启动较少的并行从属服务器,而在数据库相对空闲时启动更多的并行从属服务器。