Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 从RDMS中提取大列表数据的最有效方法是什么?_Database_Performance - Fatal编程技术网

Database 从RDMS中提取大列表数据的最有效方法是什么?

Database 从RDMS中提取大列表数据的最有效方法是什么?,database,performance,Database,Performance,我正在开发一个包含数千项的系统,这些项必须呈现给用户进行选择。每个行项目显示由大量数据和选项/链接组成,必须从数据库中的许多表中读取以呈现行上的所有信息和链接。有成千上万条线 显然,我们过滤、分页或以某种方式限制结果数据集,因为当用户只选择一个项目时,我们实际上不需要在页面上显示4000个项目 让我们假设我们是分页的。我在这里看到的问题是,为了显示第3页,例如,我们必须知道每页有多少项,然后以某种方式生成一个sql,只检索一页的3页。请记住,要显示的列表可以按许多数据列中的任何一列进行排序,因此

我正在开发一个包含数千项的系统,这些项必须呈现给用户进行选择。每个行项目显示由大量数据和选项/链接组成,必须从数据库中的许多表中读取以呈现行上的所有信息和链接。有成千上万条线

显然,我们过滤、分页或以某种方式限制结果数据集,因为当用户只选择一个项目时,我们实际上不需要在页面上显示4000个项目

让我们假设我们是分页的。我在这里看到的问题是,为了显示第3页,例如,我们必须知道每页有多少项,然后以某种方式生成一个sql,只检索一页的3页。请记住,要显示的列表可以按许多数据列中的任何一列进行排序,因此在我看来,我们必须要求从数据库中返回整个结果集,然后在程序中仅从第3页中选择我们想要的项目,因为在SQL中,无法从select blah blah blah x,y,z中说出30-40行

然后是获取数据的问题。我可以一次完成,获取所有需要的数据,然后从第30-40行中提取我得到的数据,但是在数据库中这是一项大量的工作,我将扔掉大部分数据

因此,也许我只需要通过一个过程来获取标识符列表,然后我再创建一个复杂得多的sql,通过PK中某个行标识符的IN子句来获取这10行所需的所有数据。一页两遍听起来是个很慢的主意。我还发现,我要求数据库做的工作越多,DBA就越生我的气。因此,理想的做法是在应用服务器上尽可能多地转储工作,但这当然意味着通过网络将大量数据从数据库拉到应用服务器,这也是一个缓慢的解决方案

那么这是更好的方法吗?还是有其他更好的范例

现在让我们假设我们正在过滤。用户可以选择一些筛选条件。我们遇到了同样的问题,用户可以删除所有过滤器,然后我将从数据库中加载4000个数据密集型行,这几乎需要我进行分页

这里的目标是在被迫从大量表格中读取大量数据以呈现一页信息的同时,实现类似谷歌的快速页面时间

随着时间的推移,我逐渐意识到谷歌所做的事情并没有那么复杂。我的意思是搜索页面的结果集的数据集相当有限。我不怀疑他们如何获取这些数据是非常复杂的,但任何给定的搜索结果都不是由那么多信息组成的

我的问题是,我在显示的页面上的每一行中都有很多信息,而且我的所有数据都分布在一组表和数据库中,这一限制使我受到了限制


因此,虽然我意识到我拥有的基础设施永远不会达到谷歌式的响应时间,但从数据库中呈现页面数据的最佳方式是什么?

事实上,有一种方式可以让数据库告诉我查询中的第30-40行。你要找的是极限和偏移。这可能是最好的解决方案,它让数据库做它最擅长的事情


而且,听起来您正处于考虑缓存的最佳位置。您有一组非常昂贵的查询,但它们似乎不会很快改变,使用Memcached之类的工具保存查询结果的副本可能会很有用。

有趣的想法,Memcached。我会查找limit和offset,我一直认为这是特定于db的扩展,不是标准SQL,但我会检查一下。啊,我知道这是postgresql。不是通用的sql表达式。