我试图运行在Oracle中下面的SQL语句,它需要年龄运行:优化运行缓慢甲骨文很快地运行SQL Server的SELECT查询
SELECT orderID FROM tasks WHERE orderID NOT IN
(SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL)
如果我只运行子部分即IN子句,在甲骨文运行速度很快的,即
SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL
为什么整个声明采取的Oracle这么长的时间?在SQL Server中,整个语句运行得很快。
另外还有一个更简单/不同/更好的SQL语句,我应该使用?
有关该问题的更多的细节:
- 每个订单是由许多任务
- 每个订单将被分配(一个或多个它的任务将有工程师1和engineer2设置)或顺序可以未分配(其所有任务对于工程师字段都为空值)
- 我正在尝试查找所有未分配的orderID。
为了防万一,它有什么区别,表中有〜120K行,每个订单有3个任务,所以〜40K个不同的订单。
回应的答案:
- 我宁愿这两个SQL Server和Oracle在工作的SQL语句。
- 这些任务只有orderID和taskID上的索引。
- 我尝试了这个声明的NOT EXISTS版本,但是在我取消它之前运行了3分钟。也许需要一个JOIN版本的声明?
- 还有一个“orders”表以及orderID列。但是我试图通过不将它包含在原始SQL语句中来简化问题。
我想在原来的SQL语句中,每次在SQL语句的第一部分中都会运行子查询 - 尽管它是静态的,只需要运行一次?
执行
ANALYZE TABLE tasks COMPUTE STATISTICS;
了我原来的SQL语句执行速度更快。
虽然我仍然很好奇为什么我必须这样做,如果/当我需要再次运行它时?
根据统计甲骨文是 需要确定效率的不同的执行计划 基于成本 optimzer信息:为 例如,rowsin表, 行的平均宽度的数量,最高 每列最低值,每列不同值 ,集群 索引等因素
在一个小型数据库中,您只需设置 就可以每晚收集统计数据 ,并保持独立。其实这是 默认在10g以下。对于较大的 实现,您通常必须以 衡量执行的稳定性 计划与数据 更改的方式,这是一个棘手的平衡。
Oracle还有一个称为其用于 样品表来确定在执行时相关 统计 “动态采样”功能。这是 更经常与数据使用 仓库,其中 采样的开销超过了 长时间运行的查询的潜在性能提升。
我永远不会明白为什么程序员经常把DISTINCT放在他们的IN子句中。 (1,1,1,2,2,2,7)是7?是5?如果我的列表是(1,2,7),答案不会改变。当我在Oracle中运行它时,它忽略了独特的... CBO意识到没有价值。 – 2008-10-24 21:38:16