回覆列表
  • 1 # 落魄人生

      部分常用hint。  1.全表掃描hint full(table_name)  相對而言,全表掃描hint使用場合較少,但是要知道,全表掃描並不一定比索引效率低,特別是查詢表中80%以上的資料庫,全表掃描的效率要高於索引掃描。  2.索引hint index(table_name index_name)  這兩種hint一個是強制使用索引,另一個是強制執行計劃不要走索引,什麼用呢?常用於SQL調優過程中對比索引和非索引掃描。3.索引快速掃描hint index_ffs(table_name index_name)  這種索引稱之為索引快速掃描,常用於統計索引列鍵值的個數,如count(object_id),跟全表掃描很像,但效率要比全表掃描要高很多,也就是執行計劃中看到的FAST FULL SCN。4.索引跳躍掃描hint index_ss(table_name index_name)  該hint在執行計劃中就是傳說中的 INDEX SKIP SCAN 這個對新手而言不太好理解,舉個例子索引有兩個列(A,B)型別組合索引,但是查詢中where條件只有B沒有A select * from where b=1,此時ORACLE最佳化器走的索引就是所謂的索引跳躍掃描,只在CBO下適用,在RBO不適用。 5.表關聯hint user_nl(table_name1 table_name2)  此hint是表之間關聯效率最高的一種,通常用於一大一小兩表之間進行關聯查詢,小表作驅動表進行全表掃描,大表上要求有索引,走索引掃描,代價最低。  6.表關聯hint use_hash(table_name1 table_name2)  如果兩個表一大一小,但是大表沒有索引就會選擇HASH,如果兩個結果集比較小還可以承受,但是如果兩個較大的表HASH的話,會直接將資料庫HANG住,最好避免這種演算法 7.表關聯hint user_merge(table_name1 table_name2)  兩個表進行關聯,分別對全個表進行全表掃描後排序然後進行合併,排序既消耗記憶體又消耗CPU,總之代價比較大,常透過在兩個表上建立索引避免此類連線的發生。因此對比後發現,只有nested_loop方式進行關聯是最優的。  8.表順序hint leading(table_name1 table_name2)  在RBO模式下,我們常常透過考慮from 後面表的先後順序來進行SQL最佳化,但是此方法對RBO模式不再適用,CBO模式下按照順序選擇驅動表9.資料載入hint append()  直接路徑載入,對於大表操作極為有用,原理是什麼呢?打個比方,好比兩個超市理貨員,一人一箱貨需要上架到貨架上,一個人去找貨架中空閒位置去放,可能需要找N個空閒位,另一個人找一個空的貨架直接放上去,那個效果最高?當然是第二個,此hint的作用就是讓ORACLE找一個大空親塊直接存放新資料,而不是擠空閒位置去放新資料,如果此hint同時加上nologing聯合使用效果更高,常用於資料遷移專案中。  10.dblink處理端hint driving_site(table_name)  此hint常用於透過dblink連線處理資料的業務,它的作用是將本地表推送到遠端資料庫進行關聯然後將結果返回,常用於本地表較小,遠端表較大的情況,效果很是不錯。  11.資料返回模式hint first_rows  該hint是影響資料返回模式hint,新增後ORACLE將邊處理邊返回,資料倉庫中用的比較多,但是在OLTP系統中也常見,上次系統最佳化就因為一兄弟在新增hint 時,新增後發現執行計劃沒變,於是將原有的hint first_rows 然後新增hint driving_site(),執行計劃是變了,變化是因去去掉first_rows引起的,並且透過dblink遠端資料庫執行時查詢全變成的全表掃描,導致兩個業務大表hash,業務高峰直接將資料庫宕機,因此該hint新增或刪除一定要看遠端執行計劃有無發生變化,否則後果不開設想(切記)。  特別需要注意的是,使用hint時切記查看錶名是否使用了別名,如果使用了別名,記得要在hint中也要使用別名,否則hint是沒有作用的(切記)

  • 2 # 半夏半心一夢嶼南涼

    如果索引欄位有非空約束的話,按理來說是可以走索引的,你可以用Hint試試。

    反之,肯定不會走。

  • 中秋節和大豐收的關聯?
  • 人力資源分為幾大模組?具體是什麼?