2011-09-26 15 views

回答

2

還有一個缺點。 ANALYZE結果可能會導致查詢計劃程序忽略您真正想要使用的索引。

例如,假設您有一個帶有布爾列「isSpecial」的表格。大多數行有isSpecial = 0,但有isSpecial = 1的幾個。

當您執行查詢SELECT * FROM MyTable WHERE isSpecial = 1時,如果沒有ANALYZE數據,查詢計劃程序將假定isSpecial上的索引是好的並將使用它。在這種情況下,它將會是正確的。如果你要做isSpecial = 0,那麼它仍然會使用索引,這將是低效的,所以不要這樣做。

運行ANALYZE後,查詢計劃程序將知道isSpecial只有兩個值,因此索引的選擇性很差。所以它不會使用它,即使在上面的isSpecial = 1的情況下也是如此。爲了知道isSpecial值的分佈非常不均勻,它需要數據,它只在使用SQLITE_ENABLE_STAT4選項進行編譯時收集。這個選項默認情況下是不啓用的,它有一個很大的缺點:它使預編譯語句的查詢計劃取決於它的綁定值,所以sqlite會更頻繁地重新編寫語句。 (可能每次執行時,我都不知道細節)

tl; dr:運行ANALYZE幾乎不可能在布爾字段上使用索引,即使您知道它們會有所幫助。

0

簡答:計算所需的時間可能比節省的時間多。

與索引不同,當添加或更新數據時,ANALYZE統計信息不會自動保持最新。無論何時添加更新的大量數據,您都應該重新運行ANALYZE。

+0

我已經知道了。所以我想這是由程序員決定是否值得的慢插入/快速查詢之間的權衡。 – Muis