當前位置:首頁 » 編程語言 » sql計劃任務和輪詢
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql計劃任務和輪詢

發布時間: 2023-08-29 10:23:34

『壹』 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 我