2012-04-05 56 views
2

我一直在使用數據庫最近和之前,我正在開發不使用數據庫的獨立組件。 隨着所有數據庫的工作,我有幾個問題突然出現。 爲什麼數據庫查詢比從文件中讀取編程語言數據更快?數據檢索 - 數據庫VS編程語言

爲了進一步闡述我的問題 -

假設我有一個名爲Employee表,帶有字段名稱,ID,出生日期,電子郵件和性別。爲了簡單起見,我們還將假定它們都是固定長度的字符串,並且它們沒有任何索引或主鍵或任何其他約束。

想象一下,我們在表中有100萬行數據。在這一天結束時,這個表將被存儲在磁盤上的某個地方。當我在DOB =「12/12/1985」中編寫一個查詢選擇名稱,僱員ID時,DBMS從文件中提取數據,對其進行處理,對其進行過濾並給出結果,該結果是100萬的子集數據行。

現在,假設我在一個平面文件中存儲了相同的1百萬行,每個字段類似地是固定長度的字符串以簡化。數據在磁盤上的文件中可用。 當我使用C++或C或C#或Java編寫程序並執行相同的任務來查找名稱和ID,其中DOB =「12/12/1985」時,我將通過記錄讀取文件記錄並檢查數據如果DOB =「12/12/1985」,如果它匹配,那麼我存儲該行給用戶。

與SQL查詢返回結果的速度相比,通過程序執行此操作的方式太慢了。

我假設DBMS也是用某種編程語言編寫的,而且還有一個解析查詢的額外開銷,而不是。

那麼,在數據庫管理系統中發生什麼事情比通過編程語言更快地檢索數據呢?

如果這個問題在這個論壇上不合適,請刪除,但是請提供一些指針,我可以找到答案。

如果有任何幫助,我使用SQL Server。

+1

緩存,優化是讓Db更快的兩件事情..如果你知道在編程語言中實現,那麼它可能是最好的.. – SenthilPrabhu 2012-04-05 16:03:21

回答

0

有很多技術來加速各種訪問。正如@Oded所說,索引是您的具體示例的重要解決方案:如果數據庫已設置爲按日期維護索引,則它可以直接進入該日期的條目,而不是通過整個文件進行讀取。 (請注意,維持指數不佔用空間和時間,雖然 - 它不是免費的!)

在另一方面,如果這樣的指標有成立,並且數據庫還沒有被存儲在日期順序,那麼按日期查詢將需要遍歷整個數據庫,就像您的平面文件程序一樣。

當然,您可以編寫自己的程序來維護和使用文件的日期索引,這將加速日期查詢,就像數據庫一樣。而且,您可能會發現您想要添加其他索引,以加速其他類型的查詢 - 或者刪除一個使用更多資源而不值得的索引。最終,管理添加到文件管理器中的所有功能可能變成一項複雜的任務;您可能希望將這種配置存儲在自己的文件中,而不是將其硬編碼到您的程序中。至少,您需要功能來確保更改您的配置不會破壞您的文件...

換句話說,您將編寫自己的數據庫。

+0

非常詳細的解釋謝謝。 – 2012-04-06 04:36:18

7

爲什麼從一個文件

這取決於很多事情不是一種編程語言,數據檢索數據庫查詢速度更快 - 網絡延遲和磁盤尋道速度是兩個重要的類型。有時候要更快地從文件中讀取

在你的描述一百萬行內找到一排,一個數據庫通常比在一個文件中尋找,因爲它採用的數據索引更快。

如果您預處理數據文件併爲不同字段提供索引文件,則還可以加速文件系統中的數據查找。

注意:數據庫通常不用於此功能,但由於它們符合ACID標準,因此適用於在多個進程(通常是許多計算機上的許多客戶端)在同一時間查詢數據庫的環境中工作。

+0

偉大的答案。注意+1。 – Yavar 2012-04-05 18:33:16

+0

謝謝Oded,現在我明白了。歡迎來到 – 2012-04-06 04:35:38

0

...一箇舊的,我知道......只是,如果有人發現這樣的:這個問題包含「假設......沒有任何索引」

...這樣的問題是關於在數據庫和沒有索引的平面文件之間進行數據連續的爭鬥,數據庫勝利...

答案是:如果您通過磁盤記錄讀取記錄,則會執行大量磁盤搜索操作,這是昂貴的性能明智之舉。一個數據庫總是按概念加載頁面 - 所以同時記錄幾個記錄。尋求更少的磁盤肯定更快。如果你想從平面文件中進行mem緩衝讀取,你可以達到相同或更好的讀取值。