對於SQL 隨機抽樣我們常想到的就是newid(),但如果對於一個在百萬、千萬甚至更大海量數據表中抽樣的話,簡單的newid(),其性能,效率就不是很理想了。所以在這里有必要討論一下,擇優而用。
long_goods是一個百萬數據的表,Ctrl+L執行以下語句:
--id_index是我為主鍵加的一個非聚焦索引
SELECT top 1 * FROM long_goods order by newid()
--查詢開銷 43%
SELECT top 1 * FROM long_goods with(index=id_index) order by newid()
--查詢開銷 54%
select top 1 * from long_goods where id=(select top 1 id from long_goods order by newid())
--查詢開銷 1%
select top 1 * from long_goods where id=(select top 1 id from long_goods with(index=id_index) order by newid())
--查詢開銷 1%
雖然第三個與第四個的開銷是一樣,但實際應該是第四種優於第三種。
如果MS SQL2005升級到支持 TABLESAMPLE 的話,以下語句的抽樣執行效率可為最優的
SELECT * FROM long_goods TABLESAMPLE SYSTEM (10 PERCENT)
呵呵..下班了,至於其中原因,下次有空再續.
轉自: http://blog.csdn.net/lwlsky/article/details/5620818