Oracle sql查询执行缓慢

Oracle sql查询执行缓慢,oracle,oracle11g,Oracle,Oracle11g,我有以下相当简单的问题 select count(*) from tbl t1, tbl t2 出于某种原因,执行此命令需要数十秒。我想知道为什么会这样?它似乎构建了该表的笛卡尔积(该表大约有270k行),但在不构建积的情况下,行的数量是显而易见的 一些澄清可能会有所帮助。我假设优化器不是为笛卡尔产品(特别是您提到的大型表)而构建的。在您的情况下,它可能会构建完整的结果集并对其进行计数 与其与之抗争,不如数一次桌子 select count(*) from tbl 然后自己制作产品 (我假设

我有以下相当简单的问题

select count(*) from tbl t1, tbl t2
出于某种原因,执行此命令需要数十秒。我想知道为什么会这样?它似乎构建了该表的笛卡尔积(该表大约有270k行),但在不构建积的情况下,行的数量是显而易见的


一些澄清可能会有所帮助。

我假设优化器不是为笛卡尔产品(特别是您提到的大型表)而构建的。在您的情况下,它可能会构建完整的结果集并对其进行计数

与其与之抗争,不如数一次桌子

select count(*) from tbl
然后自己制作产品


(我假设您考虑的是一个比您发布的毫无意义的自连接更有用的案例:-),请添加更多关于您想要实现的内容的信息。)

我假设优化器不是为笛卡尔产品(特别是您提到的大表)而构建的。在您的情况下,它可能会构建完整的结果集并对其进行计数

与其与之抗争,不如数一次桌子

select count(*) from tbl
然后自己制作产品


(我假设你有一个更有用的例子,而不是你发布的毫无意义的self-join:-),请添加更多关于你想要实现的信息。)

如果你只是想知道笛卡尔积,为什么不自己计算呢

SELECT Power(COUNT(*), 2) AS product 
FROM   tbl t1; 

如果只是想知道笛卡尔积,为什么不自己计算呢

SELECT Power(COUNT(*), 2) AS product 
FROM   tbl t1; 

众所周知,笛卡尔乘积速度慢,因为它返回所有的数据。尽管有5张反对票,我认为这是一个好问题。Oracle并不总是在查询中使用每个表,期望Oracle在这里应用相同的优化也不是不合理的。众所周知,笛卡尔乘积很慢,因为它返回所有数据。尽管有5次否决票,我认为这是一个好问题。Oracle并不总是在查询中使用每个表,期望Oracle在这里应用相同的优化也不是不合理的。+1我同意优化器似乎不能很好地处理交叉连接。我的猜测是,由于99%的交叉连接都是应用程序错误,Oracle没有花太多精力对其进行优化。这是不幸的,因为有时当我真的需要使用交叉连接时,优化器完全失败。+1我同意优化器似乎不能很好地处理交叉连接。我的猜测是,由于99%的交叉连接都是应用程序错误,Oracle没有花太多精力对其进行优化。这很不幸,因为有时候当我真的需要使用交叉连接时,优化器完全失败了。@jon谢谢。事实上,我检查了一个在线工具,它显示了它的正确性。似乎只是检查了语法。没有验证。@jon谢谢。事实上,我检查了一个在线工具,它显示了它的正确性。似乎只是检查了语法。没有验证它。