《資料庫索引設計優化》讀書筆記(四)

2021-07-09 19:35:02 字數 1581 閱讀 1407

第7章 被動式索引設計

練習

7.1 你將如何歸類圖7.12中的尖刺:有優化空間的問題製造者,無優化空間的問題製造者,還是受害者?

分析:如圖7.2所示,我們首先要區分的是問題的製造者及受害者。長服務時間為問題製造者,長排隊時間為受害者。如果乙個事務獨佔了資源(也許是因為使用了不合適的索引),那麼就會對其他事務造成明顯的負面影響,進而導致這些事務也與獨佔資源的事務一同出現在異常報告中。

那麼問題來了,哪些時間是服務時間?哪些時間是排隊時間?答案在圖5.1中給出。

從圖5.1看到,本地響應時間由服務時間和排隊時間組成。其中服務時間包括:cpu時間和磁碟服務時間。磁碟服務時間又包括同步讀、同步寫和非同步讀(非重疊的部分)。而排隊時間包括cpu排隊、磁碟排隊、鎖等待和其他等待。那什麼是同步讀、同步寫和非同步讀呢?如圖2.9所示。

術語同步i/o是指在進行i/o操作時,dbms不能繼續進行其他操作,它必須等待,直至i/o操作完成。例如,在一次同步讀操作中,我們必須先定位到我們所需的行(在圖中用「c」表示起始部分的cpu時間),隨後訪問該頁並處理該頁(在圖中展示為第二部分的cpu時間),每一步都必須等待,直至上一步完成。

而另一方面,非同步讀是當前一步的頁尚在處理時就被提前發起了,這一處理時間和i/o時間之間可能有很大一部分重疊。理想情況下,在這些頁被實際處理之前,非同步i/o就已經完成了。每一組頁都以這種方式被預讀然後再處理,圖2.9展示了這一過程。注意,整個預讀過程從一次同步讀開始,然後才開始預讀過程,以此來最小化首次讀取的等待時間。

明確了以上這些概念,再來看圖7.12的尖刺,服務時間為1秒(cpu時間+同步讀),排隊時間為7秒(等待預讀、鎖等待、其他等待)。從問題的製造者及受害者的定義看,首先屬於受害者。

除了是受害者,該尖刺會不會也是問題製造者呢?感覺上210次呼叫花費1秒時間,平均每次1000/210=4.8ms,應該是有優化空間的。先看定義。

有優化空間的問題製造者是指那些通過改進索引來獲得大幅效能提公升的事務,它有兩個特徵:

1. 磁碟服務時間長。

2. 磁碟讀大多是對錶頁的讀取。

再看圖7.12的尖刺,平均每次呼叫1000/210=4.8ms,每兩次呼叫就有一次隨機i/o,而且大部分是表訪問,符合有優化空間的問題製造者特徵。如果該尖刺是唯讀事務,則通過使用寬索引可以避免全部表頁的讀取。由此,若7.12中的程式是唯讀的,則其調優的潛在空間為1秒。包含插入、更新或刪除操作的程式的調優潛在空間較小,因為無論索引多寬,表頁都必須被更新。

綜上所述,本題答案為,既是有優化空間的問題製造者,又是受害者。

7.2 如何減少本地響應時間?

《資料庫索引設計優化》讀書筆記(一)

第3章 sql處理過程 練習 3.1 為sql3.7中所示的查詢設計盡可能好的索引 sql 3.7 select lname,fname,cno from cust where m and height 190 order by lname,fname 分析 本書第4章提出了乙個三星索引的概念。如果...

《資料庫索引設計優化》讀書筆記(二)

第4章 為select語句建立理想的索引 練習 4.1 為sql4.5中的查詢語句設計候選索引a和選索引b。sql 4.5 select a,b,d,e from orderitem where b between b1 and b2 ff 1.10 and c 1 ff 2 and e 0 ff ...

《資料庫索引設計優化》讀書筆記(七)

第13章 資料庫索引選項 練習 13.1 調查你當前使用的dbms版本關於索引的限制和高階選項。索引行壓縮與異常情況 mysql支援 oracle支援 mysql使用null值實現索引行壓縮。但不推薦在實際中使用null來代替乙個特定的值,因為從長遠來看,這可能會導致應用系統錯誤。表中有三個null...