如何檢視SqlServer查詢語句的執行效率

時間 2021-07-18 17:45:20

1樓:sql的藝術

使用語句查詢sql server執行過的語句及執行效率

2樓:愛可生雲資料庫

sql 語句摘要可以用在mysql的各個方面,比如 效能字典裡對語句的分析,查詢重寫外掛規則改寫等等。

接下來依次看下語句摘要在這兩方面的使用。

1. 效能字典

mysql> call sys.ps_setup_enable_consumer('statements');

+---------------------+

| summary |

+---------------------+

| enabled 4 consumers |

+---------------------+

1 row in set (0.00 sec)

query ok, 0 rows affected (0.00 sec)

開啟後,執行幾次之前的幾條 sql。

完後可以很方便的從 sys 庫裡分析這類語句的執**況,包括執行次數,執行時間,掃描的記錄數,鎖定的時間,是否用到排序等等。

2. 查詢重寫外掛

比如要阻止對錶 p1 通過欄位 r1 的刪除動作,可以用查詢重寫外掛在 mysql 語句分析層直接轉換,這時候就得用到摘要函式 statement_digest_text。

假設:表 p1 欄位 id 值全部為正。

delete from p1 where id = 1000;

要改寫為,

delete from p1 where id = -1;

利用函式 statement_digest_text 來定製這條 sql 的重寫規則。

mysql> insert into query_rewrite.rewrite_rules (pattern, replacement,pattern_database) -> values( -> statement_digest_text('delete from p1 where id = 1000') , -> statement_digest_text('delete from p1 where id = -1'), -> 'ytt' -> );query ok, 1 row affected (0.01 sec)

語句被查詢重寫後的效果:

mysql> delete from p1 where id = 20000;query ok, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings\g*************************** 1. row *************************** level: note code:

1105message: query 'delete from p1 where id = 20000' rewritten to 'delete from `p1` where `id` = - 20000' by a query rewrite plugin1 row in set (0.00 sec)mysql> select count(*) from p1;+----------+| count(*) |+----------+| 9000001 |+----------+1 row in set (1.

59 sec)

總結mysql 8.0 新增的語句摘要函式可以很方便的分析 sql 語句執行的各個方面,比以前分析類似的場景要簡單的多。

如何檢視sqlserver執行計劃來判斷sql語句效率

3樓:匿名使用者

檢測mysql中sql語句的效率的方法

1、通過查詢日誌

(1)、windows下開啟mysql慢查詢

mysql在windows系統中的配置檔案一般是是my.ini找到[mysqld]下面加上

**如下

log-slow-queries = f:/mysql/log/mysqlslowquery。log

long_query_time = 2

(2)、linux下啟用mysql慢查詢

mysql在windows系統中的配置檔案一般是是my.cnf找到[mysqld]下面加上

**如下

log-slow-queries=/data/mysqldata/slowquery。log

long_query_time=2

說明log-slow-queries = f:/mysql/log/mysqlslowquery。

為慢查詢日誌存放的位置,一般這個目錄要有mysql的執行帳號的可寫許可權,一般都將這個目錄設定為mysql的資料存放目錄;

long_query_time=2中的2表示查詢超過兩秒才記錄;

2.show processlist 命令

show processlist顯示哪些執行緒正在執行。您也可以使用mysqladmin processlist語句得到此資訊。

各列的含義和用途:

