2009-06-19 151 views
0

我已經瀏覽了Date和Silberschatz,但似乎無法找到我的這些具體問題的答案。關於關係數據庫的一些基本問題

  1. 如果2個數據庫用戶發出查詢 - 比如說'select * from AVERYBIGTABLE;' - 查詢結果在哪裏將被存儲在一般情況下......即與結果集的大小無關?

    a。在DBMS服務器的OS管理的物理/虛擬內存中?

    b。在DBMS管理的臨時文件中?

  2. 是否每個連接都維護查詢結果集?

  3. 如果查詢結果集確實是每個連接都維護的,那麼如果連接池有效(通過一層代碼位於DBMS之上)呢?那麼,每個查詢(而不是每個連接)都不會保留結果集?

  4. 如果數據庫在其用戶同時發出select查詢時實時更改,那麼查詢發出者已經執行但尚未(完全)「消耗」的查詢會發生什麼情況?例如,假設結果集有50,000行;如果前面的查詢由DBMS的任何用戶重新發布,那麼當前另一個用戶執行插入/刪除操作時,用戶當前正在迭代100次,這樣,如果先前的查詢將被重新發出,那麼它將導致多於/少於50,000行?另一方面,如果數據庫不能實時更改,如果2個用戶發出的每個查詢具有相同但非常大的結果集,DBMS是否保留2個相同的結果集副本,或者它會有一個共享的副本嗎?

非常感謝提前。

回答

1

其中一些可能特定於Oracle。

  1. 查詢的全部結果並不需要複製的每個用戶得到維持其行已被檢索到,什麼行仍需要獲取光標(如指針)。數據庫將緩存儘可能多的數據,因爲它會從表中讀取數據。兩位用戶的主體只有文件上的只讀文件句柄。

  2. 遊標按連接維護,下一行的數據可能已經或可能不在內存中。

  3. 大部分連接都是單線程連接,一次只能有一個客戶端使用連接。如果在同一連接上執行兩次相同的查詢,則會重置光標位置。

  4. 如果在正在更新的表上打開遊標,則舊行將被複制到單獨的空間中(在Oracle中撤銷)並在遊標的整個生命週期中保持不變,或者至少在其空間用盡之前保持它。(Oracle會給出快照太舊的錯誤)

  5. 數據庫永遠不會複製存儲在緩存中的數據,在Oracle的情況下,使用遊標共享會有一個緩存的遊標,並且每個客戶端遊標只需要保持其在緩存的遊標。

Oracle Database Concepts

參見8內存對於問題1,2,5

請參閱第13數據併發和一致性(問題3,4)

1

你在Date等中沒有找到它的原因是因爲它們可能會在DBMS產品之間發生變化,關係模型理論中沒有關於將連接池化到數據庫或如何從查詢維護結果集(如緩存等)。部分覆蓋的唯一一點是4 - 讀取級別將起作用(例如,未提交讀取),但是這僅適用於結果集已經產生之前。

+0

可以想見,現在,他們爲什麼AREN沒有涵蓋在關係理論文本中。但是,那麼,我會在哪裏找到他們的答案?在產品特定手冊中? JEE被吹捧爲獨立於底層的數據庫管理系統(DBMS)......它告訴我至少應該有一些不變的概念(或者一組概念/假設),應用程序開發人員可以選擇編程。 – Harry 2009-06-19 05:42:56

+0

而對於你對#4的迴應,結果集產生後會發生什麼? (謝謝,btw,花點時間回覆。) – Harry 2009-06-19 05:44:06