⑴ 請教一個sql使用parallel hint的問題
測試了第一種方式:
設置了index的parallel degree後
在9.2.0.1和9.2.0.8下
select count(1) from xx_test;如果使用這個語句的話,則不會並發(10g後就會並發)
select /*+ parallel(t,4) count(1) from xx_test t;可以並發查詢,但是需要在enable parallel query之後可以並行.
在10.2.0.1資料庫下
select count(1) from xx_test;
select /*+ parallel(t,4) count(1) from xx_test t;
上面兩個都會並行查詢,前提都是要enable parallel query.
對於使用parallel_index hint的第二種方法
我在10g中測試沒有問題,但是在9i中我使用下面的語句卻不會並行
select /*+ parallel_index(xx_test,4) */ count(1) from xx_test;
第三種方法在兩個版本中都沒有問題
select /*+ parallel(t,4)full(t) */
⑵ 我的sql語句不走索引。(求Oracle高手幫助)
有時候不走索引更快些
select sum(decode(sign(a306-1.5),1,1))/sum(1) from a03;
這個語句執行看看.如果返回的值大於0.1 不用索引是正常的.
⑶ SQL語句中INDEX函數
1。這是oracle語法
2。 /*+ INDEX(SLMS_TRALOG_T SLMS_TRALOG_CALLED_IDX ) */ 意思是,在這個查詢中使用SLMS_TRALOG_T表的SLMS_TRALOG_CALLED_IDX索引,當然後邊的where條件中會用到這個索引
補充一點,這個不叫INDEX函數,叫強制使用索引
⑷ 使用事務為什麼會使sql得到優化
1. 在長時間運行的查詢和短查詢中使用事務
如果預期有一個長時間運行的查詢,並且有大量的數據輸出時,開發者就應該在BEGIN TRAN 和END TRAN之間使用事務。
這樣事務會在緩沖區緩存為獨立事務,並會被分配特定內存,以此來提高處理速度。
2. 不要使用SELECT *
如果使用SELECT * 來選擇表中的所有記錄,那麼一些不必要的記錄也被讀取、緩存,增加了磁碟的I/O和內存消耗。
3. 避免在WHERE子句中使用顯式或隱式函數,比如Convert ()
4. 避免在觸發器中執行長時間的操作
5. 適當使用臨時表和表變數
當結果集較小的時候,請盡量使用表變數;當結果集相當大時,使用臨時表。
6. 使用連接(JOIN)代替子查詢(Sub-Queries)
子查詢通常作為內聯代碼來使用,而連接(JOIN)則作為表來使用,這樣速度會更快。所以,應盡量避免在連接中使用子查詢。
7. 連接條件中表的順序
在連接條件中,應盡量首先使用較小的表,然後逐步使用較大的表。
8. 循環優化
如果操作在循環內部沒有任何影響,那麼應盡量將操作放到循環外面,這樣可以減少不必要的重復工作。因為,SQL Server優化器不會自動識別這種低效率的代碼,更不會自動優化(其他一些語言的編譯器可以)。
9. 參數探測
不要在正執行的SP(存儲過程)中使用SP參數,這樣會導致參數探測(Parameter Sniffing)。應該在聲明和設置後再使用SP參數。由於這個原因,SP的行為在每次運行期間都不相同。
10. 當使用條件語句時,可以使用Index(索引)Hint(提示)
比如在SQL Server 2008中,可以使用Index hint,也可以使用fixed plan hint強制在查詢中使用hint,以提高運行速度。
⑸ sql中有一些*/+ /*之類的符號是什麼意思
Oracle中這種東西叫做hint,是一種優化SQL的工具。不同的hint會導致不同的優化模式。
例如一句SQL可能這樣寫:
select
a.id,
a.name
from
a,
b
where
a.date=b.date
假如這個語句執行起來很慢。我們就可以用hint指定某一種優化模式,使運行速度加快。比如說指定選用a表的a_indx這個索引,及b表的b_indx這個索引,可以寫作
select
/*+
index(a
a_indx)
index(b
b_indx)
*/
a.id,
a.name
from
a,
b
where
a.date
=
b.date
這樣就實現了對SQL的優化。除了index這個hint以外,還有all_rows,
first_rows,等等。
這個網站提供一個教程:http://oracle.chinaitlab.com/optimize/14380.html
⑹ 如何寫好復雜sql的hint
你這個問題有點難回答,就oracle的hints來說,有的時候使用起來反而效果不好,所以一般並不指定hints,而交給oracle自行選擇優化方案來處理。如果確實需要,也是具體分析並反復實驗才能找到最佳方法。比如
/*+ INDEX_FFS(TABLE INDEX_NAME) */
對指定的表執行快速全索引掃描,而不是全表掃描的辦法
/*+ INDEX_DESC(TABLE INDEX_NAME)*/
表明對表選擇索引降序的掃描方法.
/*+ INDEX(TABLE INDEX_NAME) */
表明對表選擇索引的掃描方法.
。。。。。等等。
使用hints只能作為優化查詢的措施之一,從根本上解決還要想其他辦法,如使用負載均衡、分區表、物化視圖、合理的索引等等。
⑺ sql中有一些*/+ /*之類的符號是什麼意思
Oracle中這種東西叫做hint,是一種優化SQL的工具。不同的hint會導致不同的優化模式。
例如一句SQL可能這樣寫:
select a.id, a.name
from a, b
where a.date=b.date
假如這個語句執行起來很慢。我們就可以用hint指定某一種優化模式,使運行速度加快。比如說指定選用a表的a_indx這個索引,及b表的b_indx這個索引,可以寫作
select /*+ index(a a_indx) index(b b_indx) */
a.id, a.name
from a, b
where a.date = b.date
這樣就實現了對SQL的優化。除了index這個hint以外,還有all_rows, first_rows,等等。
這個網站提供一個教程:http://oracle.chinaitlab.com/optimize/14380.html
⑻ oracle 的hint有什麼用
相對而言ORACLE優化器已經非常智能,產生的執行計劃也是最優的,但是ORACLE還是提供了一些hint供用戶顯示的控制執行計劃,因為大千世界各種各樣的業務都有,ORACLE優化器生成的執行計劃並不一定適用於所有業務,同時hint對於DBA而言更是一件利器,我們可以通過hint看到優化後的執行計劃,總結一下常用hint。1.全表掃描hintfull(table_name)相對而言,全表掃描hint使用場合較少,但是要知道,全表掃描並不一定比索引效率低,特別是查詢表中80%以上的資料庫,全表掃描的效率要高於索引掃描。2.索引hintindex(table_nameindex_name)這兩種hint一個是強制使用索引,另一個是強制執行計劃不要走索引,什麼用呢?常用於SQL調優過程中對比索引和非索引掃描。3.索引快速掃描hintindex_ffs(table_nameindex_name)這種索引稱之為索引快速掃描,常用於統計索引列鍵值的個數,如count(object_id),跟全表掃描很像,但效率要比全表掃描要高很多,也就是執行計劃中看到的FASTFULLSCN。4.索引跳躍掃描hintindex_ss(table_nameindex_name)該hint在執行計劃中就是傳說中的INDEXSKIPSCAN這個對新手而言不太好理解,舉個例子索引有兩個列(A,B)類型組合索引,但是查詢中where條件只有B沒有Aselect*fromwhereb=1,此時ORACLE優化器走的索引就是所謂的索引跳躍掃描,只在CBO下適用,在RBO不適用。5.表關聯hintuser_nl(table_name1table_name2)此hint是表之間關聯效率最高的一種,通常用於一大一小兩表之間進行關聯查詢,小表作驅動表進行全表掃描,大表上要求有索引,走索引掃描,代價最低。6.表關聯hintuse_hash(table_name1table_name2)如果兩個表一大一小,但是大表沒有索引就會選擇HASH,如果兩個結果集比較小還可以承受,但是如果兩個較大的表HASH的話,會直接將資料庫HANG住,最好避免這種演算法7.表關聯hintuser_merge(table_name1table_name2)兩個表進行關聯,分別對全個表進行全表掃描後排序然後進行合並,排序既消耗內存又消耗CPU,總之代價比較大,常通過在兩個表上創建索引避免此類連接的發生。因此對比後發現,只有nested_loop方式進行關聯是最優的。8.表順序hintleading(table_name1table_name2)在RBO模式下,我們常常通過考慮from後面表的先後順序來進行SQL優化,但是此方法對RBO模式不再適用,CBO模式下按照順序選擇驅動表9.數據載入hintappend()直接路徑載入,對於大表操作極為有用,原理是什麼呢?打個比方,好比兩個超市理貨員,一人一箱貨需要上架到貨架上,一個人去找貨架中空閑位置去放,可能需要找N個空閑位,另一個人找一個空的貨架直接放上去,那個效果最高?當然是第二個,此hint的作用就是讓ORACLE找一個大空親塊直接存放新數據,而不是擠空閑位置去放新數據,如果此hint同時加上nologing聯合使用效果更高,常用於數據遷移項目中。10.dblink處理端hintdriving_site(table_name)此hint常用於通過dblink連接處理數據的業務,它的作用是將本地表推送到遠端資料庫進行關聯然後將結果返回,常用於本地表較小,遠端表較大的情況,效果很是不錯。11.數據返回模式hintfirst_rows該hint是影響數據返回模式hint,添加後ORACLE將邊處理邊返回,數據倉庫中用的比較多,但是在OLTP系統中也常見,上次系統優化就因為一兄弟在添加hint時,添加後發現執行計劃沒變,於是將原有的hintfirst_rows然後添加hintdriving_site(),執行計劃是變了,變化是因去去掉first_rows引起的,並且通過dblink遠端資料庫執行時查詢全變成的全表掃描,導致兩個業務大表hash,業務高峰直接將資料庫宕機,因此該hint添加或刪除一定要看遠端執行計劃有無發生變化,否則後果不開設想(切記)。