【问题标题】:Order By clause causing Performance Hit导致性能下降的 Order By 子句
【发布时间】:2018-09-13 02:44:57
【问题描述】:

我有一个使用流水线表函数的 SQL 查询,如下所示。

select col1,col2,... col75 from table(pipelinedtablefunction) 
order by col1

此查询在 14 分钟内返回 100 000 条记录。如果我删除 order by 子句并执行以下查询,查询将在 1 秒内运行并检索相同的结果。

select col1,col2,... col75 from table(pipelinedtablefunction) 

我在游标查询的流水线函数中使用了 order by 子句,我遇到了同样的问题。有什么办法可以解决和提高性能?

【问题讨论】:

  • 如果你的 col1 被索引?
  • 是的,它已被索引。管道内衬函数内的游标查询庞大而复杂,但它是这样的。 select t1.col1,col2.. col75 from table1 t1, table2 t2 union all select t11​​.col1,col2.. col75 from table11 t11, table12 t12 t1 和 t11 中的 Col1 都是主键,被索引了
  • 解释计划在哪里? pipelinedtablefunction 的代码也会有所帮助

标签: sql sorting oracle11g oracle12c


【解决方案1】:

我发现了问题,在 col50 列之一中,我调用了如下所示的用户定义函数,该函数实际上为每一行执行,这导致了时间。

当我从选择查询中注释掉该列时,它会在一秒钟内运行。

select col1,col2, ../*my_fun(col50)*/, col51.. col75 from table(pipelinedtablefunction) 
order by col1

我们已经对功能进行了调整,现在可以了。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多