【发布时间】:2011-10-26 16:31:28
【问题描述】:
我已经为这个问题创建了一个简单的例子。 以下查询为 order by 子句中不存在的所有列返回空值。如果我对 10g 运行查询,那就没问题了。这是 top n 查询的基本实现。
我知道内部 select 语句效率低,但生成了 SQL(如果需要,我可以更改引擎)。
非常感谢所有帮助!
select * from (
select b.* from USER_table b
where b.id in (
select c.id from USER_table c where c.removed = 0
)
order by surname
) a where rownum <= 10
--------------------------------------------------------
-- DDL for Table USER_TABLE
--------------------------------------------------------
CREATE TABLE "CHRONICLE"."USER_TABLE"
( "FIRST_NAME" VARCHAR2(20 BYTE),
"SURNAME" VARCHAR2(20 BYTE),
"USERNAME" VARCHAR2(20 BYTE),
"REMOVED" NUMBER,
"ID" NUMBER
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
--------------------------------------------------------
-- DDL for Index USER_TABLE_PK
--------------------------------------------------------
CREATE UNIQUE INDEX "CHRONICLE"."USER_TABLE_PK" ON "CHRONICLE"."USER_TABLE" ("ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
--------------------------------------------------------
-- Constraints for Table USER_TABLE
--------------------------------------------------------
ALTER TABLE "CHRONICLE"."USER_TABLE" MODIFY ("ID" NOT NULL ENABLE);
ALTER TABLE "CHRONICLE"."USER_TABLE" ADD CONSTRAINT "USER_TABLE_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE;
oracle版本是10.2.0.1。
它在 Windows 2008 R2 x64 上运行
解释 11g 的计划
说明 10g 的计划
【问题讨论】:
-
能否贴出您正在使用的11g数据库的完整4位版本以及生成的查询计划?如果 11g 在数据不为 NULL 的情况下返回 NULL,那是一个错误。您(或您的 DBA)是否已将所有补丁应用到 11g 数据库?
-
我要问的第一个问题是,如果去掉查询的 rownum 部分,10g 和 11g 之间的数据顺序是否相同?另请注意,优化引擎在 10g 和 11g2 之间发生了重大变化。 “测试”的另一个选项是将基于成本的优化器更改为 10.2.0.1 组合级别并再次测试。
-
完整版本号为11.2.0.1。要下载的 oracle 版本是否已完全修补,或者我应该在其他地方寻找补丁。该数据库在 Windows 2008 R2 x64 上运行。
-
两个版本的数据顺序完全相同。我在每个表中只放置了 3 行。如何更改基于成本的优化器?
-
我添加了 10 和 11g 的解释计划
标签: oracle oracle10g oracle11gr2