当前位置:首页 » 编程语言 » sql分批搜索
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql分批搜索

发布时间: 2023-01-14 06:43:09

A. sql怎么控制检索出的最大数据量,数量太大机器受不了,有能分批检索的命令吗

用分页查询算法来实现。给你一个我写的通用分页存储过程,将这个存储过程创建在你的SQL数据库上,调用该过程即可实现分页查询:

/*
通用存储过程
只要传入页码,每页大小,查询的sql语句,排序方式(不需要order)即可
*/
CREATE Procere [sp_common_cuspage3]
(
@PageNo int, --当前查询页码
@PageSize int, --每页数量
@sql nvarchar(2000), --查询的SQL语句
@order nvarchar(200), --排序方式,例如:ResID desc
@totalcount int out --返回当前查询SQL的符合总条数
)
AS
Begin
declare @querysql nvarchar(2000)
declare @countsql nvarchar(2000)
declare @begin int
declare @end int
declare @totalPage int

--查询符合条件的条目数
set @countsql = N'select @count = count(*) from ('+@sql + N')G0'
exec sp_executesql @countsql, N' @count int output ', @totalcount output

--计算总页码及纠正当前页码
set @totalPage = (@totalcount-1)/@PageSize +1
IF(@PageNo > @totalPage ) set @PageNo = @totalPage

--计算起止位置
set @begin = @PageSize * (@PageNo-1)
set @end = @PageSize * @PageNo +1

--组合出SQL进行查询
set @querysql = N'select * from ('
set @querysql = @querysql + N' SELECT Row_Number() OVER(ORDER BY ' + @order + N' ) as RowID ,G0.* FROM ('
set @querysql = @querysql + @sql
set @querysql = @querysql + N' ) G0 ) G1'
set @querysql = @querysql + N' Where G1.RowID >' + CAST(@begin as nvarchar) + N' AND G1.RowID<'+CAST(@end as nvarchar)

--print @querysql
exec(@querysql)
End

B. sql2008数据库,九百万条数据,如何快速查询

根据你说的需求:
"可程序中需要查询每行的所有数据"、“查询全部九百万条数据”

-------------------------------
这样的需求跟索引没有关系了(因为已经肯定是走全表扫描的了),要提高效率的办法就是:1、提高硬盘的io速度;2、增加内存以使sql server有更多的缓存

另外,你程序不要一次性取那么多数据返回,这样会拖死的,建议你考虑变换下处理逻辑(如:分批取回--可以根据id列值进行分批;将数据直接在服务端存成文本再传回本地处理)。

"而是需要根据这些数据逐一进行其他功能的操作,这款程序是不联网的"
--------------------------------
就算这样的话,也不能一次性把9百万数据一次性取回,如果你非要取出来再操作的话,那你得考虑分批去取。或者你把处理逻辑写在存储过程,然后由SQL SERVER本身去完成逻辑处理。总之,不管怎样,你也是得优化你现在的处理逻辑(现有处理逻辑我觉得不合理,效率很低下)。

“真正部署到电力网的服务器上速度会不会提高呢”
------------------------
服务器当然比你本地要快得多啦,硬件配置根本就不同一个级别,但不管怎样,还是建议你参考上面的建议优化你的处理逻辑才行,否则,你系统的效率将很低。

C. 如何正确的进行大规模SQL语句的批量操作

在使用Statement的批量SQL命令操作的时候,一定要注意写入到内存中命令列表的SQL语句的数量级,在小规模的数据量下,可以将所有SQL语句添加到命令列表中,一次性执行executeBatch()方法,但是在大规模数据量的情况下,就应该分批将SQL语句添加到命令列表中,并在每次调用executeBatch()方法后,调用clearBatch()方法将命令列表中的SQL语句清空,注意了,一定要记得调用clearBatch()方法清空命令列表,不然即使分批添加SQL语句,一样要“out
of
memory”。同时由这个问题,我们也可以引申开来考虑考虑在编写将数据保存在内存中的操作的时候,也应该注意实际系统运行环境的内存配置所能支持的数据量,千万不能不管三七二十一的将数据一股脑儿往内存里塞。

D. sql语句是分批循环查询,定义一个pno,这段代码报错,应该如何修改啊

