JTSQLServer性能調(diào)優(yōu)札記之三

字號(hào):

提出方案
    以下是找出來的 SQL 。
    select distinct s.parentId,s.pkId,1,s.title,s.comeOrg,s.fileDate,
    s.fileName,s.filePath,1,l.optionstatus,s.remark3,urgencyLevel
    from shouwen as s,
    jt_ComitOA.dbo.log as l
    where
    (s.fileSerialNumber like ’%%’ or s.title like ’%%’
    or s.keywords like ’%%’ or s.fileZi like ’%%’)
    and s.status<>’4’
    and s.pkid in
    (select distinct(mid) from log where uid=’glzyf’ and typeid=’shouwen’)
    and l.mid=s.pkid and uid=’glzyf’ and typeid=’shouwen’
    order by s.fileDate desc  從執(zhí)行計(jì)劃中可以看到兩個(gè)比較大操作,兩個(gè)對Log表“聚集索引掃描”,觀察語句不難以下發(fā)現(xiàn)就是導(dǎo)致兩個(gè)“聚集索引掃描”的原因。
    (select distinct(mid) from log where uid=’glzyf’ and typeid=’shouwen’)
    and l.mid=s.pkid and uid=’glzyf’ and typeid=’shouwen’
    這次運(yùn)冉蝦茫琺id、uid和typeid都在這兩個(gè)語句里面,于是表的mid、uid和typeid上面建索引
    CREATE NONCLUSTERED INDEX [idx_log__uid_typeid] ON [Log]
    (
    [uid] ASC,
    [typeID] ASC,
    [mid] ASC
    );
    看一下執(zhí)行計(jì)劃新的執(zhí)行計(jì)劃:
    留意左上角對ShouWen這個(gè)表的聚集索引掃描,由原先的相對比例0%(其實(shí)是接近0%),上升到27%,可見整體的資源消耗已經(jīng)大大降低了。
    表 ’Log’。掃描計(jì)數(shù) 2,邏輯讀取 3272 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
    表 ’ShouWen’。掃描計(jì)數(shù) 1,邏輯讀取 1436 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
    SQL Server 執(zhí)行時(shí)間:
    CPU 時(shí)間 = 62 毫秒,占用時(shí)間 = 293 毫秒。
    對Log表的訪問量大大減少,這可是有25萬條數(shù)據(jù)的表啊,總的執(zhí)行時(shí)間更是大大減少,療效相當(dāng)?shù)牟诲e(cuò)啊。
    至此,可以認(rèn)為該調(diào)優(yōu)已經(jīng)達(dá)到很好的效果了,從26秒的執(zhí)行時(shí)間縮減到0.3秒,非常不錯(cuò)的成績了。
    審視方案
    在新的執(zhí)行計(jì)劃中有兩個(gè)鍵查找,鍵查找用來檢索篩選索引沒有涵蓋的剩余列,說白了,就有一些輸出列不在這個(gè)索引的覆蓋范圍中??匆幌聅elect的輸出,的確有一個(gè)Log表的optionstatus字段,于是將索引的創(chuàng)建語句調(diào)整為:
    CREATE NONCLUSTERED INDEX [idx_log__uid_typeid] ON [Log]
    (
    [uid] ASC,
    [typeID] ASC,
    [mid] ASC
    )
    INCLUDE ( [optionstatus])
    同樣左上角的ShouWen表的“聚集索引掃描”為參照點(diǎn),就執(zhí)行計(jì)劃來看,的確資源占用率再次大大降低了,看看執(zhí)行的統(tǒng)計(jì)信息。
    表 ’Log’。掃描計(jì)數(shù) 2,邏輯讀取 16 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
    表 ’ShouWen’。掃描計(jì)數(shù) 1,邏輯讀取 1436 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
    SQL Server 執(zhí)行時(shí)間:
    CPU 時(shí)間 = 78 毫秒,占用時(shí)間 = 282 毫秒。
    Log表的邏輯讀取數(shù)大大減少,執(zhí)行時(shí)間并沒有太大變化。這是由于這次縮減的是邏輯讀,即在緩存中讀取,通常緩存是在內(nèi)存中的,內(nèi)存可是比磁盤快多了。