我们有一个C#应用程序,它将在数据库中搜索几个表中的活动。用户可以指定搜索某些条件,这些条件又基于基本的SQL查询。
此查询需要很长时间才能执行,我们想在此查询上使用Oracle的Tuning Advisor。我们的问题是该调优顾问是否仅适用于给定的查询?
例如,如果我们对应用程序进行基础查询的调整(它们不指定任何搜索条件):
SELECT Actv, FullName, DOB FROM Pers;
创建的SQL配置文件仅适用于该语句吗?如果他们指定搜索条件,从而使语句增长为:
SELECT Actv, FullName, DOB FROM Pers WHERE Actv = 'Foo' AND DOB >= :Date;
我们是否需要为此查询创建另一个SQL配置文件,或者优化器在创建执行计划时会使用基线SQL配置文件的一部分?
答案 0 :(得分:0)
根据经验,每个查询都是单独优化的。例如,Tuning Advisor可能建议的索引对于某些查询可能很好,但对于其他查询可能最终没有用。关于堆群集和数据分区也可以这么说。
一个幼稚的解决方案是添加所有查询所需的所有索引。即使可以做到这一点,索引过多也会减慢所有数据修改SQL语句的速度。也就是说,所有INSERT
,UPDATE
和DELETE
都将变得缓慢而昂贵。
那么,您应该怎么办?这取决于您的具体情况。我的[非常个人]经验法则是,每个表的索引不得超过10个。
当然,如果您的表具有较高的更新/插入/删除率,我会考虑使用较低的限制。
另一方面,如果表数据的修改率很低/没有修改(主要是只读表),则可以提高此限制,甚至可以按照Tuning Advisor的建议添加尽可能多的索引。
最后,经验法则只是一个指导。您将需要尝试查看快速SELECT
和快速UPDATE
之间的最佳平衡。