當前位置:首頁 » 編程語言 » 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)