【问题标题】:Oracle 11g Top N Query returns different values to the same query running under 10gOracle 11g Top N Query 对 10g 下运行的同一个查询返回不同的值
【发布时间】: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


【解决方案1】:

我应用了 ORACLE 11G 11.2.0.1 PATCH 13 BUG FOR WINDOWS(64 位 AMD64 和 INTEL EM64(补丁)),这已经解决了这个问题。我也尝试在 bug 数据库中查找具体原因,但说起来容易做起来难!

感谢您的建议

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-10-23
    • 2011-10-25
    • 2011-05-20
    相关资源
    最近更新 更多