我通过Date和Silberschatz掠过,但似乎无法找到我这些具体问题的答案。
如果2个数据库用户发出查询 - 比如'select * from AVERYBIGTABLE;' - 查询结果通常存储在哪里...即,与结果集的大小无关?
一个。在DBMS服务器的OS管理的物理/虚拟内存中?
湾在DBMS管理的临时文件中?
每个连接是否维护了查询结果集?
如果每个连接确实维护了查询结果集,那么如果连接池生效(通过位于DBMS上方的一层代码)会怎么样?那么,不会每个查询(而不是每个连接)维护结果集吗?
如果数据库在用户同时发出选择查询的同时实时更改,那么查询发布者已经执行但尚未(完全)“消耗”的查询会发生什么?例如,假设结果集有50,000行;用户当前正在第100次迭代,当并行另一个用户执行插入/删除时,如果先前的查询要由DBMS的任何用户重新发出,那么它将导致多于/少于50,000行?
另一方面,如果数据库没有实时更改,如果2个用户发出相同的查询,每个查询具有相同但非常大的结果集,那么DBMS是否会保留2个相同的结果集副本,或者它会有一个共享副本吗?
非常感谢提前。
答案 0 :(得分:1)
在Date etc中没有找到它的原因是因为它们可以在DBMS产品之间进行更改,关系模型理论中没有关于池连接到数据库或如何从查询维护结果集的任何内容(如缓存)等等)。部分覆盖的唯一点是4 - 其中读取级别将起作用(例如,读取未提交),但这仅适用于生成结果集。
答案 1 :(得分:1)
其中一些可能是Oracle特有的。
查询的完整结果不需要复制每个用户获取一个游标(如指针),该游标维护已检索的行,以及仍需要获取哪些行。数据库将在从表中读取数据时尽可能多地缓存数据。与两个用户具有相同的主体,只读文件句柄。
每个连接都维护游标,下一行的数据可能已经存在,也可能不存在。
大部分连接都是单线程的,一次只有一个客户端可以使用连接。如果在同一连接上执行两次相同的查询,则重置光标位置。
如果游标在正在更新的表上打开,则旧行被复制到一个单独的空间(在Oracle中撤消)并在游标的生命周期内维护,或者至少在它用完之前空间来维持它。 (Oracle会给出快照太旧的错误)
数据库永远不会复制存储在缓存中的数据,在Oracle的情况下,使用游标共享会有一个缓存的游标,每个客户端游标只需要在缓存的游标中保持其位置。
< / LI> 醇>请参阅8记忆问题1,2,5
参见13数据并发和一致性(问题3,4)