iT邦幫忙

0

正式執行的T-SQL是不是不應該出現 Select * FROM xxx?

如題

我在幫人家看一個問題,他說他跑一支T-SQL腳本跑得很慢,超級無敵慢

我看了一下,裡面的內容有一段大概是長這樣

其目的是在一個指標(Cursor)的迴圈裡,依當下的條件檢測某個資料表中是否可以撈到資料,如果可以,就把旗標設為一個特定值

※為簡略表示,Cursor的部分就單純用while迴圈跑1萬次表示.

While (@i < 10000)
begin
    select * from tableA
    IF @@ROWCOUNT > 0
        select @flg = 'A'
    
    select * from tableB
    IF @@ROWCOUNT > 0
        select @flg = 'B'
        
    select * from tableB
    IF @@ROWCOUNT > 0
        select @flg = 'B'
        
    select @i = @i + 1
end

都是用select之後,再去檢查有沒有資料.

以上這段是資歷10幾年的IT人員寫的......

以我這菜鳥來看,應該是要這樣寫才對吧?

DECLARE @tmpRowCount int
While (@i < 10000)
begin
    select @tmpRowCount=count(field1) from tableA
    IF @tmpRowCount > 0
        select @flg = 'A'
    
    select @tmpRowCount=count(field1) from tableB
    IF @tmpRowCount > 0
        select @flg = 'B'
        
    select @tmpRowCount=count(field1) from tableC
    IF @tmpRowCount > 0
        select @flg = 'C'
        
    select @i = @i + 1
end

各位先進怎麼看呢?

看更多先前的討論...收起先前的討論...
石頭 iT邦高手 1 級 ‧ 2018-09-07 19:29:19 檢舉
可否提供更完整的需求或範例. 目前程式碼邏輯我看不出有甚麼邏輯... 只要 tableC 表有資料 @FLG 變數 一定都是C
跑1萬次的無效迴圈....真的看不出為什麼...要這樣寫= =a
另外你偵測有無資料用top 1 @tmpRowCount = 1
會比較快吧...
Ryan iT邦新手 4 級 ‧ 2018-09-08 16:21:45 檢舉
為什麼要跑一萬次迴圈,看不出來這樣子寫的好處,
這樣等於三張表要scan table要做三萬次!
如果表格很大超過幾萬筆資料也會跑相當久又佔硬體(CPU/IO)資源!
優化寫法會比較好,如果只能把select寫在大量迴圈裡,用top 1或where下條件限縮撈取範圍為上策。
@@ROWCOUNT 是內建的全域變數,他要找的是只要有異動就計數
既然是有異動就計數,那麼你自以為是的只找單一欄位,還用 COUNT() 去做,這樣對嘛
用語不佳請見諒,但請先多少理解一下為啥這麼做再來劈砍會比較好
77012904 iT邦新手 3 級 ‧ 2018-09-11 08:55:08 檢舉
用rowcount 當然沒問題,有問題的是前面的Select,會把資料呈現到ssms,導致ssms消耗大量資源
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
ezdoc
iT邦新手 2 級 ‧ 2018-09-08 09:52:47

若資料筆數不需要reuse, 是不是改用
If exists (select ....) set ...
會好一些

0

只要是減少資源上的浪費上,該思考的是如何減少操作的次數,
光是把select寫在迴圈內,就應該試著簡化是否能一次性達到目的,
而不是讓它隨著迴圈執行處理的次數

我要發表回答

立即登入回答