2010-12-02 124 views
3

我的问题是类似的,在这个线程的一个构成: How to avoid this very heavy query that slows down the application?Hibernate的索引查询慢

我们检查丢失外键索引和发现了一些。添加缺失的索引实际上具有相反的效果,因为它会进一步减慢查询速度。一条重要信息是我们的客户有一次Oracle安装,其中我们的模式复制了21次。每个模式只有1000个表格。我们是否要求太多的Oracle拥有如此大量的表格(当然还有索引)?我不知道他们的硬件是什么,但我的问题是这是一种合理的方法,还是将用户分解为不同的SID会更好?

以下是Hibernate正在执行的查询。客户告诉我们,这个查询在执行时占用了处理器的45%左右(尽管我不知道该处理多长时间)。

任何建议表示赞赏, 史蒂夫

SELECT NULL AS table_cat, 
     owner AS table_schem, 
     table_name, 
     0 AS non_unique, 
     NULL AS index_qualifier, 
     NULL AS index_name, 
     0 AS TYPE, 
     0 AS ordinal_position, 
     NULL AS column_name, 
     NULL AS asc_or_desc, 
     num_rows AS CARDINALITY, 
     blocks AS pages, 
     NULL AS filter_condition 
    FROM all_tables 
WHERE table_name = 'BOOKING' 
     AND owner = 'FORWARD_TN' 
UNION 
SELECT NULL AS table_cat, 
     i.owner AS table_schem, 
     i.table_name, 
     DECODE (i.uniqueness, 'UNIQUE', 0, 1), 
     NULL AS index_qualifier, 
     i.index_name, 
     1 AS TYPE, 
     c.column_position AS ordinal_position, 
     c.column_name, 
     NULL AS asc_or_desc, 
     i.distinct_keys AS CARDINALITY, 
     i.leaf_blocks AS pages, 
     NULL AS filter_condition 
    FROM all_indexes i, 
     all_ind_columns c 
WHERE  i.table_name = 'BOOKING' 
     AND i.owner = 'FORWARD_TN' 
     AND i.index_name = c.index_name 
     AND i.table_owner = c.table_owner 
     AND i.table_name = c.table_name 
     AND i.owner = c.index_owner 
ORDER BY non_unique, 
     TYPE, 
     index_name, 
     ordinal_position 
+0

处理器在oracle服务器上,还是在应用服务器上? – skaffman 2010-12-02 16:54:38

+0

我应该指定。 Oracle服务器是处理器命中的人。 – 2010-12-02 17:54:39

回答

3

您没有达到任何一种能力问题与1000个表。在Oracle世界中这仍然相对较小。只要快速检查我们的电子商务套件安装,它就有23,000个表格。使用大量CPU的查询几乎总是一个执行计划问题。有些事情要看

您收集了优化器统计信息吗?没有他们,优化器可能会对如何执行查询做出很差的决定。

下一步是看执行计划本身。如果您正在运行企业管理器,则可能会在首页耗尽资源。你可以点击它看看它在做什么。没有这个,你必须使用sql_trace或解释计划来看看发生了什么。

1

如果您的所有语句对22.000个表中的每一个使用稍微不同的文字SQL(即无绑定变量),那么在Oracle服务器上,您可能很容易被excessive parse time命中。如果是这种情况,只需切换到绑定变量,CPU消耗就会大幅降低。

您的客户能告诉CPU时间花在什么Oracle功能上吗? Oracle提供了必要的统计信息。由于据报道CPU消耗是整个实例消耗的重要组成部分,因此您的客户可以运行statspack报告(如果他已获得诊断包许可,则可以运行ASH)。这应该显示CPU时间的确切位置。

0

我们的客户审查他们的Oracle配置和更改的配置为以下值: optimizer_index_caching的= 90 OPTIMIZER_INDEX_COST_ADJ = 15 OPTIMIZER_MODE =“选择”

他们报告说,这似乎已经解决了速度问题。