为什么查询的数据在结果集中返回而不是在数组中返回



为什么大多数编程语言在从数据库返回数据时使用结果集的概念?为什么结果不直接返回到一个更常见的,立即可用的结构,如数组?为什么在查询和能够更好地使用结果之间需要这个额外的层?

数组就是数据的容器。结果集是一个更强大的抽象,它封装了数据库服务器和发出数据检索请求的客户机程序之间非常复杂的交互。

"立即可用的"……这太天真了。是的,当然,通常您只是想要数据,而且通常一切都很顺利,结果集对象可能看起来有点障碍。但是你应该停下来想一想你正在执行的数据检索背后的复杂性。

数据抓取

第一个也是最重要的考虑是数组是一个静态结构,包含所有行的所有数据。虽然对于小型查询来说,这似乎是一个很好的解决方案,但我向您保证,在大多数情况下并非如此。它假定获取所有数据只需要很少的时间和内存,但事实并非总是如此。

RDBMS每次只返回一行…事情通常就是这样的。这样他们就可以为许多客户服务……您也可以取消您的数据检索…或者,如果你占用了太多的资源,RDBMS可能会让你崩溃。

结果集处理从后端获取一行或一页行或所有行的复杂性,可能在内部缓存结果。然后,它允许程序一次只访问一行数据,添加方法来来回导航,而不必考虑幕后发生了什么。这通常不是你能知道的,但有很多优化和陷阱。

<<p> 单向查询/strong>

某些RDBMS上的某些查询如果单向执行会更有效。也就是说,您告诉服务器永远不需要查找已经获取的数据行。但是结果集对象通常可以在内部缓存这些数据,并允许程序导航到它(而不会干扰服务器)。

<<p> 可更新查询/strong>

一些RDBMS支持SELECT FOR UPDATE。结果集对象通常允许程序修改获取的数据,然后在内部处理所有必要的操作,以在底层数据库上反映这些更新…在许多语言中,即使RDBMS不支持SELECT FOR UPDATE,这也是可能的。

更好地处理异常

当你请求数据时,如果一切顺利,你会得到一个可以放入数组的数据流…如果出了问题,你会得到一个信息流,需要一个不同的结构来处理。结果集对象可以为客户端程序提供结构化信息……也许还能提供一种恢复的方法。


我正在添加一些关于光标的更多信息,尽管它与这个问题不太相关。从服务器获取行是通过使用CURSOR来完成的。它通常包括4个步骤(声明游标,打开它,使用它来获取数据,然后关闭它)。声明并打开CURSOR会在服务器上分配资源,这些资源用于记住特定客户端请求的内容以及已经返回的数据。抓取允许浏览结果集并检索另一行数据(不一定是下一行)。关闭游标告诉服务器您已经完成了该请求,并允许它释放这些资源。

因为数组需要一次分配所有内存,并且需要立即提取所有结果。你可能想要流式传输数tb的数据。或者您可能希望停止提取结果并中途中止查询。

还要注意,特定API公开查询结果的方式是任意的。您可以自己编写一个API,将数据作为数组公开给您。这是API创建者的设计选择

相关内容

  • 没有找到相关文章

最新更新