SQL调优思路

时间:2014-09-08 23:04:16

标签: sql performance hibernate oracle11g

我有一张包含大量列和大量数据的大表。

以下hibernate(3.x)SQL在Oracle 11g数据库中花费了很长时间。响应时间较慢主要是由于where子句中的非索引列。

数据库分析后,决定如下:

  • 此时无法修改数据库表以将索引添加到查询中使用的非索引列。
  • 同样,使数据库函数/存储过程的SQL部分也不是一个选项。
  • 数据库调整已经完成。
  • 必须调整SQL。

如何调整/优化SQL以获得更快的响应时间?嵌套连接会增加响应时间吗?

下面是SQL:

SELECT *
FROM emp
WHERE id || '/' || name IN ( :vals )
    AND (LEAST(DECODE(dt1, 0, 999999999999, null, 999999999999, dt1)
              ,DECODE(dt2, 0,999999999999, null, 999999999999, dt2)) BETWEEN :inputVal1 AND :inputVal2
    OR ( decode(dt1, 0, null, dt1) IS NULL
        AND DECODE(dt2, 0,null, dt2) IS NULL )  )

非常感谢您对示例/网址的任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您无法更改当前表,但可以添加新表吗?

如果您的问题与丢失的索引有关,您只需将数据复制到新表中 - 这里的价格就是重复 - 并调整您的SQL以使用此表而不是原始表。您只需复制数据并允许SQL Server创建和维护新索引。

这个想法是只复制索引中包含的数据。除了重复之外,此处的价格可能更“加入”,但根据您的问题,这不是问题,因为只有当您的查询执行得非常好时才加入本身。