台灣最大程式設計社群網站
線上人數
1633
 
會員總數:243448
討論主題:188174
歡迎您免費加入會員
討論區列表 >> MS SQL >> 資料庫在大量資料篩選的時候變很慢
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
資料庫在大量資料篩選的時候變很慢
價值 : 100 QP  點閱數:532 回應數:4

樓主

Chris
門外漢
0 2
74 1
發送站內信

我在MSSQL 2016 上面寫了一個篩選程序
速度慢到不行, 請幫忙指導改進方法
select @count = count(UID) from TABLE1 where IsProcess = 0
while @count > 0
begin
Declare @Name nvarchar(100)
Declare @UID int
select Top 1 @UID = UID, @Name = Name from Table1 where IsProcess = 0

set @UID2 = ISNULL((select TOP 1 UID from TABLE2 where Name like N'%' + @Name + N'%'), 0)
if @UID2 > 0
begin
insert into tablerelation (UID1, UID2) values(@UID, @UID2)
end

update TABLE1 set IsProcess = 1 where UID = @UID

select @count = count(UID) from TABLE1 where IsProcess = 0

end

TABLE1 共用500萬筆資料
cpu 不到10%
memory 3G (系統有8G)

沒有其他的作業

原本預期至少要有秒200筆
現在每秒只剩下3,4筆
是否有解?
感激不盡



搜尋相關Tags的文章: [ MSSQL ] , [ 大量資料 ] ,
本篇文章發表於2017-11-11 23:04
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
不錯的參考

Daimom
捐贈 VP 給 Daimom 檢舉此回應
請多利用程式標籤

你最後一段

改成 set @count = @count+1
減少table的查詢

另外請你確定是否有設定索引
本篇文章回覆於2017-11-14 08:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

一頁書
檢舉此回應
天阿,500萬筆,這樣寫會被罵死,先把
select * into #TMP_TABLE from TABLE1 where IsProcess = 0
再用 #TMP_TABLE join TABLE2
做整批UPDATE吧
本篇文章回覆於2017-12-07 07:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Chris
檢舉此回應
其實

我table1 有10個欄位 要對照 10個基本資料檔(TABLE2只是其一), 換成代碼存到 tablerelation

因為 table2(們) 有一半是不能做完全比對的, 所以一半要用like
我知道set @count = @count + 1 會好一點, 但是瓶頸應該還是在 select Top 1 @UID = UID, @Name = Name from Table1 where IsProcess = 0
還不會用索引來參照, 正在精進中
我大概理解 沒有用索引, like 和 select 500萬 x ? 次 會慢死人
還在努力中, 目前用cursor 三小時
本篇文章回覆於2017-12-13 01:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
如果你用cursor的話
可以改用insert 多筆資料的方式塞值。
insert a(aa,bb,cc) values(a,b,c),(a,b,c)
但就是你要自己去串

不然在另外一種 ,用insert select的方式
insert into tablerelation (UID1, UID2) select UID,NAME from table1 a ....
把 UID 跟UID2 弄個一個資料表直接做insert
本篇文章回覆於2017-12-13 15:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.