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 where b.parentregoinid = 1919) 改成 t.DSTC_ID in (select b.regoinid from [email protected] b where b.parentregoinid = 1919 union select 1919 from dual) |
以上問題的解決參考博文:
相關推薦
oracle中where條件後用in這樣子查詢後變慢
今日開發一個需求,其中由於需求變態,寫了一個挺複雜的sql,在本地測試環境看不出問題,但到了生產就變得非常慢(由於表資料量比較大),把sql粘貼出來執行了一下大概要42秒...我滴天 我寫的sql大概是這個樣子的(大概描繪下)TABLE_A表資料量大概200w,其中一些關鍵
oracle 在where條件中寫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常用於應用程式根據使用者選擇項的不
oracle中where子句和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
Mysql中where條件一個單引號引發的性能損耗
電商 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位女生*/
在oracle中where 子句和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
Linux中grep命令,用或的關係查詢多個字串,正則表示式基礎說明
使用 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