是否有類似 Delete top 1000 * from tablename 的指令呢? |
答題得分者是:Mickey
|
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
各位先進好:
我使用的資料庫系統是 SQL Server 2000 程式是 Delphi 6 ,
目前我用的語法如下
Insert into temptable Select top 1000 * from starttable
Delete from starttable where key in ( Select key from temptable)
雖然可以 work,但我是在想,當初我 Insert 過去的是原資料表的前
一千筆,那 Delete 時,直接刪掉前一千筆就好了,還要再一筆一筆的
比對主鍵再刪除不是很浪費時間嗎? 可惜我查不到類似
Delete top 1000 * from tablename 的指令,那若是像這樣
Delete from starttable where key in ( Select top 1000 key from startable) 的話,還是得經過比對主鍵的動作…
請大家幫忙,謝謝。
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
Hi, cashxin2002 您好: 我在 Query analyzer 中使用這個語法
delete from ( select top 1000 * from newtest)
出現如下錯誤訊息
伺服器: 訊息 170,層級 15,狀態 1,行 1
行 1: '(' 附近的語法不正確。 下 Delete From newtest (Select Top 1000 * From newtest) 出現 伺服器: 訊息 156,層級 15,狀態 1,行 1
關鍵字 'Select' 附近的語法不正確。
伺服器: 訊息 170,層級 15,狀態 1,行 1
行 1: ')' 附近的語法不正確。 下 Delete From newtest in (Select Top 1000 * From newtest) 出現
伺服器: 訊息 156,層級 15,狀態 1,行 1
關鍵字 'in' 附近的語法不正確。 所以我想這個語法也是不行地…抱歉,謝謝您花費寶貴的時間為我解答。
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
azurecloud 你好 : 節錄一段 MSSQL 的線上說明文件, 參考看看 :
E. 使用 DELETE 以及 SELECT 加上 TOP 子句 由於 SELECT 陳述式可在 DELETE 陳述式中指定,因此 TOP 子句也可以用在 SELECT 陳述式之內。例如,這個範例刪除了 authors 資料表的前 10 位作者。 DELETE authors FROM (SELECT TOP 10 * FROM authors) AS t1 WHERE authors.au_id = t1.au_id發表人 - Mickey 於 2003/10/17 09:35:05 |
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
報告 站長 及 Mickey 版主:
其實我用的語法也是類似這樣(在發問題目中):
Delete from starttable where key in (Select key from temptable) 是可以 work 的,但是小弟貪心,想看看有沒有執行效能更快的方法
我在猜 select top N 這種語法是用類似迴圈的方法實作出來的,會
比較快(因不需經過 "比對" 的動作,直接從第一筆抓到第 N 筆) 而無論是
delete from newtest where new_id in (select top 1000 new_id from newtest) 或是
DELETE authors
FROM (SELECT TOP 10 * FROM authors) AS t1
WHERE authors.au_id = t1.au_id
可看出都是先 "比對" 出要刪除的主鍵後,再刪除該筆資料,我想速度會慢很多。小弟我做了一個小小的實驗:在 SQL Server 2000 的 Query Analyzer 下
如下指令,後面的註解是每次執行的秒數,我的電腦是 celeron 1.8G RAM 256M 硬碟 7200 RPM SELECT TOP 200000 * INTO TEMP FROM mytable -- 57 sec -- 49 sec -- 51 sec -- 49 sec -- 52 sec -- 50 sec -- 46 sec -- 52 sec (1) DELETE FROM TEMP WHERE KEY IN (SELECT TOP 200000 KEY FROM mytable) -- 53 sec -- 48 sec --49 sec
(2) DELETE TEMP FROM (SELECT TOP 200000 KEY FROM TEMP ) AS T1 where mytable.key = T1.key -- 44 sec -- 48 sec --41 sec (3) DELETE FROM TEMP -- 31sec --35 sec -- 33 sec DROP TABLE TEMP -- 0 sec -- 0 sec (select into 後直接刪除的話) 可看出雖然是 delete 同樣的東西,加了 select 子句後,速度硬是不同,而
直接 DROP TABLE 則是速度飛快,我推測 SQL Server 是直接重建一個新資料表綱目再將指標指向它(有點像快速格式化的做法。)
實驗中 Mickey 版主提供的語法有較快的執行效率,和我想的不太一樣?原本
我是認為若再建一個 T1 後再比對的話會較花時間,不如直接和原本的 table
比對就行了,卻發現不是這樣…不知道為什麼?
實驗中我發現了很有趣的一個現象,就是下 DROP TABLE 指令時,若是接在
(1)和(3)delete 之後而下的話,執行時間會變成 6 秒(有 200000 萬筆資料時甚至不到一秒,而 delete 完後沒有資料在表中時卻要 6 秒???) ,select into 後(表中有 200000筆)直接下 DROP TABLE 時不到一秒,而接在(2)delete 後的 DROP TABLE 指令只要 2~3 秒,顯示 Mickey 版主提供的語法在刪除資料表上也有較好的效率。
所以根據上述的實驗結果,我將得分給 Mickey 版主,謝謝兩位費心幫我解答。 PS.如果有人知道上述現象的原理可否解說一下?
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |