如何提高sql查询的性能?

Posted

技术标签:

【中文标题】如何提高sql查询的性能?【英文标题】:How to increase performance in sql query? 【发布时间】:2015-09-09 18:38:00 【问题描述】:

我正在使用 oracle sql。我有一个问题:

查询1

    select t1.object_id object1, t2.object_id ... --etc--
from objects t1, objects t2, object_types t3 ... --etc--
where ... --many conditions--

它确实有效。现在我必须选择 t1.object1 的 n 级父级。

这是我的查询:

查询2:

 select object_id
          from objects 
              where object_type_id in
            ( --query3-- ) 
and rownum = 1
            connect by prior parent_id = object_id
          start with object_id= -- t1.object_id value --;

如果我手动编写 t1.object_id 值,它也可以工作。问题是,如果我写一些数字而不是 query3,它的运行速度会快 100 倍。 IMO 发生这种情况是因为查询每次都会为每个对象执行。

现在我需要进行一个性能良好的大查询。我该怎么做?

首先我需要提高 query2 的性能。我希望 query3 不执行多次。我可以将bulk collect 放入某个变量中,但我想使用尽可能多的 pl/sql。所以我认为 with - 作为语法。

with types as (--query3--)
select object_id
              from objects 
                  where object_type_id in
                (types) 
    and rownum = 1
                connect by prior parent_id = object_id
              start with object_id= -- t1.object_id value --; 

此查询的输出是例外。 我怎样才能毫无例外地尽可能快地做到这一点?

以及如何在 query1 中选择父类型?是否必须在 where 子句中编写分层查询?

【问题讨论】:

运行查询时出现异常? 【参考方案1】:

如果您正在寻找速度,您不想进行嵌套查询。尝试将嵌套查询中存在的每个数据集放入临时表中并加入它们。然后,您只需提取所需的列和较小的数据集,然后运行一次。你是对的,嵌套查询会一遍又一遍地运行,所以如果你有很多数据,它是低效的。

select col1, col2 into #query3
from table1

那么,

select object_id
          from objects o 
          join #query3 q on o.field=q.field
              where object_type_id = valuefromquery3
and rownum = 1
            connect by prior parent_id = object_id
          start with object_id= -- t1.object_id value --;

【讨论】:

谢谢。我明天试试。【参考方案2】:

我决定在我的函数中进行 2 个查询。首先是query1,我没改过。然后我意识到我有一个来自query1的输出数组的循环,所以我写了

select object_id bulk collect into some variable
          from objects 
              where object_type_id in
            ( --new query3-- ) 
and rownum = 1
            connect by prior parent_id = object_id
          start with object_id= variable;

我想,我的 query3 有问题。我写了新的查询,效果很好。现在我有很好的表现。谢谢!

【讨论】:

以上是关于如何提高sql查询的性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高子查询的性能或 sql 中子查询的替代方案

如何提高sql查询的性能?

如何提高sql查询的性能

如何提高 SQL Azure 查询性能

如何提高sql中的查询性能?

如何提高查询性能?