Sql Server 優化技巧


1.查看執行時間和cpu占用時間

set statistics time on

select * from dbo.Product

set statistics time off

打開你查詢之后的消息里面就能看到啦。

wpscb7e.tmp

2.查看查詢對I/0的操作情況

set statistics io on

select * from dbo.Product

set statistics io off

執行之后

wpscb7f.tmp

掃描計數:索引或表掃描次數

邏輯讀取:數據緩存中讀取的頁數

物理讀取:從磁盤中讀取的頁數

預讀:查詢過程中,從磁盤放入緩存的頁數

lob邏輯讀取:從數據緩存中讀取,image,text,ntext或大型數據的頁數

lob物理讀取:從磁盤中讀取,image,text,ntext或大型數據的頁數

lob預讀:查詢過程中,從磁盤放入緩存的image,text,ntext或大型數據的頁數

如果物理讀取次數和預讀次說比較多,可以使用索引進行優化。

如果你不想使用sql語句命令來查看這些內容,方法也是有的,哥教你更簡單的。

查詢--->>查詢選項--->>高級

wpscb9f.tmp

被紅圈套上的2個選上,去掉sql語句中的set statistics io/time on/off 試試效果。哦也,你成功啦。。

3.查看執行計划

選中查詢語句,點擊

wpscba0.tmp

然后看消息里面,會出現下面的圖例

wpscba1.tmp

首先我這個例子的語句太過簡單,你整個復雜的,包涵啊。

分析:鼠標放在圖標上會顯示此步驟執行的詳細內容,每個表下面都顯示一個開銷百分比,分析站百分比多的的一塊,可以根據重新設計數據結構,或這重寫sql語句,來對此進行優化。如果存在掃描表,或者掃描聚集索引,這表示在當前查詢中你的索引是不合適的,是沒有起到作用的,那么你就要修改完善優化你的索引,具體怎么做,你可以根據我上一篇文章中的sql優化利器--數據庫引擎優化顧問對索引進行分析優化。

方法2.

SET SHOWPLAN_ALL ON;

clipboard

 

4.sql server的優化建議

Microsoft SQL Server 2008 >> 工具  >>  SQL Server Profiler。

然后選擇文件  >>  新建  >>  跟蹤打開一個連接窗口,選擇將要跟蹤的服務器實例然后連接。打開如下“跟蹤屬性”對話框。

1bf0ad4a6cf

 如果有許多跟蹤,可以提供一個跟蹤名稱來幫助在以后進行分類。不同的跟蹤模板可幫助建立用於不同目的的跟蹤。

 打開跟蹤屬性窗口后,單擊“事件選擇”選項卡,為跟蹤提供更詳細的定義。

8ab16232f64

6a43bc1c2d6

4、使用多個文件

在大多數情況下,小型的數據庫並不需要創建多個文件來存放數據。但是隨着數據的增長,單個文件的弊端就會出現。

    - 首先,使用多個文件分布到不同的磁盤分區(多個硬盤)能夠幾大提高IO性能。

    - 其次,多個文件對於數據比較多的數據庫來說,備份和恢復都會方便。

    - 但是,多文件需要占用更多的磁盤空間,因為每個文件中都有自己的一套B樹組織方式和自己的增長空間。當然也有自己的碎片。

    - 總體來說,多個文件帶來的優點是遠遠大於弊端的。

5. 維護語句

--日志收縮為1M

USE [數據庫名];

ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE;

DBCC SHRINKFILE ([數據庫名_log], 1);

ALTER DATABASE [數據庫名] SET RECOVERY FULL;

6. 維護計划

點擊工具欄,拖動到空白區域,如果有上一個任務,可以拖動箭頭指向新添加的任務

clipboard

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.

備份數據庫

clipboard

“設置備份壓縮” >> “壓縮備份”,會比普通備份再RAR的壓縮率低一些,不過可以自動進行,測試過普通壓縮16g使用后未2G

網上資料如下可參考

clipboard

6.3.

清除歷史記錄

clipboard

PS:

clipboard

需要開啟Sql sever Agent(sql server代理)的服務,並設置為開機自動啟動

問題2:在 sys.database_files 中找不到數據庫 'XXX' 的文件 '[XXX_3_log]'。該文件不存在或者已被刪除。

clipboard

分析:一定是從某個原始庫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

clipboard

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”找到死鎖記錄

clipboard

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM