oracle 效能優化(一)

Nalternative發表於2011-05-19

SELECT BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID=2314
/
--WEB_ID上有索引,強制全表掃描,注意:如果表使用了別名那麼提示也必須使用別名
SELECT /*+ FULL(BU) */ BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID=2314
/
--指定多個提示:執行全表掃描和快取表名,用空格將多個提示分開
SELECT /*+ FULL(BU) CACHE(BU)*/ BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID=2314
/
--FIRST_ROWS一般會強制使用某些索引,而在正常環境下可能不會使用這些索引
SELECT COUNT(*)
FROM BLOG_USER----742643資料量

1、SELECT BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID>=2314


2、SELECT /*+ FIRST_ROWS(10) */ BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID>=2314


1、2兩者,第一個執行全表掃描,第二個會走索引, 第二個的代價就是檢索很多行時速度將會非常慢,在這個例子中也確實比第一個慢
/
--ALL_ROWS以最快速度檢索出所有行(最佳吞吐量)
/
--NO_INDEX提示 禁止優化器使用某個索引
SELECT /*+ NO_INDEX(BU IDX_BLOG_USER_WEBID) */ BLOG_ID ,WEBROOT
FROM BLOG_USER BU
WHERE BU.WEB_ID=2314

限制不使用多個索引

SELECT /*+ NO_INDEX(S IDX_STUDENT_NAME) NO_INDEX(C IDX_UN_CONNECTOR) NO_INDEX(C IDX_CONNECTOR_UNITID) NO_INDEX(U PK_UNIT) */ C.MOBILE
/
--INDEX_JOIN提示  將一個表的各個不同索引進行合併,這樣只需要訪問這寫索引就行了,節省了重新索引表的時間
1、
SELECT /*+ INDEX_JOIN( BU IDX_BLOG_USER_WEBID IDX_BLOG_USER_BLOGID) */ BLOG_ID ,WEB_ID
FROM BLOG_USER BU
WHERE BLOG_ID=213
AND WEB_ID=235
---==
 SELECT STATEMENT,7,1,12,0,0
  VIEW--index$_join$_001 (VIEW),7,1,12,0,0
   HASH JOIN,0,0,0,0,0
    INDEX (RANGE SCAN)--IDX_BLOG_USER_WEBID (INDEX),3,1,12,0,0
    INDEX (RANGE SCAN)--IDX_BLOG_USER_BLOGID (INDEX),3,1,12,0,0
 比使用索引並通過rowid掃描整個表要快5倍
               
2、
SELECT  BLOG_ID ,WEB_ID
FROM BLOG_USER BU
WHERE BLOG_ID=213
AND WEB_ID=235
 SELECT STATEMENT,4,1,12,0,0
  TABLE ACCESS (BY INDEX ROWID)--BLOG_USER (TABLE),4,1,12,0,0
   INDEX (RANGE SCAN)--IDX_BLOG_USER_WEBID (INDEX),3,1,0,0,0

/
--index_combine合併點陣圖索引
/
--index_asc  index_desc 升序掃描索引和降序掃描索引
/
--index_ffs 提示應該執行一次索引的快速全域性掃描。只訪問索引,而不是對應的表,只有查詢需要檢索的資訊都在索引上時才使用索引的快速全域性掃描。特別在表有很多列時,使用該提示可以極大地改善效能。
和index_join有點像啊


/
ordered 提示會按照具體的順序訪問表
/
--leading提示  當查詢的複雜程度增加時,可以指出先訪問哪一個表,但不可能知道下面將訪問哪個表。
/
---NO_EXPAND
SELECT /*+ FIRST_ROWS NO_EXPAND */ BLOG_ID,WEB_ID
FROM BLOG_USER BU
WHERE PROVINCE=1
AND    (BU.BLOG_ID BETWEEN 2341 AND 4561
OR     BU.BLOG_ID BETWEEN 43531 AND 53531
OR     BU.BLOG_ID BETWEEN 63531 AND 73531
OR     BU.BLOG_ID BETWEEN 83531 AND 93531);

0.317秒
/
SELECT   BLOG_ID,WEB_ID
FROM BLOG_USER BU
WHERE PROVINCE=1
AND    (BU.BLOG_ID BETWEEN 2341 AND 4561
OR     BU.BLOG_ID BETWEEN 43531 AND 53531
OR     BU.BLOG_ID BETWEEN 63531 AND 73531
OR     BU.BLOG_ID BETWEEN 83531 AND 93531);
1秒
/
--driving_site  提示用於處理實際連線的驅動站點
可以將很少行傳送到遠端站點上,而不是將整個遠端表傳送回本地站點來管理
/
--use_merge提示
/
--use_nl提示 使用巢狀迴圈  以最快速度返回第一行
/
--use_hash提示 必須擁有足夠大的hash_area_size
/
--push_subq 提示
/
--parallel提示 並行查詢
SELECT   /*+ parallel(BU) */BLOG_ID,WEB_ID
FROM BLOG_USER BU
WHERE PROVINCE=1
AND    (BU.BLOG_ID BETWEEN 2341 AND 4561
OR     BU.BLOG_ID BETWEEN 43531 AND 53531
OR     BU.BLOG_ID BETWEEN 63531 AND 73531
OR     BU.BLOG_ID BETWEEN 83531 AND 93531);
/
--no_parallel提示,如果建立表時已經設定了並行度,可以使用這個
/
--append 提示 不會檢查當前是否有插入操作所需要的塊空間,相反它會直接將資料新增到新塊中。
--noappend 提示
/
--cache提示
cache提示會將全表掃描全部快取(固定)到記憶體中,可以在建立表時使用cache選項,這樣在第一次訪問表時就可以對其進行快取
--nocache 提示

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25323853/viewspace-695795/,如需轉載,請註明出處,否則將追究法律責任。

相關文章