1. 程式人生 > >oracle中where條件後用in這樣子查詢後變慢

oracle中where條件後用in這樣子查詢後變慢

今日開發一個需求,其中由於需求變態,寫了一個挺複雜的sql,在本地測試環境看不出問題,但到了生產就變得非常慢(由於表資料量比較大),把sql粘貼出來執行了一下大概要42秒...我滴天

我寫的sql大概是這個樣子的(大概描繪下)TABLE_A表資料量大概200w,其中一些關鍵欄位建了索引

select * from TABLE_A a

where a.lng>={變數} and a.lng<={變數}

and a.lat>={變數} and a.lat<={變數}

and a.ci_code in(

...一個複雜sql,執行條件後大概也就幾十條資料

)

就是這樣一個sql執行卻很慢,如果我單獨執行紅色或單獨執行藍色部分sql就很快,又或者我把紅色部分>=與<=截開查詢就很快,但放在一起就相當慢。

後來看到了一篇博文,改造了一下果然就很快了,大概1~2秒就完事了。

改造後

select * from TABLE_A a

where a.lng>={變數} and a.lng<={變數}

and a.lat>={變數} and a.lat<={變數}

intersect

select * from TABLE_A a

where

a.ci_code in(

...一個複雜sql,執行條件後大概也就幾十條資料

)

然後看了下執行計劃,主要原因是由於where條件後><(或者or之類的)並且用到in導致驅動表被錯誤的選擇,驅動表選擇了“大表”。

又例:

or 和子查詢連用導致oracle無法查詢重寫了

(t.DSTC_ID = 1919 or
                               t.DSTC_ID in
                               (select b.regoinid
                                   from
[email protected]
b
                                  where b.parentregoinid = 1919)

改成 

   t.DSTC_ID in
                               (select b.regoinid
                                   from [email protected] b
                                  where b.parentregoinid = 1919 
                               union 
                               select 1919 from dual)

以上問題的解決參考博文:

相關推薦

oraclewhere條件in樣子查詢

今日開發一個需求,其中由於需求變態,寫了一個挺複雜的sql,在本地測試環境看不出問題,但到了生產就變得非常慢(由於表資料量比較大),把sql粘貼出來執行了一下大概要42秒...我滴天 我寫的sql大概是這個樣子的(大概描繪下)TABLE_A表資料量大概200w,其中一些關鍵

oraclewhere條件寫case when

業務:當狀態等於2時判斷表中的userid 是否和當前登入人id相等 SELECT  * FROM  tbname t WHERE  1=1AND  (CASE  WHEN  t.vc_state = '2'  THEN  t.vc_userId ELSE  當前登入人id

SQL 語句 where 條件 寫上1=1  是什麼意思

這段程式碼應該是由程式(例如Java)中生成的,where條件中 1=1 之後的條件是通過 if 塊動態變化的。例如:  String sql="select * from table_name  where 1=1";        if( conditon 1) {  

oracle sql 語句where條件 1=1 是什麼意思

是為了後面附加and ...方便程式邏輯處理用的, 要不然你就得稍微複雜一點兒處理: 有where條件。。。 沒有where條件。。。 1=1 是永恆成立的,意思無條件的,也就是說在SQL語句裡有沒有這個1=1都可以。 這個1=1常用於應用程式根據使用者選擇項的不

oraclewhere子句和having子句的區別

max sum 來源 不同 數據 完成 單個 找到 scott 1.where 不能放在GROUP BY 後面2.HAVING 是跟GROUP BY 連在一起用的,放在GROUP BY 後面,此時的作用相當於WHERE3.WHERE 後面的條件中不能有聚集函數,比如SU

tp where條件,字段和字段的大小比較

比較 sta number time arr 大小 array art ring $map = array( ‘pid‘ => 0, ‘start_time‘ => ar

Mysqlwhere條件一個單引號引發的性能損耗

電商 str target mysq color 日常 location 速度 avi 日常寫SQL中可能會有一些小細節忽略了導致整個sql的性能下降了好幾倍甚至幾十倍,幾百倍。以下這個示例就是mysql語句中的一個單引號(‘‘)引發的性能耗損,我相信很多朋友都遇到過,甚至

python 讀取大文件越來越(判斷 key 在 map ,千萬別 in keys())

方案 使用 tail 千萬 上傳 true 文件夾 blog alt 背景: 今天樂樂姐寫代碼,讀取一個四五百兆的文件,然後做一串的處理。結果處理了一天還沒有出來結果。問題出在哪裏呢? 解決: 1. 樂樂姐打印了在不同時間點的時間,直接print time() 即可。發

oracle怎樣讓一個查詢其它戶的trigger?

TP lec 其他 1.2 cee copy IT edit ola 在工作期間,有時候遇到這種需求,需要將一個用戶下的trigger查詢權限授予給其他的用戶怎樣將某個用戶的trigger查詢權限,授予其他用戶? 方法一:授予 create any trigger權限。這個

Oracle 18c + SQL Developer,sys賬戶建立使用者,新使用者無法登入

Oracle版本:18c 系統環境:Win10 SQL Developer 版本:18.3 1.使用sys賬戶登入 2.使用sys建立新使用者 對應的SQL文: -- USER SQL CREATE USER "sa" IDENTIFIED

Oracle條件分支語句

CASE WHEN 語法 SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 /*sex 1為男生,2位女生*/

oraclewhere 子句和having子句的區別

1.where 不能放在GROUP BY 後面 2.HAVING 是跟GROUP BY 連在一起用的,放在GROUP BY 後面,此時的作用相當於WHERE 3.WHERE 後面的條件中不能有聚集函式,比如SUM(),AVG()等,而HAVING 可以 Where和Having都是對查詢結果的一種篩選,說

線索二叉樹(序線索化、遍歷、查詢序的前驅、查詢前驅的繼)

#include <stdio.h> #include <stdlib.h> typedef struct ThreadNode{ char data; struct ThreadNode *lchild,*rchild ; int ltag

Linuxgrep命令,或的關係查詢多個字串,正則表示式基礎說明

使用 grep 'word1|word2' 檔名  這樣的命令是不對的! 應該使用如下的命令:1,grep -E 'word1|word2' 檔名 2,egrep 'word1|word2' 檔名 3

MyBatis條件的多表分頁查詢

1.兩個表對應的實體 public class Subarea implements Serializable{ private String id; private String decidedzoneId; private String regionId;

oracle實現擷取字串(substr)、查詢字串位置(instr)、替換字串(replace)

 (1)oracle中實現擷取字串:substr substr(string, start_position, [length]) 其中,string是元字串,start_position為開始位

靜態初始化不能放入繁重計算,否則會!

vat 可變 必須 long sta 直接 示例 填充 images 在類初始化期間計算不可變數據結果,並將結果保存在static final字段中是一種非常常見的做法。實際上,這正是靜態初始化器的設計目標。 以下是在初始化時構建一些靜態表的典型示例: public cl

oracle查詢語句in變數

  要想在in中用變數,需要用動態SQL: declare str_1 varchar2(100); str_2 varchar2(200); begin str_1:='11,22,33

Oracle資料庫Where條件執行順序是從往前的?

先看下面的一小段程式碼 ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連線必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. 例如:   (低效)    SELECT … FROM EMP

sql語句條件的數量非常大時where...in條件子句什麼更好的方法代替?

When you need to pass a list of parameters into a MySQL, there are at least two method to do this: Issue a dynamical query which would fill an IN list wi