这是一道设计/算法题。 这是我的场景的概要:
- 我有一个很大的数据表(比如 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/