使用 TABLESAMPLE 限制结果集
TABLESAMPLE 子句將從 FROM 子句中的表返回的行數限制到樣本數或行數的某一百分比。例如:
復制代碼 TABLESAMPLE (10 PERCENT) /*Return a sample 10 percent of the rows of the result set. */
TABLESAMPLE (15 ROWS) /* Return a sample of 15 rows from the result set. */.不能將 TABLESAMPLE 應用于派生表、鏈接服務器中的表以及通過表值函數、行集函數或 OPENXML 派生的表。不能在視圖或內聯表值函數的定義中指定 TABLESAMPLE。
TABLESPACE 子句的語法如下:
TABLESAMPLE [SYSTEM] (sample_number [ PERCENT | ROWS ] )
[ REPEATABLE (repeat_seed) ]
注意:
TABLESAMPLE 是在 SQL Server 2005 中引入的。當 TABLESAMPLE 用于從早期版本升級的數據庫時,數據庫的兼容級別必須至少設置為 90。若要設置數據庫兼容性級別,請參閱 ALTER DATABASE (Transact-SQL)。
?
當下列任一條件為真時,可以使用 TABLESAMPLE 從大型表中快速返回樣本:
樣本不必是單個行級別的真正隨機抽樣。
該表各頁上的行不必與同一頁上的其他行相關聯。
重要提示:
如果確實需要單個行的隨機抽樣,則應修改查詢以隨機篩選出行,而不是使用 TABLESAMPLE。例如,以下查詢使用 NEWID 函數返回 Sales.SalesOrderDetail 表的大約百分之一的行:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SalesOrderID 列包括在 CHECKSUM 表達式中,從而 NEWID() 每次計算一行以獲取每行抽樣。表達式 CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) 的計算結果為介于 0 和 1 之間的隨機 float 值。
?
? 使用 SYSTEM 選項
SYSTEM 指定與 ANSI SQL 實現相關的抽樣方法。指定 SYSTEM 是可選的,但是此選項是 SQL Server 中唯一可用的抽樣方法,并且是默認應用的方法。
TABLESAMPLE SYSTEM 返回行的近似的百分比,并針對表中每個物理 8 KB 頁生成隨機值。樣本中可以包括頁,也可以不包括頁,具體情況根據頁的隨機值以及查詢中指定的百分比來確定。樣本中包含的每一頁都返回樣本結果集中的所有行。例如,如果指定 TABLESAMPLE SYSTEM 10 PERCENT,則 SQL Server 返回該表的大約 10% 的指定數據頁中的所有行。如果這些行均勻分布在表的各頁上,并且表中存在足夠多的頁,則返回的行數應接近所需樣本的大小。但是,由于針對每頁生成的隨機值與針對任何其他頁生成的值無關,因此,返回的頁百分比可能會大于或小于所需的百分比。可以使用 TOP(n) 運算符將行數限制到指定的最大數。
指定行數而不是指定基于表中總行數的百分比時,此數將轉換為行數的百分比,進而轉換為應返回的頁數的百分比。然后使用此計算得到的百分比執行 TABLESAMPLE 操作。
如果表由一頁組成,則返回此頁上的所有行或不返回任何行。在這種情況下,TABLESAMPLE SYSTEM 只能返回頁上的 100% 或 0% 行,而無論頁上的行數是多少。
針對特定表使用 TABLESAMPLE SYSTEM,限制了在此表中使用表掃描計劃的執行(如果存在堆或聚集索引,則為堆的掃描或聚集索引的掃描)。盡管計劃顯示已執行表掃描,但實際上只需要從數據文件中讀取結果集中包含的那些頁。
重要提示:
使用 TABLESAMPLE SYSTEM 子句時應謹慎,還應了解使用樣本的某些影響。例如,兩個表的聯接可能返回兩個表中每行的匹配行;但是,如果對兩表中任意一個指定 TABLESAMPLE SYSTEM,則從未抽樣表中返回的某些行不大可能具有抽樣表中的匹配行。此行為可能使您懷疑基礎表中是否存在數據一致性的問題,但實際上數據是有效的。同樣,如果針對聯接的兩個表指定 TABLESAMPLE SYSTEM,則發現的問題可能會更嚴重。
?
? 使用 REPEATABLE 選項
REPEATABLE 選項導致再次返回選定的樣本。使用同一個 repeat_seed 值指定 REPEATABLE 時,只要未對表進行任何更改,SQL Server 將返回相同的行子集。使用其他 repeat_seed 值指定 REPEATABLE 時,SQL Server 通常將返回表中行的不同樣本。對表的以下操作將視為更改:插入、更新、刪除、索引重建、索引碎片整理、還原數據庫和附加數據庫。
? 示例
A. 選擇行的百分比
Person.Contact 表包含 19,972 行。下列語句將返回大約 10% 的行。每次執行此語句時,返回的行數通常都不同。
復制代碼 USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact
TABLESAMPLE (10 PERCENT) ;B. 選擇帶有種子值的行的百分比
每次執行時,下列語句都將返回同一組行。種子值 205 是任意選擇的。
復制代碼 USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact
TABLESAMPLE (10 PERCENT)
?? REPEATABLE (205) ;C. 選擇若干行
下列語句將返回大約 100 行。實際返回的行數可能會有很大差異。如果指定較小的數值,例如 5,則在示例中可能收不到任何結果。
復制代碼 USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact
TABLESAMPLE (100 ROWS) ;
總結
以上是生活随笔為你收集整理的使用 TABLESAMPLE 限制结果集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中级软件测试笔试题100精讲_软件测试工
- 下一篇: 离线网页 HTML+CSS+DIV