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

sqlserverspid

發布時間: 2022-10-21 15:47:53

A. 是什麼意思,sql,死鎖中spid是啥

SQL Server中的SPID,是唯一的sessionID

像.net中的session一樣,如果能知道了資料庫中的sessionID,那所有的操作都能知道了,因為有了這個唯一的身份識別的標識。

可以做的事情有很多,如:當前哪個用戶在做什麼操作,在執行什麼sql, 又如一個比較大的邏輯中要分別執行很多存儲過程,

在執行這些存儲過程的過程當中,你想知道當前執行的進度,SQLServer正在執行哪個段sql語句,那麼通過sessionID是很容易

就得到這些信息的。

SQL Server 得到SPID,唯一的sessionID:

SELECT @@SPID

以前我一直不知道,最近又裝了SQLServer2014,發現每開一個Query 界面就有一個ID出來。我就特別想知道怎麼取sessionID.

下面的存儲過程是用來查看哪些sessionID正在執行什麼操作。

createPROC[dbo].[dba_WhatSQLIsExecuting]
AS

BEGIN
--Donotlockanything,anddonotgethelpbyanylocks.--?
SELECT[Spid]=session_Id
,ecid
,[Database]=DB_NAME(sp.dbid)
,[User]=nt_username
,[Status]=er.status
,[Wait]=wait_type
,[IndivialQuery]=SUBSTRING(qt.text,
er.statement_start_offset/2,
(CASEWHENer.statement_end_offset=-1
THENLEN(CONVERT(NVARCHAR(MAX),qt.text))*2
ELSEer.statement_end_offsetEND-
er.statement_start_offset)/2)
,[ParentQuery]=qt.text
,Program=program_name
,Hostname
,nt_domain
,start_time
FROMsys.dm_exec_requestser
INNERJOINsys.sysprocessesspONer.session_id=sp.spid
CROSSAPPLYsys.dm_exec_sql_text(er.sql_handle)asqt
WHEREsession_Id>50--Ignoresystemspids.
ANDsession_IdNOTIN(@@SPID)--Ignorethiscurrentstatement.
--andDB_NAME(sp.dbid)='RangeCheckTool'
ORDERBY1,2
END

B. sqlserver 死鎖圖怎麼解決

1、首先需要判斷是哪個用戶鎖住了哪張表.
查詢被鎖表

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'

查詢後會返回一個包含spid和tableName列的表.
其中spid是進程名,tableName是表名.
2.了解到了究竟是哪個進程鎖了哪張表後,需要通過進程找到鎖表的主機.
查詢主機名

exec sp_who2 'xxx'

xxx就是spid列的進程,檢索後會列出很多信息,其中就包含主機名.
3.通過spid列的值進行關閉進程.
關閉進程

declare @spid intSet @spid = xxx --鎖表進程declare @sql varchar(1000)set @sql='kill '+cast(@spid as varchar)exec(@sql)

C. sqlServer查看死鎖及解鎖

--查看死鎖

select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name 

from sysprocesses 

where spid in 

( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0) 

--解鎖

kill 進程號(spid)

D. 如何獲得sqlserver資料庫中佔用高cpu用戶的活動內容

一個死循環,讓我的sql資料庫的cpu一下到了100%,我不得不花了一些時間,將這個死循環找出來了。。。
[@more@]
1、從微軟站點上下載qslice_setup.exe
2、打開Query
Analyzer,運行以下語句:
declare
@a
int
while
(1<2)
begin
select
@a=1
end
將會發現cpu馬上達到100%
3、打開qlice.exe,將發現sqlserver.exe的cpu佔用率很高,雙擊進入,出行sqlserver.exe中具體線程的執行情況
4、活動運行cpu高的那個id,為16進制的,先將他轉換為10進制
5、將這個10進制數,作為參數運行以下查詢:
select
spid
from
sysprocesses
where
kpid=1756
6、將這個spid運行的sql導出:
DBCC
TRACEON(3604)
DBCC
INPUTBUFF(57)
7、殺掉這個spid
kill
57
over

E. sqlserver怎麼清除死鎖

查詢語句的表名後加(nolock)少用臨時表和group by HAVING。

F. 有人知道為什麽SQLSERVER的spid是從50開始的嗎

50以下都是SQLServer系統自帶的進程.
由於在windows之上sql server有一套自己的os,所以這些對於windows來說是線程的對於sql os是進程。
這也就是為什麼sys.sysprocesses而不是sys.systhread。

G. SQLServer資料庫收縮相關知識

SQL Server 資料庫採取預先分配空間的方法來建立資料庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁碟存儲空間的浪費。可以通過資料庫收縮技術對資料庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省伺服器的存儲的成本。

官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。

收縮後的資料庫不能小於資料庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。

比如:如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。

不能在備份資料庫時收縮資料庫。 反之,也不能在資料庫執行收縮操作時備份資料庫。

介紹:收縮指定資料庫中的數據文件大小。

語法格式:

參數說明:

介紹:收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。

語法格式:

參數說明:

例如,如果創建一個10MB 的文件,然後在文件仍然為空的時候將文件收縮為2 MB,默認文件大小將設置為2 MB。這只適用於永遠不會包含數據的空文件。

另附SqlServer常見問題解答

1)管理器不會主動刷新,需要手工刷新一下才能看到最新狀態(性能方面的考慮)
2)很少情況下,恢復進程被掛起了。這個時候假設你要恢復並且回到可訪問狀態,要執行:
RESTORE database dbname with recovery
這使得恢復過程能完全結束。
3)如果你要不斷恢復後面的日誌文件,的確需要使資料庫處於「正在還原狀態」,
這通常是執行下面命令:
RESTORE database dbname with norecovery

