當前位置:首頁 » 編程語言 » sqlserver語句執行時間
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver語句執行時間

發布時間: 2023-01-06 13:09:26

sqlserver management studio 怎麼查看sql運行時間

有二種方式來查看正在執行的SQL語句

  • 使用SQL自帶的SQL Server Profiler,以可視化界面的方式來查看。

    從開始=》所有程序=》Microsoft SQL Server 2008=》性能工具打開Profiler工具,也可以打開SQL Server Management Studio=》工具=》SQL Server Profiler。

    然後選擇文件=》新建=》跟蹤打開一個連接窗口,選擇將要跟蹤的伺服器實例然後連接,並打開「跟蹤屬性」對話框,點運行即可看到正在執行的SQL語句。

  • 使用SQL語句來查看正在運行的語句,如下

    SELECT [Spid] = session_id , ecid , [Database] = DB_NAME(sp.dbid) , [User] = nt_username , [Status] = er.status , [Wait] = wait_type , [Indivial Query] = SUBSTRING(qt.text, er.statement_start_offset / 2, ( CASE WHEN er.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 ELSE er.statement_end_offset END - er.statement_start_offset ) / 2) , [Parent Query] = qt.text , Program = program_name , hostname , nt_domain , start_time FROM sys.dm_exec_requests er INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt WHERE session_id > 50 -- Ignore system spids. AND session_id NOT IN ( @@SPID ) -- Ignore this current statement.ORDER BY 1 , 2

Ⅱ sqlserver 計算設備運行時長

測試數據圖片在下面👇🏻。該解決方案使用了開窗函數lead,mysql8.0支持,我這是在hive上測試的。
大致思路為,只統計running->stopped的運行時間,stoppe->running的過濾掉,也不需要計算。
select
id,sum(next_diff_time)/60 running_time
from (
select id,lead(unix_timestamp(datetime),1,-1) over(partition by id order by datetime)-unix_timestamp(datetime) next_diff_time,status
from test
) tt
where status!='stopped'
group by id;


Ⅲ sqlserver 怎麼看存儲過程的上次執行時間

一般來說,最好記錄日誌(專門的日誌表),日誌中有datetime列

在存儲過程執行前,記錄一下日誌、存儲過程執行完,記錄一下日誌。

這樣就可以計算其執行的時間了,

並且還可以在執行過程中記錄一些重要的信息。

Ⅳ SQLSERVER語句 in和exists哪個效率高本人測試證明

最近很多人討論in和exists哪個效率高,今天就自己測試一下

我使用的是客戶的資料庫GPOSDB(已經有數據)

環境:SQLSERVER2005 Windows7

我的測試條件:兩個表作連接根據VC_IC_CardNO欄位,查出CT_InhouseCard表中的VC_IC_CardNO(卡號)在CT_FuelingData表中存在的記錄

前提:某些人可能在SQL語句中有多個in,或者多個exists,這些情況很難測試效率的,因為大家的條件都不相同

例如下面兩個SQL語句

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 ) AND OrderNo NOT IN (
6 SELECT OrderNo
7 FROM KK_DeliveryinfoTmp )
上面SQL語句IN裡面有IN和NOT IN

1 SELECT OrderNo, SiteCode, AreaCode
2 FROM SchelingProgram
3 WHERE ( AreaCode IN ( 'P', 'M' ) AND SiteCode IN ( SELECT SiteCode
4 FROM EnvBasicInfo
5 WHERE cityiD = 31 )
6 ) AND NOT EXISTS ( SELECT OrderNo
7 FROM KK_DeliveryinfoTmp
8 WHERE KK_DeliveryinfoTmp.OrderNo = SchelingProgram.OrderNo )
上面的SQL語句IN裡面又有NOT EXISTS

這樣的情況很難測試同等條件下IN語句和EXISTS語句的效率

還有一個非SARG運算符

在《SQLSERVER企業級平台管理實踐》的第424頁里提到:

SQLSERVER對篩選條件(search argument/SARG)的寫法有一定的建議

對於不使用SARG運算符的表達式,索引是沒有用的,SQLSERVER對它們很難使用比較優化的做法。非SARG運算符包括

NOT、<>、NOT EXISTS、NOT IN、NOT LIKE和內部函數,例如:Convert、Upper等

所以當您的表中有索引並且SQL語句包含非SARG運算符,那麼當測試SQL語句的執行時間的時候肯定相差很大,

因為有些SQL語句走索引,有些SQL語句不走索引

建表腳本

注意:兩個表中都有索引!!

CT_FuelingData表

