【发布时间】: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