1.查看執行時間和cpu占用時間
set statistics time on
select * from dbo.Product
set statistics time off
打開你查詢之后的消息里面就能看到啦。
2.查看查詢對I/0的操作情況
set statistics io on
select * from dbo.Product
set statistics io off
執行之后
掃描計數:索引或表掃描次數
邏輯讀取:數據緩存中讀取的頁數
物理讀取:從磁盤中讀取的頁數
預讀:查詢過程中,從磁盤放入緩存的頁數
lob邏輯讀取:從數據緩存中讀取,image,text,ntext或大型數據的頁數
lob物理讀取:從磁盤中讀取,image,text,ntext或大型數據的頁數
lob預讀:查詢過程中,從磁盤放入緩存的image,text,ntext或大型數據的頁數
如果物理讀取次數和預讀次說比較多,可以使用索引進行優化。
如果你不想使用sql語句命令來查看這些內容,方法也是有的,哥教你更簡單的。
查詢--->>查詢選項--->>高級
被紅圈套上的2個選上,去掉sql語句中的set statistics io/time on/off 試試效果。哦也,你成功啦。。
3.查看執行計划
選中查詢語句,點擊
然后看消息里面,會出現下面的圖例
首先我這個例子的語句太過簡單,你整個復雜的,包涵啊。
分析:鼠標放在圖標上會顯示此步驟執行的詳細內容,每個表下面都顯示一個開銷百分比,分析站百分比多的的一塊,可以根據重新設計數據結構,或這重寫sql語句,來對此進行優化。如果存在掃描表,或者掃描聚集索引,這表示在當前查詢中你的索引是不合適的,是沒有起到作用的,那么你就要修改完善優化你的索引,具體怎么做,你可以根據我上一篇文章中的sql優化利器--數據庫引擎優化顧問對索引進行分析優化。
方法2.
SET SHOWPLAN_ALL ON;
4.sql server的優化建議
Microsoft SQL Server 2008 >> 工具 >> SQL Server Profiler。
然后選擇文件 >> 新建 >> 跟蹤打開一個連接窗口,選擇將要跟蹤的服務器實例然后連接。打開如下“跟蹤屬性”對話框。
如果有許多跟蹤,可以提供一個跟蹤名稱來幫助在以后進行分類。不同的跟蹤模板可幫助建立用於不同目的的跟蹤。
打開跟蹤屬性窗口后,單擊“事件選擇”選項卡,為跟蹤提供更詳細的定義。
4、使用多個文件
在大多數情況下,小型的數據庫並不需要創建多個文件來存放數據。但是隨着數據的增長,單個文件的弊端就會出現。
- 首先,使用多個文件分布到不同的磁盤分區(多個硬盤)能夠幾大提高IO性能。
- 其次,多個文件對於數據比較多的數據庫來說,備份和恢復都會方便。
- 但是,多文件需要占用更多的磁盤空間,因為每個文件中都有自己的一套B樹組織方式和自己的增長空間。當然也有自己的碎片。
- 總體來說,多個文件帶來的優點是遠遠大於弊端的。
5. 維護語句
--日志收縮為1M
USE [數據庫名];
ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE;
DBCC SHRINKFILE ([數據庫名_log], 1);
ALTER DATABASE [數據庫名] SET RECOVERY FULL;
6. 維護計划
點擊工具欄,拖動到空白區域,如果有上一個任務,可以拖動箭頭指向新添加的任務
6.1. 執行T-SQL語句
USE [Sogal.YHZS];
-- 壓縮日志到1MB
ALTER DATABASE [Sogal.YHZS] SET RECOVERY SIMPLE;
DBCC SHRINKFILE ([Sogal.YHZS_log], 1);
ALTER DATABASE [Sogal.YHZS] SET RECOVERY FULL;
-- 清除錯誤日志
EXEC sp_cycle_errorlog;
6.2.
備份數據庫
“設置備份壓縮” >> “壓縮備份”,會比普通備份再RAR的壓縮率低一些,不過可以自動進行,測試過普通壓縮16g使用后未2G
網上資料如下可參考
6.3.
清除歷史記錄
PS:
需要開啟Sql sever Agent(sql server代理)的服務,並設置為開機自動啟動
問題2:在 sys.database_files 中找不到數據庫 'XXX' 的文件 '[XXX_3_log]'。該文件不存在或者已被刪除。
分析:一定是從某個原始庫backup然后restore過來的.這種情況下XXX的日志的邏輯文件名不一定叫'XXX_3_log',不信,你可以
方法1:select type_desc,name from sys.master_files WHERE database_id=db_id('XXX');
方法2:use XXX
select * from sys.database_files
可以看'name'列的輸出,然后收縮那個名稱里的日志文件就可以了.
一般restore后,如果庫名和以前不一樣
解決方法:
方法1:改為正確的日志邏輯名稱
方法2:最好改下數據庫和日志的2個邏輯文件名,保持后新明稱一致.
alter database xhtest modify file(name=xhtest_old, newname=xhtest)
alter database xhtest modify file(name=xhtest_old_log, newname=xhtest_log)
6. Log文件夾中的文件過多
C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL
7. 死鎖
-- 查找死鎖的進程
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'
-- 干掉死鎖的進程
kill 53
-- 查詢該會話正在執行的Sql語句
DBCC INPUTBUFFER (53)
資料:https://www.cnblogs.com/OpenCoder/p/5557514.html
-- SQL Server Profiler查看死鎖
Microsoft SQL Server 2008 >> 工具 >> SQL Server Profiler
>> 文件 >> 模板 >> 導入模板 >> 點擊開始監控
Ctrl + F 查找“deadlock”找到死鎖記錄
8. 查詢耗時較長的語句
SELECT creation_time N'語句編譯時間'
,last_execution_time N'上次執行時間'
,total_physical_reads N'物理讀取總次數'
,total_logical_reads/execution_count N'每次邏輯讀次數'
,total_logical_reads N'邏輯讀取總次數'
,total_logical_writes N'邏輯寫入總次數'
, execution_count N'執行次數'
, total_worker_time/1000 N'所用的CPU總時間ms'
, total_elapsed_time/1000 N'總花費時間ms'
, (total_elapsed_time / execution_count)/1000 N'平均時間ms'
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N'執行語句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like '%fetch%'
AND last_execution_time <'20170519 17:35'
ORDER BY total_elapsed_time / execution_count DESC;















