1. 程式人生 > 其它 >常用的SQL SERVER處理語句

常用的SQL SERVER處理語句

---------------------------------清理資料庫日誌-----------------------------------------------------------
DBCC SHRINKFILE (N'test_log' , 10)
第一個引數是日誌檔名,第二個引數是目標檔案大小,以M為單位。

如果出現了“由於最小日誌空間要求,無法收縮日誌檔案 2”錯誤提示,一般情況下是做了訂閱釋出
---------------------------------查詢資料庫名字-----------------------------------------------------------
SELECT NAME, size FROM sys.database_files
---------------------------------查詢表的記錄行數-----------------------------------------------------------
select a.name as '表名',b.rows as '表資料行數'
from sysobjects a inner join sysindexes b
on a.id = b.id
where a.type = 'u'
and b.indid in (0,1)
--and a.name not like 't%'
order by b.rows desc
-----------更改事務隔離級別,使用提交讀快照,該模式下會讀取事務已經提交更改後的資料,但是會造成事務如果執行失敗,再次之前讀取的資料會丟失的情況-------------
ALTER DATABASE TicketDistribution SET READ_COMMITTED_SNAPSHOT ON
---------------------------------殺掉資料當前所有連線-----------------------------------------------------------
DECLARE @SQL VARCHAR(MAX);
SET @SQL=''

SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID)
FROM master..sysprocesses
WHERE dbid=DB_ID('DB_CommonTotal');

EXEC(@SQL);
GO
ALTER DATABASE DB_CommonTotal SET SINGLE_USER;

---------------------------------訂閱釋出未完全刪除後的處理-----------------------------------------------------------
SELECT name,log_reuse_wait_desc FROM sys.databases where name='his'
DBCC LOGINFO('his')
EXEC sp_removedbreplication 'his'
DBCC SHRINKFILE (N'histmp_Log' , 1, TRUNCATEONLY)
---------------------------------解鎖帳戶-----------------------------------------------------------
‘帳戶當前被鎖定,所以使用者 'sa' 登入失敗。系統管理員無法將該帳戶解鎖’解決方法
如果短時間內不停連線,就會被SQL SERVER誤認為是這是攻擊,會將此賬號鎖定。
要用windows身份驗證登入,在查詢分析器裡輸入:
ALTER LOGIN sa ENABLE ;
GO
ALTER LOGIN sa WITH PASSWORD = 'password' unlock, check_policy = off,
check_expiration = off ;
GO
--------------------------------插入時間時判斷跟系統內記錄是否有重疊--------------------------------------------------------
declare @starttime datetime
declare @endtime datetime
declare @MinParValue int
declare @MaxParValue int
set @starttime='2014-6-17'
set @endtime='2014-6-17'
set @MinParValue=10
set @MaxParValue=20

--step 1 判斷表中是否有記錄 如果沒有記錄則直接插入
select count(1) from [CommissionSetting]
--step 2 判斷表中是否存在最大區間,如果記錄為0,並且step 1中的記錄大於1,即不存在最大日期區間則進入step3
select count(1) from [CommissionSetting] where StartDate=(select min(StartDate) from [CommissionSetting]) and EndDate=(select Max(EndDate) from [CommissionSetting])
--step 3 與傳入的日期進行判斷,判斷是否是最大日期區間,如果記錄大於0則表示日期區間為最大日期區間,可以使用.若為等於0則表示不是最大日期區間,進入step4
select count(1) from [CommissionSetting] where @starttime<=(select min(StartDate) from [CommissionSetting]) and @endtime>=(select Max(EndDate) from [CommissionSetting])
--step 4 與表中日期和充值卡進行對比判斷
select * from [CommissionSetting] where ((StartDate<=@starttime and EndDate>=@starttime) or (StartDate<=@endtime and EndDate>=@endtime) or (@starttime<=StartDate and EndDate<=@endtime))
and ((MinParValue<=@MinParValue and MaxParValue>=@MinParValue) or (MinParValue<=@MaxParValue and MaxParValue>=@MaxParValue) or (@MinParValue<=MinParValue and MaxParValue<=@MaxParValue))
-----------------------------------------------查詢SQL耗時-------------------------------------------------------------------------
SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON
/*--你的SQL指令碼開始*/
SELECT [TestCase] FROM [TestCaseSelect]
/*--你的SQL指令碼結束*/
SET STATISTICS PROFILE OFF
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
-----------------------------------------------查詢缺少的索引並構造索引生成語句------------------------------------------------------
SELECT
avg_user_impact AS average_improvement_percentage,
avg_total_user_cost AS average_cost_of_query_without_missing_index,
'CREATE INDEX ix_' + [statement] +
ISNULL(equality_columns, '_') +
ISNULL(inequality_columns, '_') + ' ON ' + [statement] +
' (' + ISNULL(equality_columns, ' ') +
ISNULL(inequality_columns, ' ') + ')' +
ISNULL(' INCLUDE (' + included_columns + ')', '')
AS create_missing_index_command
FROM sys.dm_db_missing_index_details a INNER JOIN
sys.dm_db_missing_index_groups b ON a.index_handle = b.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats c ON
b.index_group_handle = c.group_handle
WHERE avg_user_impact > = 40
-------------------------------------------------查詢表大小-----------------------------------------------------------------------------
SELECT a.name, b.rows
FROM sysobjects AS a INNER JOIN
sysindexes AS b ON a.id = b.id
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
ORDER BY b.rows DESC
-------------------------------------------------重置儲存過程計劃-----------------------------------------------------------------------------
exec sp_recompile @objname='DokAs_GetCustomerServerStatistics'
-----------------------------------------------查詢資源佔用------------------------------------------------------------------------------

