會,oracle很智能的,注釋不影響sql的執行計劃,該走索引的還是會走索引的
② 分析SQL執行過程中,哪些SQL條件會走索引
這樣回答你,以下幾種情況sql中索引不會被用到
1、查詢謂詞沒有使用索引的主要邊界,換句話說就是select *,可能會導致不走索引。
比如,你查詢的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一個包含Y值的組合索引,但是優化器會認為需要一行行的掃描會更有效,這個時候,優化器可能會選擇TABLE ACCESS FULL,但是如果換成了SELECT Y FROM T WHERE Y = XXX,優化器會直接去索引中找到Y的值,因為從B樹中就可以找到相應的值。
2、單鍵值的b樹索引列上存在null值,導致COUNT(*)不能走索引。
如果在B樹索引中有一個空值,那麼查詢諸如SELECT COUNT(*) FROM T 的時候,因為HASHSET中不能存儲空值的,所以優化器不會走索引,有兩種方式可以讓索引有效,一種是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把這個列的屬性改為not null (不能為空)。
3、索引列上有函數運算,導致不走索引
如果在T表上有一個索引Y,但是你的查詢語句是這樣子SELECT * FROM T WHERE FUN(Y) = XXX。這個時候索引也不會被用到,因為你要查詢的列中所有的行都需要被計算一遍,因此,如果要讓這種sql語句的效率提高的話,在這個表上建立一個基於函數的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));這種方式,等於Oracle會建立一個存儲所有函數計算結果的值,再進行查詢的時候就不需要進行計算了,因為很多函數存在不同返回值,因此必須標明這個函數是有固定返回值的。
4、隱式轉換導致不走索引。
索引不適用於隱式轉換的情況,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一個索引,但是Y列是VARCHAR2的,那麼Oracle會將上面的5進行一個隱式的轉換,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,這個時候也是有可能用不到索引的。
5、表的資料庫小或者需要選擇大部分數據,不走索引
在Oracle的初始化參數中,有一個參數是一次讀取的數據塊的數目,比如你的表只有幾個數據塊大小,而且可以被Oracle一次性抓取,那麼就沒有使用索引的必要了,因為抓取索引還需要去根據rowid從數據塊中獲取相應的元素值,因此在表特別小的情況下,索引沒有用到是情理當中的事情。
6、cbo優化器下統計信息不準確,導致不走索引
很長時間沒有做表分析,或者重新收集表狀態信息了,在數據字典中,表的統計信息是不準確的,這個情況下,可能會使用錯誤的索引,這個效率可能也是比較低的。
7、!=或者<>(不等於),可能導致不走索引,也可能走 INDEX FAST FULL SCAN
例如select id from test where id<>100
8、表欄位的屬性導致不走索引,字元型的索引列會導致優化器認為需要掃描索引大部分數據且聚簇因子很大,最終導致棄用索引掃描而改用全表掃描方式,
由於字元型和數值型的在insert的時候排序不同,字元類型導致了聚簇因子很大,原因是插入順序與排序順序不同。詳細點說,就是按照數字類型插入(1..3200000),按字元類型('1'...'32000000')t排序,在對字元類型使用大於運算符時,會導致優化器認為需要掃描索引大部分數據且聚簇因子很大,最終導致棄用索引掃描而改用全表掃描方式。
③ db2如何確定sql有沒有走索引
首先在創建完索引之後,先運行:
runstats on table schema.tablename and detailed indexes all
運行完統計後再分析你要執行的SQL語句,看索引能否用的上。
DB2是按照成本來進行語句執行的優化的,只要你正確的運行了統計,一般情況下,會優先選擇使用索引。
也有部分情況下不會使用索引。比如某個cloumn,同時創建了在索引1和索引2中,那DB2到底會選擇索引1和索引2,就要看他認為使用哪個索引的成本低了。
很多不使用索引的情況是因為你們有做完正確的統計。
所以首先建議你先針對該表做一下完整的統計,命令見上。
④ 什麼樣的sql不走索引
有幾種情況:
where條件中如果使用了in關鍵字,肯定不會使用索引;
where條件中使用了like關鍵字,並且是以'%'開頭的,肯定不會用索引;
having條件一般不會用索引
⑤ 一個簡單的sql為什麼沒走索引
走不走索引是由Oracle自己決定的。
Oracle做決定是基於統計信息的。
用綁定變數,傳入變數之前,SQL執行計劃就必須已經就緒了,所以可能會出現判斷錯誤的結果。
自己拼接SQL,Oracle解析的時候會判斷這個變數,根據統計信息決定走什麼樣的執行計劃。
還有,如果索引維護出現問題,使用索引可能會得出和常規查詢不一樣的(錯誤的)結果,這時無論如何都不會走索引。
如果「analyze表之後,帶參數的sql也走索引了。但我發現一天以後這個毛病就又返了」
說明你的這個表每天都會發生不規范的變化,破壞了索引。
⑥ sql 自定義函數會使用索引嗎
可以的
例如
select test_uf('參數')from 表
這樣肯定是可以的
⑦ 為什麼該SQL的執行計劃不走索引
建議你收集兩個表的統計信息,只要統計信息足夠新,oracle就會自動選擇最優的執行計劃,走不走索引取決於最優的執行計劃是否啟用索引比不用索引成本更低。如果你要人為影響Oracle的執行計劃的話,可以給語句加上提示 /*+ use_index (table_name index_name) */ 不過這個只是給oracle提供了一個建議,如果oracle有足夠的統計信息,並且使用索引成本更高的話,那麼oracle也不會去使用索引,當然如果oracle沒有更好的選擇的話,就會受提示的影響,改變執行計劃。