sql語句中的 和in

2021-08-29 21:19:57 字數 791 閱讀 6204

今天優化了一段專案中的**。**的作用就是在使用者表和使用者賬戶表中查出所有有賬戶的使用者,當然查出來的使用者應該是不重複的(distinct一下),這2個表中的記錄大約都為2萬條左右,資料量還是很大的,**通過hibernate的轉換出來是這樣的:

select * from ( select rownumber() over() as rownumber_, row_.* from ( select distinct userpo1_.id as col_0_0_ from

run08110.t_accusr accountuse0_ inner join run08110.t_usrinfo userpo1_ on accountuse0_.user_id=userpo1_.id where 1=1

and accountuse0_.chk_flag<>0 and (userpo1_.identity in (4 , 5 , 6 , 7)) ) as row_ ) as temp_ where rownumber_ <= ?

很簡單的一條語句,沒有必要詳細的解釋。看起來任何問題都沒有,執行時肯定不會報錯,但查詢速度非常非常慢,從後台取出資料到前台分頁顯示,如果計算機效能不太好,可能需要1分半鐘的時間,問題困擾了我很長時間,我嘗試著更換表之間的連線方式,但是效果很不明顯,真是百思不得其解。後來和同事一起分析了一下,我把'<>'換成了'>',把 'in (4 , 5 ,6 , 7)'換成了'>3'(和以前的條件是等價的),重啟伺服器,再執行一遍查詢,簡直太不可思議了,查詢速度非常非常快,優化成功!看來用sql查詢時'<>'以及'in'不是隨便用的,使用得不當可能會嚴重影響查詢速度,要慎用!

sql語句中的exists和in

比如在northwind資料庫中有乙個查詢為 select c.customerid,companyname from customers c where exists select orderid from orders o where o.customerid c.customerid 這裡面的...

Sql語句中的DDL語句

資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...

SQL語句中Union和Union all的區別

在資料庫中,union和union all關鍵字都是將兩個結果集合並為乙個,但這兩者從使用和效率上來說都有所不同。union在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。如 select from test union1 union sel...