Stringstr2="";
for(intpno=0;pno<3;pno++){
if(pno==0){
str2="select*from(selectrownumrowa,d.*from(selectssw.sms_id,ssw.phone_numberfromsms_send_waitsswleftjoinsms_send_receivessronssr.sms_id=ssw.sms_idwherenotexists(selectssrb.phone_numberfromsms_send_receive_blacklistssrbwheressrb.phone_number=ssw.phone_number)andssw.send_wait_timebetweensysdate-1andsysdate+1)dwhererownum<=pno*2)whererowa>(pno-1)*2"
}else{
str2=str2+"union"+"select*from(selectrownumrowa,d.*from(selectssw.sms_id,ssw.phone_numberfromsms_send_waitsswleftjoinsms_send_receivessronssr.sms_id=ssw.sms_idwherenotexists(selectssrb.phone_numberfromsms_send_receive_blacklistssrbwheressrb.phone_number=ssw.phone_number)andssw.send_wait_timebetweensysdate-1andsysdate+1)dwhererownum<=pno*2)whererowa>(pno-1)*2"
}
}
pstmt=conn.prepareStatement(str2);
ResultSetrs=pstmt.executeQuery();
//你要是想把sql语句拼起来,一次性执行了,就用上面的方法,要是不想或不会拼,可以把pstmt=conn.prepareStatement(str2);
ResultSetrs=pstmt.executeQuery();
写到for循环里面,每循环一次执行一次,都可以的!

E. sql语句查询,分批显示查询结果

若果你有唯一的值id可以用下面的方法:
第一次:select top 5 from a
第二次:select top 5 from a where id not in (select top 5 id from a order by id asc)
第三次:select top 5 from a where id not in (select top 10 id from a order by id asc)
……
如此下去,控制后面那个子查询top的数量就行了。

F. sql分批查询

搜第二行的后面两条数据
SELECT * From im_friend WHERE id > '' ORDER BY 'id' ASC LIMIT 0,2

G. SQL分批查询

在查询的数据量比较大时,我们会采用分批查询的方式来查询数据库。
这是因为数据库会把满足查询条件的所有记录都装载到内存,造成大量资源被占用,严重影响系统运行的效率。
但是,数据库固有的存储过程不支持物理分页,所以如果采用分批查询方式,还需要开发人员编写自己的存储过程来实现。 具体的实现请从网上找,实现方式大致差不多!
这样,服务端每次只把若干条(一般20条)记录返回给客户端,这样,既节省资源,又加快通讯的效率!

H. 请教各位,如何分批获取数据库中数据

在有些业务场景中需要分批去取数据库表中的全部数据来进行处理,最简单的方法就是使用分页查询语句(偷懒以MySQL为例):

[sql] view plain print?
select * from datatable limit offset,amount

select * from datatable limit offset,amount

这里就会有一个问题,随着offset值的越来越大,这条sql要扫描的表数据就会越来越多,因为要定位到offset这一行就需要扫描比offset小的所有行。显然在一张大数据量的表中,去这样做,性能就会出问题。为了避免这样的情形出现,我们自然会想到使用索引来解决,比如使用自增序列id进行分批取:

[sql] view plain print?
select * from datatable where id >= start and id<start+batchCount

select * from datatable where id >= start and id<start+batchCount

这样我们对id建索引,然后分批去取,显然效果会高很多,但是如果自增序列由于删除等操作变得不是连续,就会出现空执行和多执行的情况出现。要解决这个方法,我们就需要结合使用索引和分页的优势来处理:

[sql] view plain print?
select * from datatable where id >= start limit batchCount

select * from datatable where id >= start limit batchCount

然后每次取回来我们再计算出起始id值,再去取下一批数据。这样就可以既避免了第一种不走索引,查询性能低下的问题,又解决了第二种id不连续,导致取回来的数据量不稳定导致浪费的问题了。

I. 求问 hadoop +hive ,怎么通过hive的sql实现分页查询(分批查询)。

简单的办法是按小时分区,之后一次取一小时

J. 我要查询 上万记录 怎么分批查询并且分页显示

看你用的什么数据库

mssql

select top 每页显示数 * from table
where id not in ( select top 每页显示数*(当前页数-1) id from table )

mysql
select * from table limit 每页显示数*(当前页数-1),每页显示数

oracle
select * from
( select rownum r,a.* from table a where rownum <= 每页显示数*当前页数) b
where b.r > 每页显示数*(当前页数-1)