SELECT TOP 10 c.client_net_address 會話IP,der.session_id 會話ID,[wait_type] AS '等待資源型別',
[wait_time] AS '等待時間', [start_time] AS '開始時間', [status] AS '狀態',
[command] AS '命令', dest.[text] AS 'sql語句', DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
[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
LEFT JOIN sys.dm_exec_connections c(nolock) ON c.session_id=der.session_id
WHERE der.[session_id]>50 AND DB_NAME(der.[database_id])='his'
ORDER BY [cpu_time] DESC

select client_net_address, *, c.local_net_address,c.connect_time,s.host_name,s.program_name,s.login_name from
sys.dm_exec_connections c inner join sys.dm_exec_sessions s on c.session_id=s.session_id
order by c.session_id


---------------------------------------------------缺失索引--------------------------------------------------------
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 2
---------------------------------------------------無用索引-------------------------------------------------------
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(O.Schema_ID) AS SchemaName
, OBJECT_NAME(I.object_id) AS TableName
, I.name AS IndexName
INTO #TempNeverUsedIndexes
FROM sys.indexes I INNER JOIN sys.objects O ON I.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?]; INSERT INTO #TempNeverUsedIndexes
SELECT
DB_NAME() AS DatbaseName
, SCHEMA_NAME(O.Schema_ID) AS SchemaName
, OBJECT_NAME(I.object_id) AS TableName
, I.NAME AS IndexName
FROM sys.indexes I INNER JOIN sys.objects O ON I.object_id = O.object_id
LEFT OUTER JOIN sys.dm_db_index_usage_stats S ON S.object_id = I.object_id
AND I.index_id = S.index_id
AND DATABASE_ID = DB_ID()
WHERE OBJECTPROPERTY(O.object_id,''IsMsShipped'') = 0
AND I.name IS NOT NULL
AND S.object_id IS NULL'
SELECT * FROM #TempNeverUsedIndexes
ORDER BY DatbaseName, SchemaName, TableName, IndexName
DROP TABLE #TempNeverUsedIndexes

--------------------------經常被大量更新,但是卻基本不適用的索引項--------------------
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
INTO #TempUnusedIndexes
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE 1=2
EXEC sp_MSForEachDB 'USE [?]; INSERT INTO #TempUnusedIndexes
SELECT TOP 20
DB_NAME() AS DatabaseName
, SCHEMA_NAME(o.Schema_ID) AS SchemaName
, OBJECT_NAME(s.[object_id]) AS TableName
, i.name AS IndexName
, s.user_updates
, s.system_seeks + s.system_scans + s.system_lookups
AS [System usage]
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON i.object_id = O.object_id
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND s.user_seeks = 0
AND s.user_scans = 0
AND s.user_lookups = 0
AND i.name IS NOT NULL
ORDER BY s.user_updates DESC'
SELECT TOP 20 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
DROP TABLE #TempUnusedIndexes
--------------------------------------------------------------