今天說一下 tablesample 這個東西


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()

好~說完了~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM