『壹』 Mysql學會查看sql的執行計劃
首先在Mysql的服務中有 連接器、查詢緩存(Mysql8 已經刪除)、分析器、優化器、執行器等,所有跨存儲引擎的功能都在這一層實現
而一條sql怎麼執行是由優化器決定的, 優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的連接順序。
而執行計劃就是優化器優化後的sql的執行的詳細方案
Mysql中查看執行計劃的方式有兩種 : 1. 使用desc 2.使用 explain 使用它倆的效果是一樣的
接下來要通過執行計劃知道sql是怎麼執行的
執行計劃中有幾個重要的欄位, 分別是
id, table, type, possible_keys, key, key_len, Extra
id : 可以通過ID來查看在多表聯查中sql是先查詢哪張表的 id相同的從上往下依次執行,id不同的id大的先執行
table : table當然就是查詢的表名
type : 查詢的類型 查詢類型分為 ALL, index, range, ref , eq_ref, const(system), null
ALL: 指的全盤掃描,沒有走任何索引 查詢結果集大於25% 優化器可能會走全盤掃描 字元串查詢的時候一定要加"" 不然可能會全索引掃描(隱式轉換) 統計信息 失效 或者 過舊 也可能走全盤掃描 因為優化器會參考統計信息來制定執行計劃
index: 全索引掃描 就是掃描整顆索引樹
range: 索引范圍 查詢索引樹的一部分范圍 范圍索引中 > < <= >= like 的效率會比 or in 的效率高, 使用like %再前面的不走索引
ref: 輔助索引的等值查詢
當查詢的數據量小,優化器也有可能會走索引的全盤掃描 這里我就不貼圖了;
eq_ref : 多表連接查詢中,被連接的表的連接條件列是主鍵或者唯一鍵
const(system): 主鍵 或者 唯一鍵 的等值查詢
null: 沒有數據
他們的性能是依次遞增的 全盤掃描性能最差, const性能最高
possible_keys: 查詢過程中可能用到的索引
key: 真正使用到的索引
key_len: 走索引的長度
這個是怎麼計算的呢?
key_len 的計算方法 :
int 類型最長存儲4個位元組長度的數字 有not null 是4位元組 沒有的話會花1位元組存儲是不是null
tinyint 最大存儲一個位元組 也會花1位元組來判斷是不是null
字元串類型 : 字元集 utf8mb4 1-4位元組
varchar超過255會預留2個位元組存儲長度 沒超預留1個位元組
key_len 永遠是你設置的長度的最大的
聯合索引可以通過key_len 來判斷走了幾個索引
使用desc format=json select * from table 可以查看詳細情況
filtered: 索引掃描過濾掉數據的佔比
Extra: 額外的信息
Using filesort :MySQL 對數據在sql層進行了排序,而不是按照表內的索引進行排序讀 取。 效率比較低
Using temporary :使用臨時表保存中間結果,也就是說 MySQL 在對查詢結果排序時使用了臨時表,常見於order by 或 group by。
Using index :表示 SQL 操作中使用了覆蓋索引(Covering Index),避免了訪問表的數據行,效率高。
Using index condition :表示 SQL 操作命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。
Using where :表示 SQL 操作使用了 where 過濾條件。
Select tables optimized away :基於索引優化 MIN/MAX 操作或者 MyISAM 存儲引擎優化 COUNT(*) 操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即可完成優化。
Using join buffer (Block Nested Loop) :表示 SQL 操作使用了關聯查詢或者子查詢,且需要進行嵌套循環計算
『貳』 mySql輪詢排序,如圖,排值班表,如何使用sql語句實現排序
select * from
(select t1.id-t2.min_id+1 as new_id,t1.name,t1.other
from pai_ban_biao t1
inner join (select min(id) as min_id,name from pai_ban_biao group by name )t2
on t1.name=t2.name
)t3
order by t3.new_id,t3.other
『叄』 獲取SQL執行計劃的常見幾種方法
1. 預估執行計劃 - Explain Plan
Explain plan以SQL語句作為輸入,得到這條SQL語句的執行計劃,並將執行計劃輸出存儲到計劃表中。
首先,在你要執行的SQL語句前加explain plan for,此時將生成的執行計劃存儲到計劃表中,語句如下:
explain plan for SQL語句
然後,在計劃表中查詢剛剛生成的執行計劃,語句如下:
select * from table(dbms_xplan.display);
注意:Explain plan只生成執行計劃,並不會真正執行SQL語句,因此產生的執行計劃有可能不準,因為:
1)當前的環境可能和執行計劃生成時的環境不同;
2)不會考慮綁定變數的數據類型;
3)不進行變數窺視。
2. 查詢內存中緩存的執行計劃 (dbms_xplan.display_cursor)
如果你想獲取正在執行的或剛執行結束的SQL語句真實的執行計劃(即獲取library cache中的執行計劃),可以到動態性能視圖里查詢。方法如下:
1)獲取SQL語句的游標
游標分為父游標和子游標,父游標由sql_id(或聯合address和hash_value)欄位表示,子游標由child_number欄位表示。
如果SQL語句正在運行,可以從v$session中獲得它的游標信息,如:
select status, sql_id, sql_child_number from v$session where status='ACTIVE' and ....
如果知道SQL語句包含某些關鍵字,可以從v$sql視圖中獲得它的游標信息,如:
select sql_id, child_number, sql_text from v$sql where sql_text like '%關鍵字%『
2)獲取庫緩存中的執行計劃
為了獲取緩存庫中的執行計劃,可以直接查詢動態性能視圖v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子游標為參數,執行如下語句:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
3)獲取前一次的執行計劃:
set serveroutput off
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
3. 查詢歷史執行計劃(dbms_xplan.display_awr)
AWR會定時把動態性能視圖中的執行計劃保存到dba_hist_sql_plan視圖中,如果你想要查看歷史執行計劃,可以採用如下方法查詢:
select * from table(dbms_xplan.display_awr('sql_id');
4. 在用sqlplus做SQL開發是(Autotrace)
set autotrace是sqlplus工具的一個功能,只能在通過sqlplus連接的session中使用,它非常適合在開發時測試SQL語句的性能,有以下幾種參數可供選擇:
SET AUTOTRACE OFF ---------------- 不顯示執行計劃和統計信息,這是預設模式
SET AUTOTRACE ON EXPLAIN ------ 只顯示優化器執行計劃
SET AUTOTRACE ON STATISTICS -- 只顯示統計信息
SET AUTOTRACE ON ----------------- 執行計劃和統計信息同時顯示
SET AUTOTRACE TRACEONLY ------ 不真正執行,只顯示預期的執行計劃,同explain plan
5. 生成Trace文件查詢詳細的執行計劃 (SQL_Trace, 10046)
SQL_TRACE作為初始化參數可以在實例級別啟用,也可以只在會話級別啟用,在實例級別啟用SQL_TRACE會導致所有進程的活動被跟蹤,包括後台進程及所有用戶進程,這通常會導致比較嚴重的性能問題,所以在一般情況下,我們使用sql_trace跟蹤當前進程,方法如下:
SQL>alter session set sql_trace=true;
...被跟蹤的SQL語句...
SQL>alter session set sql_trace=false;
如果要跟蹤其它進程,可以通過Oracle提供的系統包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION來實現,例如:
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true) --開始跟蹤
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false) --結束跟蹤
生成trace文件後,再用tkprof 工具將sql trace 生成的跟蹤文件轉換成易讀的格式,語法如下:
tkprof inputfile outputfile
10046事件是SQL_TRACE的一個升級版,它也是追蹤會話,生成Trace文件,只是它裡面的內容更詳細,
『肆』 sql server 如何執行一項計劃任務
1、你必須開啟代理服務sql server agent
2、在企業管理器里,打開「管理—>sqlserver代理—>作業」,新增作業,新建「步驟」,在步驟里填入你要轉移的SQL語句到「命令」框里。然後新建「調度」。
3、啟動作業。
OK,自己試一下。
另外,如果你轉移的數據量比較大,還可以通過建立SQLSERVER數據復制的包來解決,然後在「步驟」里調用這個包就可以。SQLSERVER的數據復制技術,是多線程的,處理起來比較快。很久沒試了具體內容有點忘了。
『伍』 MSSQL資料庫中定時存儲的存儲過程
您好!要實現你要的功能;操作如下:
一、可以先寫好存儲過程的內容;放在目標資料庫中
二、在MSSQL的SQL server代理——〉作業——〉新建一個作業 在[常規]選項卡中 設置 名稱AUTOZY——〉在[步驟]選項卡中 點擊[新建作業]
三、在彈出的作業步驟窗口中;填寫步聚名稱(自己取一個)--運行身份選擇SA或者WINDOWS運行都可以---在資料庫處選擇 目標資料庫(這步很關鍵)---
在命令 處 寫 exec 存儲過程的名稱(這個不要寫錯)---點擊[確定] 返回上級窗口
四、選擇[計劃]選項卡 --在計劃窗口中可以具體設置怎麼樣定時運行的方案
五、設置好後 [確定]返回上級窗口---再點擊[確定]保存了這個作業
如有不明之處;歡迎CALL 我