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