2009-06-19 109 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