SQL Server 2005分批加载大数据:行范围查询与总行数获取咨询
嘿,针对你做海量数据分批加载的需求,这两个问题刚好是分页查询的核心环节,不同数据库的实现语法略有区别,我给你整理了常用数据库的解决方案:
1. 选取指定范围的行(分页查询)
不管哪种数据库,一定要加上稳定的ORDER BY子句!不然数据库返回的结果顺序是不保证的,多次分页可能会出现重复或缺失的数据。
MySQL/MariaDB
用LIMIT语法,有两种写法:
- 偏移量 + 行数:
SELECT * FROM table ORDER BY id LIMIT 9, 10;
这里的9是偏移量(跳过前9行,从第10行开始),10是要取的行数,对应你说的“row 10 and next 10 rows”。 - 更直观的写法:
SELECT * FROM table ORDER BY id LIMIT 10 OFFSET 9;
如果要取第10到第20行(共11行),把10改成11就行。
PostgreSQL
支持LIMIT/OFFSET,也支持更语义化的FETCH NEXT:
-- 取第10行及之后的10行 SELECT * FROM table ORDER BY id OFFSET 9 FETCH NEXT 10 ROWS ONLY;
SQL Server
推荐用OFFSET...FETCH(SQL Server 2012及以上版本):
SELECT * FROM table ORDER BY id OFFSET 9 ROWS FETCH NEXT 10 ROWS ONLY;
如果是旧版本,只能用子查询+TOP:
-- 取第10到第20行 SELECT TOP 11 * FROM (SELECT TOP 20 * FROM table ORDER BY id) AS temp ORDER BY id DESC;
Oracle
12c及以上版本支持OFFSET/FETCH,和上面类似;旧版本用ROWNUM:
-- 取第10到第20行 SELECT * FROM (SELECT t.*, ROWNUM rn FROM table t ORDER BY id) WHERE rn BETWEEN 10 AND 20;
2. 获取表中的总行数
通用精确写法
几乎所有数据库都支持:
SELECT COUNT(*) FROM table;
COUNT(*)会统计所有行,包括包含NULL值的行,效率通常比COUNT(column_name)更高(因为不需要检查列的非空性)。
高效近似写法(适合超大表)
如果你的表数据量特别大,COUNT(*)可能会慢(需要全表扫描),可以用数据库的系统视图获取近似行数:
- MySQL:InnoDB引擎可以查
INFORMATION_SCHEMA.TABLES:SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database' AND TABLE_NAME = 'table'; - PostgreSQL:
SELECT reltuples::bigint FROM pg_class WHERE relname = 'table'; - SQL Server:
SELECT SUM(row_count) FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('table') AND index_id < 2;
这些方法返回的是近似值,但速度极快,适合分批加载时估算总页数的场景。
内容的提问来源于stack exchange,提问作者Angry Tomato
相关产品推荐
相关产品推荐

