熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle的in和not in(圖)

2013-11-13 16:12:08  來源: Oracle 

  在很多軟件系統中系統的性能很打程度上有數據庫的性能決定以前也曾經做過很多次關於性能方面的各種測試特別是關於oracle的我想到也應該記錄下來一部分為大家共享
  
  事情發生在我們的系統從sqlserver移植到oracle用戶在一個查詢的操作上等待的時間無法忍受了我們關於這個查詢的處理與原來的方式一下難道sqlserver 同oracle有什麼地方不一樣麼讓我們來看看oracle有什麼地方有問題或者是我們使用的有問題?
  
  業務問題大概可以這樣描述一個父表一個子表查詢的結果是找到子表中沒有使用父表id的記錄這種情況估計很多系統都會牽涉得到讓我們來舉一個例子
  
  
表一 父表 parent
   
  表二 子表 childen
   

  父表存儲父親子表存儲孩子然後通過pid和父表關聯查詢需要的結果是找到尚未有孩子的父親
  
  我們來看一下查詢語句的寫法
  
  select * from parent where id not in (select pid from childen)
  
  這種標准的寫法在子表存在萬條的記錄的時候查詢時間超過了遠遠大於原來的sql server服務器的一秒我在解決的時候想到了一個方法
  
  select * from parent where id in
  
  ( select id from parent minus select pid from childen )
  
  正常理解下這個語句應該更加費時但是事實完全出乎意料這條語句不僅僅在子表存在大量記錄的情況下速度良好在子表少量數據的情況下速度也非常的好基本在秒內完成
  
  這個結果可以很明顯的證明oracle 在子查詢的內部處理的時候使用 in 和 not in 的巨大區別希望用到這種方式的用戶注意也期待有人解釋其中的問題
  
  附錄 測試數據的語句
  
   create parent table
  drop table parent;
  create table parent(id varchar()name varchar() primary key (id) );
  
   create childen table
  drop table childen;
  create table childen(id varchar()pid varchar() name varchar() primary key (id) );
   Create/Recreate primary unique and foreign key constraints
  alter table CHILDEN
  add constraint fk_ foreign key (PID)
  references parent (ID);
  
   add test date for parent
   Created on by GUIP
  declare
   Local variables here
  i integer;
  begin
   Test statements here
  i := ;
  delete from parent;
  loop
  i := i + ;
  dbms_outputput_line(i);
  insert into parent(id name) values(i name || i);
  if (i mod =) then
  commit;
  end if;
  exit when i > ;
  end loop;
  commit;
  end;
  
   add test date for childen
   Created on by GUIP
  declare
   Local variables here
  i integer;
  j integer;
  begin
   Test statements here
  i := ;
  delete from childen ;
  loop
  j := ;
  loop
  i := i + ;
  j := j + ;
  insert into childen(id pid name) values(i j name || j);
  if (i mod =) then
  commit;
  end if;
  exit when j>= ;
  end loop;
  
  exit when i >= * ;
  end loop;
  commit;
  end;
From:http://tw.wingwit.com/Article/program/Oracle/201311/17959.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.