數據庫大數據量表SQL語句執行耗時久

起因:接口傳輸數據慢,出現超時情況。
原因:表數據量龐大,執行查詢操作時耗時久。雖然建立了索引,但是沒有效果,沒有走索引。
數據庫:Oracle

查看執行計劃結果:Sql語句是否走索引。

EXPLAIN PLAN FOR slow sql; 
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

注:EXPLAIN PLAN FOR 後接Sql語句。

結果:全表掃描檢索。長時間沒做表分析或者重新收集表狀態信息,未走索引。

在這裏插入圖片描述
解決:分析表。

analyze table tablename compute statistics

總結一:常見索引掃描類型

  1. index unique scan

 索引唯一掃描,當可以優化器發現某個查詢條件可以利用到主鍵、唯一鍵、具有外鍵約束的列,或者只是訪問其中某行索引所在的數據的時候,優化器會選擇這種掃描類型。
  1. index range scan

 索引範圍掃描,當優化器發現在UNIQUE列上使用了大於、小於、大於等於、小於等於以及BETWEEN等就會使用範圍掃描,在組合列上只使用部分進行查詢,導致查詢出多行數據。對非唯一的索引列上進行任何活動都會使用index range scan。
  1. index full scan

全索引掃描,如果要查詢的數據可以全部從索引中獲取,則使用全索引掃描。
  1. index fast full scan

索引快速掃描,掃描索引中的全部的數據塊,與全索引掃描的方式基本上類似。兩者之間的明顯的區別是,索引快速掃描對查詢的數據不進行排序,數據返回的時候不是排序的。“在這種存取方法中,可以使用多塊讀功能,也可以使用並行讀入,從而得到最大的吞吐量和縮短執行時間”。

總結二:可能不走索引的情況

1、where 中字段沒創建索引,不走索引。

2、長時間沒做表分析或者重新收集表狀態信息,不走索引。

3、索引列使用函數,需建立函數索引。

4、對索引列進行了加減乘除運算,不走索引。

5、where中使用 is null 和 is not null。

6、where中使用 like '%%' 進行模糊查詢。

7、where中使用<>、not in 、not exist。

8、數據類型不匹配,例如:select * from tablewhere jlbh = 1;jlbh爲varchar2類型字段

9、單獨引用複合索引裏非第一位置的索引列。

10、索引失效,可以考慮重建索引,rebuild online。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章