A. 通過分析sql語句的執行計劃優化SQL
如何干預執行計劃
-
-
使用hints提示
基於代價的優化器是很聰明的,在絕大多數情況下它會選擇正確的優化器,減輕了DBA的負擔。但有時它也聰明反被聰明誤,選擇了很差的執行計劃,使某個語句的執行變得奇慢無比。此時就需要DBA進行人為的干預,告訴優化器使用我們指定的存取路徑或連接類型生成執行計劃,從而使語句高效的運行。例如,如果我們認為對於一個特定的語句,執行全表掃描要比執行索引掃描更有效,則我們就可以指示優化器使用全表掃描。在Oracle中,是通過為語句添加hints(提示)來實現干預優化器優化的目的。
hints是oracle提供的一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計劃。我們可以用hints來實現:
1.
使用的優化器的類型
2.基於代價的優化器的優化目標,是all_rows還是first_rows。
3.
表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。
4.
表之間的連接類型
5.
表之間的連接順序
6.
語句的並行程度
除了」RULE」提示外,一旦使用的別的提示,語句就會自動的改為使用CBO優化器,此時如果你的數據字典中沒有統計數據,就會使用預設的統計數據。所以建議大家如果使用CBO或HINTS提示,則最好對表和索引進行定期的分析。
如何使用hints:
Hints只應用在它們所在sql語句塊(statement
block,由select、update、delete關鍵字標識)上,對其它SQL語句或語句的其它部分沒有影響。如:對於使用union操作的2個sql語句,如果只在一個sql語句上有hints,則該hints不會影響另一個sql語句。
我們可以使用注釋(comment)來為一個語句添加hints,一個語句塊只能有一個注釋,而且注釋只能放在SELECT,
UPDATE,
or
DELETE關鍵字的後面
使用hints的語法:
{DELETE|INSERT|SELECT|UPDATE}
/*+
hint
[text]
[hint[text]]...
*/
or
{DELETE|INSERT|SELECT|UPDATE}
--+
hint
[text]
[hint[text]]...
註解:
1.DELETE、INSERT、SELECT和UPDATE是標識一個語句塊開始的關鍵字,包含提示的注釋只能出現在這些關鍵字的後面,否則提示無效。
2.「+」號表示該注釋是一個hints,該加號必須立即跟在」/*」的後面,中間不能有空格。
3.hint是下面介紹的具體提示之一,如果包含多個提示,則每個提示之間需要用一個或多個空格隔開。
4.text
是其它說明hint的注釋性文本
如果你沒有正確的指定hints,Oracle將忽略該hints,並且不會給出任何錯誤。
B. 如何查看Oracle執行計劃,並通過執行計劃優化SQL
一、通過PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在窗口中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。
2、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執行計劃了,看到的結果和1中的一樣,所以使用工具的時候推薦使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。還有使用工具方法查看計劃看到的信息不全,有些時候我們需要sqlplus的支持。
C. 如何查看Oracle執行計劃,並通過執行計劃優化SQL
一、通過PL/SQL Dev工具 1、直接File->New->Explain Plan Window,在窗口中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。
D. 怎麼結合mysql的執行計劃來優化sql
一,SQL查詢優化:指,使用的語句是不是冗餘的,就是有沒有無用的。
你可用用explain 你的語句來比較分板一番。比如:select * from wc where 1;與select * from wc二者的執行時間不一樣的;
二,SQL執行計劃就是用於描述SQL引擎在執行一個sql語句時的所有步驟,通過執行計劃,我們可以知道哪個表是驅動表,如何訪問一個表:是通過索引訪問還是通過表掃描,如何進行連接:使用嵌套連接,合並連接還是哈希連接,連接的順序等等;
在我們處理執行計劃的過程中,一般有三個步驟:
獲取執行計劃
理解執行計劃
判斷其效率
2.獲取執行計劃的方式
Oracle提供了以下幾種方法獲得sql語句的執行計劃:
2.1 explain plan
這種方法用於給出當前的sql文本的評估的執行計劃,oracle並不會執行相應的sql語句,而且如果sql語句有綁定參數,那麼得到的執行計劃並不一定就是確切的執行計劃,還要根據條件中的列是否有直方圖和cursor_sharing參數的配置值來判斷。
a. 在sqlplus 中執行explain plan
SQL>Explain plan set sql_id=』mysql』 for select * from temp;
b. 使用dbms_xplan顯示執行計劃
select * from table(dbms_xplan.display());
或者:select * from table(dbms_xplan.display(statement_id => 『mysql』));
三,優化器;是SQL執行效率的重構工具。
可以幫助將低效率的SQL優化成為高效率的。
一般主要針對查詢語句。
將更多的判斷條件已到葉子節點上去操作。
E. SQL優化求助,附執行計劃
我不知你的DB是什麼,這里介紹Oracle的方法。
在dos中通過sqlplus登陸Oracle。
setheadon
setechoon
setfeedbackon
setautotracetraceonly
select*fromA,BwhereA.id=B.id;
explain plan如下:
F. 有沒有書介紹oracle sql語句的優化以及觀察oracle sql的執行計劃,根據執行計劃修改sql
《基於成本的oracle優化法則》
Cost Based Oracle Fundamentals
來自網路
G. 如何查看sqlserver執行計劃來判斷SQL語句效率
對於執行計劃,特別是2008,先看看有沒有丟失索引。然後看執行計劃裡面的圖標,哪個的百分比是最大的。重點優化那個。還要看有沒有表掃描、聚集索引掃描等。執行計劃是一本書才勉強說得完的東西。
H. sql 怎麼修改執行計劃 博客園
PersistenceConfig(持久層配置)
我們想要一個配置了所有可用倉庫的MONGODB配置。在這個簡單的應用中我們只用了一個倉庫,所以配置也非常的簡單:
@Configuration
class PersistenceConfig {
@Bean
public AccountRepository accountRepository() throws UnknownHostException {
return new MongoAccountRepository(mongoTemplate());
I. 優化SQL的另一種思維5 如何分析ORACLE執行計劃
《優化SQL的另一種思維》目錄一、性能調整綜述二、有效的應用設計三、SQL語句處理的過程四、ORACLE的優化器
七、整體實例分析客戶端程序優化SQL步驟tkprof程序整體實例解說
【IT專家網獨家】例1:假設LARGE_TABLE是一個較大的表,且username列上沒有索引
,則運行下面的語句:
SQLSELECT*FROMLARGE_TABLEwhereUSERNAME=『TEST』;
QueryPlan
-----------------------------------------
SELECTSTATEMENTOptimizer=CHOOSE(Cost=1234Card=1Bytes=14)
TABLEACCESSFULLLARGE_TABLE[:Q65001][ANALYZED]
在這個例子中,TABLE ACCESS FULL LARGE_TABLE是第一個操作,意思是在LARGE_TABLE表上做全表掃描。當這個操作完成之後,產生的row source中的數據被送往下一步驟進行處理,在此例中,SELECT STATEMENT操作是這個查詢語句的最後一步。
Optimizer=CHOOSE 指明這個查詢的optimizer_mode,即optimizer_mode初始化參數指定的值,它並不是指語句執行時真的使用了該優化器
。決定該語句使用何種優化器的唯一方法是看後面的cost部分。例如,如果給出的是下面的形式,則表明使用的是CBO優化器,此處的cost表示優化器認為該執行計劃的代價:
SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14)
然而假如執行計劃中給出的是類似下面的信息,則表明是使用RBO優化器,因為cost部分的值為空,或者壓根就沒有cost部分。
SELECT STATEMENT Optimizer=CHOOSE Cost=
SELECT STATEMENT Optimizer=CHOOSE
cost屬性的值是一個在oracle內部用來比較各個執行計劃所耗費的代價的值,從而使優化器可以選擇最好的執行計劃。不同語句的cost值不具有可比性,只能對同一個語句的不同執行計劃的cost值進行比較。
[:Q65001] 表明該部分查詢是以並行方式運行的。裡面的數據表示這個操作是由並行查詢的一個slave進程處理的,以便該操作可以區別於串列執行的操作。
[ANALYZED] 表明操作中引用的對象被分析過了,在數據字典中有該對象的統計信息可以供CBO使用。
例2:假定A、B、C都是不是小表,且在A表上一個組合索引:A(a.col1,a.col2) ,注意a.col1列為索引的引導列。
考慮下面的查詢:
J. oracle怎麼根據執行計劃調優sql
rdb和aof兩種方法都用上,多重保險。 appendfsync設為always。// 單節點測性能,連續100000次算平均時間,和per second比對,性能損失不大。 性能會有些許損失,但任務執行為非同步操作,無需用戶同步等待,為了保證數據安全,這樣是值得的。