原來SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。我們可以通過DBCC MemoryStatus來查看內存狀態。

SQL SERVER運行時會執行兩種緩存:

1. 數據緩存:執行個查詢語句,SQL SERVER會將相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。

2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。

可以調用以下幾個DBCC管理命令來清理這些緩存:

但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server並不會因此釋放掉已經佔用的內存。SQL SERVER並沒有提供任何命令允許我們釋放不用到的內存。因此我們只能通過動態調整SQL SERVER可用的物理內存設置來強迫它釋放內存。

解決SQLSERVER內存佔用過高的方法:

1、清除所有緩存DBCC DROPLEANBUFFERS

2、調整SQLSERVER可使用的最大伺服器內存。

在SQL管理器,右擊實例名稱

在屬性實例屬性裡面找到內存選項

把最大內存改成合適的內存,確定後內存就會被強制釋放,然後重啟實例。再看看任務管理器,內存使用率就降下來啦。

1、查看連接對象

USE master

GO

--如果要指定資料庫就把注釋去掉

SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'

當前連接對象有67個其中『WINAME』的主機名,『jTDS』的進程名不屬於已知常用軟體,找到這台主機並解決連接問題。在360流量防火牆中查看有哪個軟體連接了伺服器IP,除之。

2、然後使用下面語句看一下各項指標是否正常,是否有阻塞,正常情況下搜索結果應該為空。

SELECT TOP 10

[session_id],

[request_id],

[start_time] AS '開始時間',

[status] AS '狀態',

[command] AS '命令',

dest.[text] AS 'sql語句',

DB_NAME([database_id]) AS '資料庫名',

[blocking_session_id] AS '正在阻塞其他會話的會話ID',

[wait_type] AS '等待資源類型',

[wait_time] AS '等待時間',

[wait_resource] AS '等待的資源',

[reads] AS '物理讀次數',

[writes] AS '寫次數',

[logical_reads] AS '邏輯讀次數',

[row_count] AS '返回結果行數'

FROM sys.[dm_exec_requests] AS der

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'

ORDER BY [cpu_time] DESC

查看是哪些SQL語句佔用較大可以使用下面代碼

--在SSMS里選擇以文本格式顯示結果

SELECT TOP 10

dest.[text] AS 'sql語句'

FROM sys.[dm_exec_requests] AS der

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50

ORDER BY [cpu_time] DESC

3、如果SQLSERVER存在要等待的資源,那麼執行下面語句就會顯示出會話中有多少個worker在等待

SELECT TOP 10

[session_id],

[request_id],

[start_time] AS '開始時間',

[status] AS '狀態',

[command] AS '命令',

dest.[text] AS 'sql語句',

DB_NAME([database_id]) AS '資料庫名',

[blocking_session_id] AS '正在阻塞其他會話的會話ID',

der.[wait_type] AS '等待資源類型',

[wait_time] AS '等待時間',

[wait_resource] AS '等待的資源',

[dows].[waiting_tasks_count] AS '當前正在進行等待的任務數',

[reads] AS '物理讀次數',

[writes] AS '寫次數',

[logical_reads] AS '邏輯讀次數',

[row_count] AS '返回結果行數'

FROM sys.[dm_exec_requests] AS der

INNER JOIN [sys].[dm_os_wait_stats] AS dows

ON der.[wait_type]=[dows].[wait_type]

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50

ORDER BY [cpu_time] DESC;

4、查詢CPU佔用最高的SQL語句

SELECT TOP 10

total_worker_time/execution_count AS avg_cpu_cost, plan_handle,

execution_count,

(SELECT SUBSTRING(text, statement_start_offset/2 + 1,

(CASE WHEN statement_end_offset = -1

THEN LEN(CONVERT(nvarchar(max), text)) * 2

ELSE statement_end_offset

END - statement_start_offset)/2)

FROM sys.dm_exec_sql_text(sql_handle)) AS query_text

FROM sys.dm_exec_query_stats

ORDER BY [avg_cpu_cost] DESC;

5、索引缺失查詢

SELECT

DatabaseName = DB_NAME(database_id)

,[Number Indexes Missing] = count(*)

FROM sys.dm_db_missing_index_details

GROUP BY DB_NAME(database_id)

ORDER BY 2 DESC;

SELECT TOP 10

[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)

, avg_user_impact

, TableName = statement

, [EqualityUsage] = equality_columns

, [InequalityUsage] = inequality_columns

, [Include Cloumns] = included_columns

FROM sys.dm_db_missing_index_groups g

INNER JOIN sys.dm_db_missing_index_group_stats s

ON s.group_handle = g.index_group_handle

INNER JOIN sys.dm_db_missing_index_details d

ON d.index_handle = g.index_handle

ORDER BY [Total Cost] DESC;

找到索引缺失的表,根據查詢結果中的關鍵次逐一建立索引。

H. 有人知道為什麽SQLSERVER的spid是從50開始的嗎

在 SQL Server 中,一個 spid 代表一個會話。由於以前版本中沒有 MARS,因此很普遍地就將 spid 與請求關聯在一起。普遍想到要檢索某個給定 spid 的 SQL 文本。普遍在多個系統過程中查找 spid 的執行統計。

I. sql 中blkby 與spid一樣代表什麼

SQL Server 中,一個 spid 代表一個會話.
------解決方案--------------------
你每次select @@spid都一樣,是因為你在SQLServerManagementstudio(簡稱SSMS)中的那個執行語句的頁面其實spid就是54,你打開新頁面再執行,肯定不一樣。普及一下,spid<=50的是系統的會話,所以平時查詢,最好加>50。