1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_FuelingData] 腳本日期: 08/24/2013 11:00:34 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_FuelingData](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [I_FD_StationNo] [int] NOT NULL,
13 [VC_FD_No] [varchar](50) NOT NULL,
14 [VC_FD_Cardno] [varchar](50) NOT NULL,
15 [I_FD_CardStatus] [int] NULL,
16 [LI_FD_CTC] [bigint] NOT NULL,
17 [I_FD_TypeCode] [int] NULL,
18 [I_FD_PumpID] [int] NOT NULL,
19 [VC_FD_OilType] [varchar](50) NULL,
20 [DE_FD_Volume] [decimal](18, 2) NULL,
21 [DE_FD_Price] [decimal](18, 2) NULL,
22 [DE_FD_Amount] [decimal](18, 2) NULL,
23 [I_FD_Point] [decimal](10, 2) NULL,
24 [D_FD_DateTime] [datetime] NOT NULL,
25 [VC_FD_GroupNo] [varchar](50) NULL,
26 [D_FD_GroupDate] [datetime] NULL,
27 [DE_FD_CardAmount] [decimal](18, 2) NULL,
28 [DE_FD_VolumeTotals] [decimal](18, 2) NULL,
29 [DE_FD_AmountTotals] [decimal](18, 2) NULL,
30 [I_FD_ISSend] [int] NULL,
31 [VC_FD_CardMoneyauthFile] [varchar](50) NULL,
32 [D_Month] [datetime] NULL,
33 CONSTRAINT [PK_CT_FuelingData_1] PRIMARY KEY CLUSTERED
34 (
35 [VC_FD_No] ASC
36 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
37 ) ON [PRIMARY]
38
39 GO
40 SET ANSI_PADDING OFF
CT_InhouseCard表

1 USE [GPOSDB]
2 GO
3 /****** 對象: Table [dbo].[CT_InhouseCard] 腳本日期: 08/24/2013 10:59:58 ******/
4 SET ANSI_NULLS ON
5 GO
6 SET QUOTED_IDENTIFIER ON
7 GO
8 SET ANSI_PADDING ON
9 GO
10 CREATE TABLE [dbo].[CT_InhouseCard](
11 [RecordNO] [int] IDENTITY(1,1) NOT NULL,
12 [VC_IC_CardNO] [varchar](50) NOT NULL,
13 [VC_IC_PhysicalNO] [varchar](50) NULL,
14 [I_IC_CardType] [int] NULL,
15 [VC_IC_UserName] [varchar](50) NULL,
16 [VC_IC_JobNO] [varchar](50) NULL,
17 [VC_IC_UserID] [varchar](50) NULL,
18 [VC_IC_Password] [varchar](50) NULL,
19 [DE_IC_CardAmount] [decimal](18, 2) NULL,
20 [DE_IC_AppendAmount] [decimal](18, 2) NULL,
21 [DE_IC_ConsumerAmount] [decimal](18, 2) NULL,
22 [I_IC_ISLost] [int] NULL,
23 [D_IC_UsedDateTime] [datetime] NULL,
24 [D_IC_UselifeDateTime] [datetime] NULL,
25 [I_IC_IssueStationNO] [int] NULL,
26 [VC_IC_IssuerNO] [varchar](50) NULL,
27 [D_IC_IssueDateTime] [datetime] NULL,
28 [D_IC_LastUpdateDateTime] [datetime] NULL,
29 [I_IC_CardStatus] [int] NULL,
30 [VC_IC_Remark] [varchar](256) NULL,
31 CONSTRAINT [PK_CT_InhouseCard] PRIMARY KEY CLUSTERED
32 (
33 [VC_IC_CardNO] ASC
34 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
35 ) ON [PRIMARY]
36
37 GO
38 SET ANSI_PADDING OFF

測試腳本

因為這個是客戶的資料庫,本來裡面已經有數據了,所以在測試之前先更新兩個表的統計信息,以做到公正

1 USE [GPOSDB]
2 GO
3 UPDATE STATISTICS CT_FuelingData
4 UPDATE STATISTICS CT_InhouseCard
5 GO

IN語句

1 USE [GPOSDB]
2 GO
3 DBCC DROPCLEANBUFFERS
4 GO
5 DBCC FREEPROCCACHE
6 GO
7 SET STATISTICS IO ON
8 GO
9 SET STATISTICS TIME ON
10 GO
11 SET STATISTICS PROFILE ON
12 GO
13 SELECT * FROM [dbo].[CT_FuelingData] WHERE [VC_FD_Cardno] IN (SELECT [VC_IC_CardNO] FROM [dbo].[CT_InhouseCard])
EXISTS語句

1 USE [GPOSDB]
2 GO
3 DBCC DROPCLEANBUFFERS
4 GO
5 DBCC FREEPROCCACHE
6 GO
7 SET STATISTICS IO ON
8 GO
9 SET STATISTICS TIME ON
10 GO
11 SET STATISTICS PROFILE ON
12 GO
13 SELECT *
14 FROM [dbo].[CT_FuelingData]
15 WHERE EXISTS ( SELECT [VC_IC_CardNO]
16 FROM [dbo].[CT_InhouseCard]
17 WHERE [dbo].[CT_FuelingData].[VC_FD_Cardno] = [dbo].[CT_InhouseCard].[VC_IC_CardNO] )

測試結果

IN語句

1 SQL Server 執行時間:
2 CPU 時間 = 0 毫秒,佔用時間 = 2 毫秒。
3 SQL Server 分析和編譯時間:
4 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
5
6 SQL Server 執行時間:
7 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
8 SQL Server 分析和編譯時間:
9 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
10
11 SQL Server 執行時間:
12 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
13 SQL Server 分析和編譯時間:
14 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
15
16 SQL Server 執行時間:
17 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
18 SQL Server 分析和編譯時間:
19 CPU 時間 = 31 毫秒,佔用時間 = 67 毫秒。
20
21 (167 行受影響)
22 表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
23 表 'CT_FuelingData'。掃描計數 1,邏輯讀取 31 次,物理讀取 1 次,預讀 64 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
24 表 'CT_InhouseCard'。掃描計數 1,邏輯讀取 2 次,物理讀取 1 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
25
26 (4 行受影響)
27
28 SQL Server 執行時間:
29 CPU 時間 = 16 毫秒,佔用時間 = 192 毫秒。

EXISTS語句

1 SQL Server 分析和編譯時間:
2 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
3
4 SQL Server 執行時間:
5 CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。
6 SQL Server 分析和編譯時間:
7 CPU 時間 = 0 毫秒,佔用時間 = 34 毫秒。
8
9 (167 行受影響)
10 表 'Worktable'。掃描計數 0,邏輯讀取 0 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
11 表 'CT_FuelingData'。掃描計數 1,邏輯讀取 31 次,物理讀取 1 次,預讀 64 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
12 表 'CT_InhouseCard'。掃描計數 1,邏輯讀取 2 次,物理讀取 1 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
13
14 (4 行受影響)
15
16 SQL Server 執行時間:
17 CPU 時間 = 0 毫秒,佔用時間 = 163 毫秒。
大家可以看到除了執行時間有一點差別,IO是一樣的

因為數據量比較大,所以兩個查詢都用到了Worktable(中間表)來存儲中間結果

Ⅳ SqlServer怎麼定時跑一段SQL語句

1、首先打開SqlServer應用程序,點擊打開左側工具欄中的「作業」選項。

Ⅵ 怎樣控制ms sqlserver資料庫發布訂閱執行時間

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語句,以查詢為例,可能需要經過ing 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 plicates
正在執行一個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已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鍾,那麼可能是有問題發生了,需要檢查一下。
還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看伺服器是否有存在錯誤是才用得著。

Ⅶ 如何查看SqlServer查詢語句的執行效率

使用語句查詢SQL Server執行過的語句及執行效率

SELECTTOP1000
ST.textAS'執行的SQL語句',
QS.execution_countAS'執行次數',
QS.total_elapsed_timeAS'耗時',
QS.total_logical_readsAS'邏輯讀取次數',
QS.total_logical_writesAS'邏輯寫入次數',
QS.total_physical_readsAS'物理讀取次數',
QS.creation_timeAS'執行時間',
QS.*
FROMsys.dm_exec_query_statsQS
CROSSAPPLY
sys.dm_exec_sql_text(QS.sql_handle)ST
--WHEREQS.creation_timeBETWEEN'2015-08-0100:00:00'AND'2015-09-0211:00:00'
ORDERBY
QS.creation_timeDESC

Ⅷ sqlserver怎麼限制一個存儲過程或一條語句的執行時間

我覺得超時對於連接來說,也是一種異常,正常情況下,連接異常就回滾操作,關閉連接就好了

至於資料庫連接的建立,那是資料庫連接池做的工作呀,不影響的

Ⅸ 怎樣測試SQL語句執行所用的時間

如果是oracle的話在cmd下set timeing on
如果是sqlserver的話它直接就有顯示的
其他的不知道

Ⅹ 如何監控sqlserver 慢查詢

如何監控sqlserver 慢查詢
1,slow_query_log
這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。

2,long_query_time
當SQL語句執行時間超過此數值時,就會被記錄到日誌中,建議設置為1或者更短。

3,slow_query_log_file
記錄日誌的文件名。

4,log_queries_not_using_indexes
這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快。