SQLServer 常见高CPU利用率原因
1.缺失索引:
USE AdventureWorks2014SET STATISTICS TIME ON;SET STATISTICS IO ON ;SELECT per.FirstName,per.LastName,p.Name,p.ProductNumber,soh.OrderDate,sod.LineTotal,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail sod ON soh.SalesOrderID=sod.SalesOrderIDINNER JOIN Production.Product AS p ON sod.ProductID=p.ProductIDINNER JOIN sales.Customer AS c ON soh.CustomerID=c.CustomerIDINNER JOIN Person.Person AS per ON c.PersonID=per.BusinessEntityIDWHERE sod.LineTotal>25000SET STATISTICS IO OFF;SET STATISTICS TIME OFF;?得到下面的信息:
SQL Server 執(zhí)行時間:CPU 時間 = 63 毫秒,占用時間 = 378 毫秒。SQL Server 執(zhí)行時間:CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。??--創(chuàng)建一個索引
CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_LineTotal ON sales.SalesOrderDetail(LineTotal)?索引后結(jié)果如下:
SQL Server 執(zhí)行時間:CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。SQL Server 執(zhí)行時間:CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。?2.統(tǒng)計信息過時
你明知道返回和處理的結(jié)果集都很小,而優(yōu)化器卻選擇了hash連接,這是就可以檢查一下圖形化執(zhí)行計劃中是否有黃色嘆號,或者用文本化執(zhí)行計劃看看預(yù)估和實際行數(shù)的差異是否很大。如果是使用UPDATE STATISTICS語句更新統(tǒng)計信息,同時檢查為什么統(tǒng)計信息過時
3.非SARG查詢
如果是一個謂詞(特別是Where條件中)能用到索引查找操作,就可以理解為SARG,
如果在where 條件所用到的列中使用了標(biāo)量函數(shù)(YEAR、UPPER)或使用like ‘%%’這類的查詢,稱為非SARG查詢會導(dǎo)致索引無效
--非SARG(聚集索引掃描)SELECT soh.SalesOrderID,soh.OrderDate,soh.DueDate,soh.ShipDate,soh.Status,soh.SubTotal,soh.TaxAmt,soh.Freight,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail AS sodON soh.SalesOrderID=sod.SalesOrderID WHERE CONVERT(DATE,sod.ModifiedDate)='07/01/2005'進(jìn)行改寫:(聚集索引查找)
SELECT soh.SalesOrderID,soh.OrderDate,soh.DueDate,soh.ShipDate,soh.Status,soh.SubTotal,soh.TaxAmt,soh.Freight,soh.TotalDueFROM sales.SalesOrderHeader AS sohINNER JOIN sales.SalesOrderDetail AS sodON soh.SalesOrderID=sod.SalesOrderID WHERE sod.ModifiedDate>='2005-07-01 00:00:00.000'AND sod.ModifiedDate<'2005-07-02 00:00:00.000'?非SARG對where條件中的列使用UPPER/LTRIM/ISNULL之類的標(biāo)量函數(shù),對于這種情況,改寫查詢解決。
4.隱式轉(zhuǎn)換
指一個查詢From/Where子句中,用于關(guān)聯(lián)和判斷列之間數(shù)據(jù)類型不同,導(dǎo)致優(yōu)化器需要根據(jù)數(shù)據(jù)類型的優(yōu)先級高低進(jìn)行類型轉(zhuǎn)換然后在優(yōu)化、執(zhí)行。
SELECT p.FirstName,p.LastName,c.AccountNumber FROM Sales.Customer AS c INNER JOIN Person.Person AS p ON c.PersonID =p.BusinessEntityIDWHERE c.AccountNumber=N'AW00029594'如上圖加寬部分就是需要把varchar類型轉(zhuǎn)換成nvarchar類型。可以考慮在傳入where條件之前先進(jìn)行顯式數(shù)據(jù)類型轉(zhuǎn)換。
?5.參數(shù)嗅探
創(chuàng)建針對存儲過程、函數(shù)或者參數(shù)化查詢的執(zhí)行計劃時,根據(jù)傳入的參數(shù)進(jìn)行預(yù)估并生成執(zhí)行計劃的一個功能,參數(shù)嗅探出現(xiàn)在執(zhí)行計劃的編譯或者重編譯過程中。
CREATE PROCEDURE user_GetCustomerShipDates(@ShipDateStart Datetime,@ShipDateEnd datetime)AS SELECT CustomerID,SalesOrderNumberFROM Sales.SalesOrderHeader WHERE ShipDate BETWEEN @ShipDateStart AND @ShipDateEnd--創(chuàng)建非聚集索引CREATE NONCLUSTERED INDEX IDX_ShipDate_ASCON Sales.SalesOrderHeader(ShipDate)--清空緩存DBCC FREEPROCCACHEEXEC user_GetCustomerShipDates '2005/07/08','2008/01/01'EXEC user_GetCustomerShipDates '2005/07/10','2008/07/20'--刪除索引drop index IDX_ShipDate_ASC on Sales.SalesOrderHeader?在ShipDate上有索引,還是進(jìn)行了聚集索引掃描。
在第一個存儲過程的參數(shù)中,查詢條件的時間范圍幾乎包括了全表的所有時間,另外非聚集索引沒有覆蓋查詢,因此使用了聚集索引掃描
第二個存儲過程仍然會用上面的執(zhí)行計劃。
把存儲過程的順序調(diào)換一下:(執(zhí)行計劃)
?
?對于參數(shù)嗅探問題,可以使用部分編譯、編譯提示等功能來避免,更多的優(yōu)化應(yīng)該考慮數(shù)據(jù)和研究數(shù)據(jù)分布問題
?6.--非參數(shù)化Ad—hoc查詢
Ad-hoc稱為即席查詢,可以理解為沒有使用存儲過程、SP_Executesql或其他方式強(qiáng)制預(yù)定義SQL語句。
如:SELECT * FROM bt WHERE id=***這類查詢引起的問題?可以把:高級--真對即席工作負(fù)荷進(jìn)行優(yōu)化:true
或者在數(shù)據(jù)庫層面強(qiáng)制參數(shù)化:
ALTER DATABASE AdventureWorks2014 SET PARAMETERIZATION FORCED?7.非必要的并行查詢
并行操作會把一個查詢分開到多個線程中執(zhí)行,然后在合并到一起返回結(jié)果
?
數(shù)據(jù)庫事務(wù):
事務(wù)是對數(shù)據(jù)庫操作的單元,可以是一個Select語句,也可以是包好多個Select、Update、Delete、Insert的操作的命名集合
1.原子性:意味著一個事務(wù)內(nèi)的所有操作必須全部完成或者全部回滾。
2.一致性:要求整個事務(wù)在運(yùn)行的前后數(shù)據(jù)庫的狀態(tài)必須一致,不能打破數(shù)據(jù)定義中的一致性約束
3.隔離性:保證同一時間中,一個事務(wù)的運(yùn)行不能被另一個事務(wù)影響。
4.持久性:事務(wù)一旦提交成功,將永久存儲到服務(wù)器的文件系統(tǒng)中,即使系統(tǒng)在中途奔潰,所發(fā)生的的效果都不會丟失,這個會通過日志來保證。
顯示事務(wù)隱式事務(wù)(區(qū)別在于創(chuàng)建和提交的方式)
隱式事務(wù):由SQL Server自己去開啟和提交/回滾,并且在內(nèi)部保證ACID特性。
顯示事務(wù):以Begin Tran/Transaction開始以Commit Tran/Transaction 或者Rollback Tran結(jié)束
轉(zhuǎn)載于:https://www.cnblogs.com/sunliyuan/p/8546629.html
總結(jié)
以上是生活随笔為你收集整理的SQLServer 常见高CPU利用率原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 是指国家主权政权政治制度政治秩序以及意识
- 下一篇: struts入门day04