TableSample 平時用得少,基本上就是用於表裡面抽樣數據來看的。 用法如下 SELECT * FROM tbname TABLESAMPLE SYSTEM (N PERCENT/M Rows) REPEATABLE() TABLESAMPLE SYSTEM 這個表示使用System的方法進行
TableSample 平時用得少,基本上就是用於表裡面抽樣數據來看的。
用法如下
SELECT * FROM tbname TABLESAMPLE SYSTEM (N PERCENT/M Rows) REPEATABLE()
TABLESAMPLE SYSTEM 這個表示使用System的方法進行數據抽樣。(目前我也只知道有System這個方法)
N PERCENT/M Rows 可以選擇抽樣多少行,也可以抽樣多少百分比
REPEATABLE 關鍵字裡面還可以填入一個種子值,填充了之後每次可以得到一致的結果。
下麵做實驗,創建一個測試表
CREATE TABLE [dbo].[Tmp123] ( [ID] [int] NOT NULL IDENTITY(1, 1), [Col1] [char] (200) ) ON [PRIMARY] GO
塞進去500條數據
INSERT INTO dbo.Tmp123 ( Col1 ) VALUES ( 'abcd' ) GO 500
大概看了一下下,DBCC IND('Test','Tmp123',-1) 占用了15個數據頁,然後我們使用 tablesample 來進行抽樣
SELECT * FROM dbo.Tmp123 TABLESAMPLE (25 ROWS)
這裡執行之後發現。大概2次有1次沒有返回任何數據,然而返回的數據也並不是準確的25條。
這就是TableSample 的特性,是因為sql server 會根據System方法隨機決定是否要讀取該數據頁的數據進行顯示,只能說,請求的行數越多,會越接近TableSample裡面請求的行數。
那我們就可以進行一個變形
SELECT top 25 * FROM dbo.Tmp123 TABLESAMPLE (25 ROWS)
加上Top 去控制,那麼得到的行,最多是25行,但是也會有少於25行的情況出現。so ……你懂的~
然後再說下我瞭解到的情況,為什麼返回的幾率是差不多一半一半呢?是這樣紙的
1、這個表占用了15個數據頁,總數據量是500條,我請求了25條 ,占比是 25/500 = 5% (是的,無論請求行數還是百分比,都會轉換為百分比進行運算)
2、那麼每個數據頁的讀取可能性就是 5% 了~一共15個數據頁,其中沒有結果返回的概率是 (1-5%)^15 = 43% ,差不多50%,所以調用的時候就覺得一半一半,樣例越多越趨近這個結果
3、那如果現實的行比實際多,也是因為這個概率問題。如果表裡面的數據越多,請求的行數越多,越接近請求的值。
4、如果真想精確的控制行數來實現隨機,那麼請用
SELECT top 25 * FROM dbo.Tmp123 ORDER BY NewID()
好~說完了~