学习笔记(十一)——数据库的索引碎片、计划缓存、统计信息
1.索引碎片
數(shù)據(jù)庫存儲(chǔ)本身是無序的,建立了聚集索引,會(huì)按照聚集索引物理順序存入硬盤。既鍵值的邏輯順序決定了表中相應(yīng)行的物理順序
而且在大多數(shù)的情況下,數(shù)據(jù)庫寫入頻率遠(yuǎn)低于讀取頻率,索引的存在為了讀取速度犧牲寫入速度(頁 為最小單位 8kb,區(qū)?物理連續(xù)的頁(8頁)的集合)
其內(nèi)部碎片 數(shù)據(jù)庫頁內(nèi)部產(chǎn)生的碎片,外部反之。
查詢碎片情況:
實(shí)例:
顯示數(shù)據(jù)庫里所有索引的碎片信息
SET NOCOUNT ON
USE pubs
DBCC SHOWCONTIG WITH ALL_INDEXES
GO
?
顯示指定表的所有索引的碎片信息
SET NOCOUNT ONUSE pubs
DBCC SHOWCONTIG (authors) WITH ALL_INDEXES
GO
?
顯示指定索引的碎片信息
SET NOCOUNT ON
USE pubs
DBCC SHOWCONTIG (authors,aunmind)
GO
2.計(jì)劃緩存
平時(shí)所寫的SQL語句本質(zhì)只是獲取數(shù)據(jù)的邏輯,而不是獲取數(shù)據(jù)的物理路徑。當(dāng)我們寫的SQL語句傳到SQL Server的時(shí)候,查詢分析器會(huì)將語句依次進(jìn)行解析(Parse)、綁定(Bind)、查詢優(yōu)化(Optimization,有時(shí)候也被稱為簡化)、執(zhí)行(Execution)。除去執(zhí)行步驟外,前三個(gè)步驟之后就生成了執(zhí)行計(jì)劃,也就是SQL Server按照該計(jì)劃獲取物理數(shù)據(jù)方式,最后執(zhí)行步驟按照執(zhí)行計(jì)劃執(zhí)行查詢從而獲得結(jié)果。但查詢優(yōu)化器不是本篇的重點(diǎn),本篇文章主要講述查詢優(yōu)化器在生成執(zhí)行計(jì)劃之后,緩存執(zhí)行計(jì)劃的相關(guān)機(jī)制以及常見問題。
1: SELECT * 2: FROM A INNER JOIN B ON a.a=b.b3: INNER JOIN C ON c.c=a.a?實(shí)例:
通過動(dòng)態(tài)管理視圖和函數(shù),查看當(dāng)前緩存的所有執(zhí)行計(jì)劃SELECT/*PlanCache*/ ISNULL(QS.execution_count,0) AS ExecutionCount,CP.usecounts AS LookupCount,CP.objtype AS ObjectType,ST.text AS Sql ,QP.query_plan AS QueryPlanFROM sys.dm_exec_cached_plans AS CPLEFT JOIN sys.dm_exec_query_stats AS QS ON CP.plan_handle=QS.plan_handleCROSS APPLY sys.dm_exec_sql_text(CP.plan_handle) AS STCROSS APPLY sys.dm_exec_query_plan(CP.plan_handle) AS QPWHERE ST.text NOT LIKE 'SELECT/*PlanCache*/%'ORDER BY QS.last_execution_time ASC;?
3.統(tǒng)計(jì)信息
Sqlserver 查詢是基于開銷查詢的,在首次生成執(zhí)行計(jì)劃時(shí),是基于多階段的分析優(yōu)化才確定出較好的執(zhí)行計(jì)劃。而這些開銷的基數(shù)估計(jì),是根據(jù)統(tǒng)計(jì)信息來確定的。統(tǒng)計(jì)信息其實(shí)就是對表的各個(gè)字段的總體數(shù)據(jù)進(jìn)行分段分布,數(shù)據(jù)庫默認(rèn)都會(huì)自動(dòng)維護(hù)。
表和視圖都有統(tǒng)計(jì)信息,統(tǒng)計(jì)信息對象是根據(jù)索引或表列的列表創(chuàng)建的。當(dāng)某列第一次最為條件查詢時(shí),將創(chuàng)建單列的統(tǒng)計(jì)信息。當(dāng)創(chuàng)建索引時(shí),將創(chuàng)建同名的統(tǒng)計(jì)信息。索引中,統(tǒng)計(jì)信息只統(tǒng)計(jì)首列,因此索引除了按首列排序存儲(chǔ)數(shù)據(jù)外,其統(tǒng)計(jì)信息也是按首列計(jì)算統(tǒng)計(jì)的,所以索引設(shè)置時(shí)定義的第一列非常重要。每個(gè)統(tǒng)計(jì)信息對象都在包含一個(gè)或多個(gè)表列的列表上創(chuàng)建,并且包括顯示值在第一列中的分布的直方圖。
實(shí)例:
SELECT O.* FROM tb_Order2 AS O WHERE O.CustomerLastName='Adams';?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Angular-JS/p/8028732.html
總結(jié)
以上是生活随笔為你收集整理的学习笔记(十一)——数据库的索引碎片、计划缓存、统计信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL中整型和字符串类型指定长度的含
- 下一篇: 保存图片验证码到redis数据库