id列一個標識,你要kill一個語句的時候很有用,用命令殺掉此查詢 /*/mysqladmin kill 程序號。

user列

顯示單前使用者,如果不是root,這個命令就只顯示你許可權範圍內的sql語句。

host列

顯示這個語句是從哪個ip的哪個埠上發出的。用於追蹤出問題語句的使用者。

db列顯示這個程序目前連線的是哪個資料庫。

command列

顯示當前連線的執行的命令,一般就是休眠(sleep),查詢(query),連線(connect)。

time列

此這個狀態持續的時間,單位是秒。

state列

顯示使用當前連線的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個 sql語句,以查詢為例,可能需要經過copying to tmp table,sorting result,sending data等狀態才可以完成

info列

顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。

這個命令中最關鍵的就是state列,mysql列出的狀態主要有以下幾種:

checking table

正在檢查資料表(這是自動的)。

closing tables

正在將表中修改的資料重新整理到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁碟空間是否已經滿了或者磁碟是否正處於重負中。

connect out

複製從伺服器正在連線主伺服器。

copying to tmp table on disk

由於臨時結果集大於tmp_table_size,正在將臨時表從記憶體儲存轉為磁碟儲存以此節省記憶體。

creating tmp table

正在建立臨時表以存放部分查詢結果。

deleting from main table

伺服器正在執行多表刪除中的第一部分,剛刪除第一個表。

deleting from reference tables

伺服器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。

flushing tables

正在執行flush tables,等待其他執行緒關閉資料表。

killed

傳送了一個kill請求給某執行緒,那麼這個執行緒將會檢查kill標誌位,同時會放棄下一個kill請求。mysql會在每次的主迴圈中檢查kill標誌位,不過有些情況下該執行緒可能會過一小段才能死掉。如果該執行緒程被其他執行緒鎖住了,那麼kill請求會在鎖釋放時馬上生效。

locked

被其他查詢鎖住了。

sending data

正在處理select查詢的記錄,同時正在把結果傳送給客戶端。

sorting for group

正在為group by做排序。

sorting for order

正在為order by做排序。

opening tables

這個過程應該會很快,除非受到其他因素的干擾。例如,在執alter table或lock table語句行完以前,資料表無法被其他執行緒開啟。正嘗試開啟一個表。

removing duplicates

正在執行一個select distinct方式的查詢,但是mysql無法在前一個階段優化掉那些重複的記錄。因此,mysql需要再次去掉重複的記錄,然後再把結果傳送給客戶端。

reopen table

獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉資料表,正嘗試重新開啟資料表。

repair by sorting

修復指令正在排序以建立索引。

repair with keycache

修復指令正在利用索引快取一個一個地建立新索引。它會比repair by sorting慢些。

searching rows for update

正在講符合條件的記錄找出來以備更新。它必須在update要修改相關的記錄之前就完成了。

sleeping

正在等待客戶端傳送新請求.

system lock

正在等待取得一個外部的系統鎖。如果當前沒有執行多個mysqld伺服器同時請求同一個表,那麼可以通過增加--skip-external-locking引數來禁止外部系統鎖。

upgrading lock

insert delayed正在嘗試取得一個鎖表以插入新記錄。

updating

正在搜尋匹配的記錄,並且修改它們。

user lock

正在等待get_lock()。

waiting for tables

該執行緒得到通知,資料表結構已經被修改了,需要重新開啟資料表以取得新的結構。然後,為了能的重新開啟資料表,必須等到所有其他執行緒關閉這個表。以下幾種情況下會產生這個通知:

flush tables tbl_name, alter table, rename table, repair table, analyze table,或optimize table。

waiting for handler insert

insert delayed已經處理完了所有待處理的插入操作,正在等待新的請求。

大部分狀態對應很快的操作,只要有一個執行緒保持同一個狀態好幾秒鐘,那麼可能是有問題發生了,需要檢查一下。

還有其他的狀態沒在上面中列出來,不過它們大部分只是在檢視伺服器是否有存在錯誤是才用得著。

sql server如何查詢第幾到幾的資料而且按錄入時間先後順序排序

第10 20條記錄 select top 10 from table where id not in select top 10 id from table order by time desc 可以採用臨時表和加入序號的方式實現 插入資料時先按日期排好序 select identity int,1...

SQL SERVER自增資料表,如何查詢自增值的最大值

使用max函式即可。如 id name 1 張三 2 李四 3 王五 4 趙六 5 孫七 其中id是自增欄位。使用sql語句如下 select max id id from 表名 結果顯示為5,則5就是這個自增欄位的最大值。問題補充 比如,現在資料庫裡邊這個自增欄位存在的值是5,6可能已經被人刪掉了...

怎麼在sqlserver查詢分析器中查詢指定日期的資料

可對錶中的日期資料進行轉換,轉成字元查詢。如,要查student表中createtime為2015 08 1的資料進行篩選,可用如下語句 select from student where convert varchar 10 createtime,120 2015 08 01 其中,這裡用到了co...