sql - 我的 SQL 表太大 : retrieving data via paging/segmenting the result?

标签 sql algorithm design-patterns

这是一道设计/算法题。 这是我的场景的概要:

  • 我有一个很大的数据表(比如 500 万行),我将其称为 Cars
  • 然后我有一个应用程序,它在这个 Cars 表上执行 SELECT *,获取所有数据并将其打包到一个数据文件中(然后上传某处。)
  • 我的应用程序生成的这个数据文件代表一个快照,表在某个时刻的样子。
  • 然而,表Cars 偶尔会被另一个进程更新,而不管应用程序当前是否正在从该表生成包。 (目前没有同步。)

我的问题:

Cars 表变得太大,无法对其执行单个 SELECT *。当我的应用程序一次检索所有这些数据时,它很快就会超过我机器的内存容量(比方说,2GB)。此外,简单地执行带有 LIMIT 或 OFFSET 的链式 SELECT 会失败同步条件:该表经常更新,我无法在 SELECT 调用之间更改数据。

我在找什么:

一种将整个表拉入内存容量小于数据的应用程序的方法,假设数据大小可能接近无穷大。特别是,如何为我的 SQL 选择实现分页/分段效果?即使用页码进行循环调用以检索下一段数据。理想的解决方案允许数据大小的可扩展性。

(为了简化我的场景,我们可以假设当给定一段数据时,应用程序可以处理/写入它,然后在请求下一段之前释放使用的内存。)

您能提供的任何建议都会很有帮助。谢谢!

编辑:根据要求,我的实现使用 C#.NET 4.0 和 MSSQL 2008。

编辑 #2:这不是 SQL 命令问题。这是与设计模式相关的问题:针对大表执行分页 SELECT 的策略是什么? (特别是当所述表收到一致的更新时。)

最佳答案

您使用的是什么数据库?例如,在 MySQL 中,以下将从第 40 行开始选择 20 行,但这是 mysql-only 子句(编辑:似乎 Postgres 也允许这样做)

 select * from cars limit 20 offset 40

关于sql - 我的 SQL 表太大 : retrieving data via paging/segmenting the result?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791993/

相关文章:

sql - 多维数据集、汇总和分组运算符之间有什么区别?

mysql - 在处理庞大的用户群时让迁移变得轻松

sql - SQL复制与空值

r - 如何从邻接表中找到循环路径

c++ - 在 C++ 中返回 "NULL reference"?

sql - Postgresql插入触发器连接

sql - 在 SQL 中的 2 个日期之间拆分数据

c++ - 红黑树实现

asp.net - 如何阻止网页表单中的页面变得过于臃肿

design-patterns - 您使用什么设计模式,它有什么好处?