sqlite的缺點和限制

來源:互聯網
上載者:User

標籤:http   簡單的   計劃   mysql   啟動   重點   索引   資料庫檔案   span   

1 隨著查詢變大變複雜,查詢時間使得網路調用或者交易處理開銷相形見絀,2 這時一些大型的設計複雜的資料庫開始發揮作用了。3 雖然SQLite也能處理複雜的查詢,但是它沒有精密的最佳化器或者查詢計劃器。4 SQLite知道如何使用索引,但是它沒有儲存詳細的表統計資訊。假如執行17路join,SQLite也會串連表並給您結果,並不像您在Oracle或者PostgreSQL中期望的那樣,SQLite沒有通過計算各種替代查詢計劃並選擇最快的候選計劃來嘗試判斷最佳化路徑。5 因此,假如您在大型資料集合上運行複雜的查詢,SQLite與那些有複雜設計的查詢計劃器的資料庫運行一樣快的機會是非常小的。

SQLite是為中小規模的應用程式設計的一個嵌入式的資料庫

局限性一:

並發。SQLite的鎖機制是粗粒度的,它允許多個讀,但是一次只允許一個寫。

寫鎖會在寫期間排他地鎖定資料庫,其他人在此期間不能訪問資料庫。

SQLite已經採取措施以最小化排它鎖所佔用的時間。

通常來講,SQLite中的鎖只保持幾毫秒。

但是按照一般經驗,如果您的應用程式有很高的寫並發(許多串連競爭向同一資料庫寫),並且是時間關鍵型,您可能需要其他資料庫。

需要實際測試您的應用程式才能知道能獲得怎樣的效能。

一個簡單的網路應用程式中,SQLite用100個並發串連每秒處理500多個事務。

事務所修改的記錄數以及查詢所涉及的複雜性可能有所不同。

什麼樣的並發性是可接受的,這取決於具體的應用程式,只能通過直接測試來判斷。

總之,對任何資料庫都是真理:直到您做了實際測試才能知道應用程式能獲得怎樣的效能。

局限性二:

網路。

雖然SQLite資料庫可以通過網路檔案系統共用,但是與這種檔案系統相關的潛在延時會導致效能受損。

更糟的是,網路檔案系統實現中的一些缺陷也使得開啟和修改遠程檔案--SQLite或其他--很容易出錯。

如果檔案系統的鎖實現不當,可能允許兩個用戶端同時修改同一個資料庫檔案,這樣必然會導致資料庫出錯。

實際上,並不是因為SQLite的實現導致SQLite不能在網路檔案系統上工作。

相反,SQLite在底層檔案系統和有線協議下工作,但是這些技術有時並不完善。

例如,許多NFS使用有缺陷的fcntl(),這意味著鎖可能並不像設想的那樣工作。

一些較新版本的NFS,如Solaris NFSV4就可以工作正常,SQLite需要的鎖機制也是相當可靠的。

然而,SQLite開發人員既沒有時間,也沒有資源去驗證任何給定的網路檔案系統在所有的情況下都可以無缺陷工作。

局限說明:

絕大部分限制是有意設計的--它們是SQLite設計的結果。

例如,支援高度的寫並發會帶來很大的複雜性,這將使SQLite的簡單性無法保持。

同樣,作為嵌入式資料庫,SQLite是有意不支援網路的。

這一點並不奇怪。總之,SQLite不能做的都是它所能做的直接結果。

它開始的設計就是一款模組化、簡單、緊湊的以及便於使用的嵌入式關聯式資料庫,它的基礎代碼都在使用它的程式員的掌握範圍內。

從多方面看,它能完成許多其他資料庫不能做的事情,例如,運行在電力消耗實際上是一項制約因素的嵌入式環境中。

sqlite未實現的特性:

 1 完整的觸發器支援。 2 SQLite支援幾乎所有的標準觸發器功能,包括遞迴觸發器和INSTEAD OF觸發器。 3 但是對於所有的觸發器類型,當受觸發器查詢影響的每一行做評估時,SQLite需要FOR EACH ROW行為。 4 ANSI SQL92也說明了當前不支援FOR EACH STATEMENT。 5  6 完整的修改表結構支援。 7 目前只支援RENAME TABLE和ADD COLUMN類型的ALTER TABLE命令。 8 其他類型的ALTER TABLE操作, 9 例如DROP COLUMN、ALTER COLUMN以及ADD CONSTRAINT還未實現。10 11 右外串連與全外串連。12 左外串連(LEFT OUT JOIN)已經支援,但是右外串連(RIGHT OUTER JOIN)和全外串連(FULL OUTER JOIN)還未實現。13 所有的右外串連在語義上都有相同的左外串連,相反也成立。14 通過簡單逆向表的順序和修改串連限制,左外串連可以作為右外串連的實現。15 全外串連可以通過組合左外串連和UNION以及在WHERE子句中進行恰當的NULL過濾實現。16 17 可更新的視圖。18 SQLite的視圖使唯讀,19 您不能在視圖上執行DELETE、INSERT或者UPDATE語句。20 但是您可以建立一個啟動對視圖進行DELETE、INSERT或者UPDATE的觸發器,21 在觸發器內完成您需要執行的操作。22 23 視窗功能。24 ANSI SQL99的新功能之一就是視窗功能。25 該功能提供結果集的後處理分析,例如排序、平均移動以及超前和滯後計算等。26 SQLite目前支援ANSI SQL92的一部分,因此,它不支援像RANK()、ROW_NUMBER()等。27 28 授權和撤銷。29 由於SQLite能讀寫普通的磁碟檔案,30 因此,唯一可以應用的存取權限就是所在作業系統的普通檔案的存取權限。31 授權(GRANT)和撤銷(REVOKE)命令一般是在高端系統中使用的,32 這些系統中有多個使用者,不同使用者對資料庫中的資料有不同的存取層級。33 SQLite模型中,應用程式是主使用者,能夠訪問整個資料庫。這種模型中的訪問明確定義為應用程式級--具體地說,就是應用程式可以訪問資料庫檔案。34 35 除了這裡列出的,SQLite Wiki上有個專門的頁面列出SQLite不支援的SQL。網址是www.sqlite.org/cvstrac/wiki?p=UnsupportedSql。

不支援外鍵約束

◇網路檔案系統(以下簡稱NFS)
有時候需要訪問其它機器上的SQLite資料庫檔案,就會把資料庫檔案放置到網際網路共用目錄上。這時候你就要小心了。當SQLite檔案放置於NFS時,在並發讀寫的情況下可能會出問題(比如資料損毀)。原因據說是由於某些NFS的檔案鎖實現上有Bug。

1:SQLITE不可儲存過多的資料庫,它的效能發揮最好只能在存放較小的資料量情況下。不要把它當做MYSQL甚至ORACLE來使用。它只是一個200K的資料庫。

2:sqlite3不像MYSQL那樣使用固定記錄檔,所有使用insert、update、delete的運行效率只是一般,sqlite3的一個事務,需要調用 4次 fsync()操作,而一般的大型資料庫,如mysql只用到了2次。sqlite3對每個事務都建立一個臨時檔案來記錄日誌,這個日誌建立、更新和刪除竟然使用了3次 fsync()!為什麼不用一個固定的記錄檔呢?實在難以理解設計者的思路。可能他們把重點放在 "Select"  

1 參考連結:http://blog.csdn.net/yuzhouxiang/article/details/7373111

 

sqlite的缺點和限制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.