【问题标题】:Speed up Oracle SQL Developer query in large Oracle Database加快大型 Oracle 数据库中的 Oracle SQL Developer 查询
【发布时间】:2021-04-24 03:13:44
【问题描述】:

我正在使用 Oracle SQL Developer 查询 Oracle 数据库。查询运行缓慢。我不认为使用 Distinct 可能会减慢我的速度。但是如果没有 Distinct 调用,我就无法生成唯一的行。数据库不包含重复行。所以,很可能我的查询格式错误。如何加快此查询?查询如下:

SELECT DISTINCT 
    view1.table1.col1, 
    view1.table2.col2, 
    view1.table2.col3, 
    view1.table1.col4, 
    view1.table3.col5, 
    view1.table4.col6 
FROM 
    view1.table1, 
    view1.table3, 
    view1.table2, 
    view1.table4
WHERE 
    table1.col1 = table2.col7
AND
    table1.col4 = table3.col8
AND
    table1.col4 >= '19-DEC-20'
AND 
    table4.col9 = table3.col10 ``` 

【问题讨论】:

  • "SQL Developer" 无关;缓慢的是在数据库服务器上执行查询。 SQL Developer 与此无关。那么:你有条件col4 >= '19-DEC-20'col4 来自哪个表?你是在比较字符串还是日期?如果是日期,为什么右侧有一个字符串?至于性能——解释计划显示了什么?您对查询中涉及的任何表都有哪些索引? (而且 - 你真的有一个名为 view1 的模式吗?这很奇怪。)
  • 您要加入 4 个视图或表?...如果是视图,那么天哪知道这些视图实际上在做什么。此外,大多数使用 DISTINCT 的人实际上并不需要或拥有糟糕的数据模型。我要做的第一件事是查看您的执行计划
  • 我没有看到view1.table4 的任何联接条件,因此您最终得到一个笛卡尔联接,它可能会返回数千或百万行。我认识一个 30 多年前的“朋友”,他等了超过 24 小时,然后终止了查询。
  • @MarkStewart:通过切换到“现代”(30 岁)显式 JOIN 运算符可以轻松避免此类错误
  • @MarkStewart 我更正了联接。它在原版中正确完成。在将名称从原始名称转录为这些模糊名称时,我弄乱了一位数字。 thatjeffsmith 和 mathguy 我将在他们完成后发布解释计划结果。

标签: sql oracle query-optimization


【解决方案1】:
table1:  INDEX(col4, col1)
table3:  INDEX(col8, col5, col10)
table2:  INDEX(col7, col2, col3)
table4:  INDEX(col9, col6)

【讨论】:

  • 不错的答案,基于最初的问题。 Rick 基本上建议在连接列或选择列之一的列上使用索引,以允许 Oracle 仅读取索引以得出结果。请注意,可能需要更改索引列的顺序,具体取决于列统计信息和行数。如果查询中有视图而不是表,或者添加索引不可行,……至少需要解释计划。索引对存储和性能的影响也可能是一个问题。
  • 我认为洗牌每个索引中的列会使事情变得更糟。 (我同意 VIEW 的作用。)
猜你喜欢
  • 2011-01-18
  • 2013-06-20
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2021-04-12
  • 2021-03-31
  • 2023-03-20
  • 2012-06-14
相关资源
最近更新 更多