要提高SQL查詢效率where語句條件的先後次序應如何寫效率

時間 2021-08-14 09:09:53

1樓:匿名使用者

有索引的列優先,都有索引的看查詢出來的資料量,少的優先

in ,not in,<>,is null,is not null 等由於不會走索引,儘量不要使用。

where子句後面的條件順序對大資料量表的查詢會產生直接的影響,如

select * from zl_yhjbqk where dy_dj = '1k以下' and xh_bz=1

select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1k以下'

以上兩個sql中dy_dj及xh_bz兩個欄位都沒進行索引,所以執行的時候都是全表掃描,第一條sql的dy_dj = '1kv以下'條件在記錄集內比率為99%,而xh_bz=1的比率只為0.5%,在進行第一條sql的時候99%條記錄都進行dy_dj及xh_bz的比較,而在進行第二條sql的時候0.5%條記錄都進行dy_dj及xh_bz的比較,以此可以得出第二條sql的cpu佔用率明顯比第一條低。

2樓:

1.where子句中的連線順序

sql解析器採用自下而上的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾

select … from emp e where sal>50000 and job=『manager』and 25<(select count(*) from emp where mgr=e.empno);

效率低於

select… from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>50000 and job=『manager』;

2.選擇最有效率的表名順序

sql解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表(基礎表 driving table)將被最先處理。在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表

如果tab2中記錄數明顯高於tab1,用

select count(*) from tab2, tab1

效率明顯優於

select count(*) from tab1, tab2

3樓:匿名使用者

要提高sql查詢效率,最關鍵的是減少涉及查詢的資料量,簡單來說就是使用子查詢把資料先篩選掉些。

4樓:匿名使用者

條件中最好不要使用or 或in 。

如何提高這個sql查詢語句的效率?

5樓:青春影視剪輯

1. sql優化的原則是:將一次操作需要讀取的block數減到最低,即在最短的時間達到最大的資料吞吐量。

調整不良sql通常可以從以下幾點切入:

? 檢查不良的sql,考慮其寫法是否還有可優化內容

? 檢查子查詢 考慮sql子查詢是否可以用簡單連線的方式進行重新書寫

? 檢查優化索引的使用

? 考慮資料庫的優化器

2. 避免出現select * from table 語句,要明確查出的欄位。

3. 在一個sql語句中,如果一個where條件過濾的資料庫記錄越多,定位越準確,則該where條件越應該前移。

4. 查詢時儘可能使用索引覆蓋。即對select的欄位建立複合索引,這樣查詢時只進行索引掃描,不讀取資料塊。

5. 在判斷有無符合條件的記錄時建議不要用select count (*)和select top 1 語句。

6. 使用內層限定原則,在拼寫sql語句時,將查詢條件分解、分類,並儘量在sql語句的最裡層進行限定,以減少資料的處理量。

7. 應絕對避免在order by子句中使用表示式。

8. 如果需要從關聯表讀資料,關聯的表一般不要超過7個。

9. 小心使用 in 和 or,需要注意in集合中的資料量。建議集合中的資料不超過200個。

10. <> 用 < 、 > 代替,>用》=代替,《用<=代替,這樣可以有效的利用索引。

11. 在查詢時儘量減少對多餘資料的讀取包括多餘的列與多餘的行。

12. 對於複合索引要注意,例如在建立複合索引時列的順序是f1,f2,f3,則在where或order by子句中這些欄位出現的順序要與建立索引時的欄位順序一致,且必須包含第一列。只能是f1或f1,f2或f1,f2,f3。

否則不會用到該索引。

13. 多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。格式如下select sum(table1.

je) from table1 table1, table2 table2, table3 table3 where (table1的等值條件(=)) and (table1的非等值條件) and (table2與table1的關聯條件) and (table2的等值條件) and (table2的非等值條件) and (table3與table2的關聯條件) and (table3的等值條件) and (table3的非等值條件)。

注:關於多表查詢時from 後面表的出現順序對效率的影響還有待研究。

14. 子查詢問題。對於能用連線方式或者檢視方式實現的功能,不要用子查詢。

例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。應該用如下語句代替:

select name from customer inner join order on customer.customer_id=order.customer_id where order.

money>100。

15. 在where 子句中,避免對列的四則運算,特別是where 條件的左邊,嚴禁使用運算與函式對列進行處理。比如有些地方 substring 可以用like代替。

16. 如果在語句中有not in(in)操作,應考慮用not exists(exists)來重寫,最好的辦法是使用外連線實現。

17. 對一個業務過程的處理,應該使事物的開始與結束之間的時間間隔越短越好,原則上做到資料庫的讀操作在前面完成,資料庫寫操作在後面完成,避免交叉。

18. 請小心不要對過多的列使用列函式和order by,group by等,謹慎使用disti軟體開發t。

19. 用union all 代替 union,資料庫執行union操作,首先先分別執行union兩端的查詢,將其放在臨時表中,然後在對其進行排序,過濾重複的記錄。

當已知的業務邏輯決定query a和query b中不會有重複記錄時,應該用union all代替union,以提高查詢效率。

sql語句的where查詢語句中 select userid

這裡的 是引數佔位符,表示在執行查詢時用傳入的引數替換該內容在你的例子中,pstmt.setstring 1,userid 將應用得到的引數userid傳給第一個引數,pstmt.setstring 2,password 將應用得到的引數password傳給第二個引數 小白九久玩科技 where u...

sql中查詢多個欄位時,group by 要怎麼使用

惠惠 你根據到貨地點order by排序即可,不需要group by。sql語言,是結構化查詢語言 structured query language 的簡稱。sql語言是一種資料庫查詢和程式設計語言,用於存取資料以及查詢 更新和管理關聯式資料庫系統,同時也是資料庫指令碼檔案的副檔名。sql語言是高...

誰能幫我優化這條sql,這邊公司查詢要十秒,這樣使用者體現太慢了

你這個東西去除索引的因素,最大的問題是在高層使用了distinct。我不知道你的表結構是什麼樣子的。不過基本思路是這樣的。select distinct t3.sys user name procman,t2.send file num,t2.year,t2.num,t2.title,t2.writ...