Was ist der Unterschied zwischen TABLESAMPLE (10) und TABLESAMPLE (10 PROZENT) in SQL Server 2012?

8

Mein Verständnis der Verwendung von TABLESAMPLE ist, dass es die obersten n Prozent der Zeilen in einer Ergebnismenge zurückgibt, in der TABLESAMPLE (n)

Also habe ich die folgenden Abfragen geschrieben, um sie zu überprüfen (während ich T-SQL lerne).

SELECT FirstName,
       MiddleName,
       LastName
FROM Person.Person TABLESAMPLE(10)

SELECT FirstName,
       MiddleName,
       LastName
FROM Person.Person TABLESAMPLE(10 PERCENT)

Jede Abfrage gibt bei jeder Ausführung eine andere Anzahl von Zeilen zurück.

Also verstehe ich TABLESAMPLE offensichtlich nicht. Könnte jemand erklären?

David Folksman
quelle

Antworten:

0

TableSample () garantiert nicht die Rückgabe der von Ihnen angegebenen Anzahl oder%. Ich habe festgestellt, dass 0 Zeilen zurückgegeben werden können, weniger als von Ihnen angefordert und mehr als von Ihnen angegeben.

Ich habe diese Abfrage für die Tabelle "Bestellungen" in Northwind ausgeführt, die 829 Zeilen enthält.

select * from orders TableSample(10 percent)

In den verschiedenen Zeiten, in denen ich diese Abfrage ausgeführt habe, habe ich 124, 42,82, 85,0, 0, 84 erhalten.

user2063329
quelle
6

Die kurze Antwort lautet, dass TABLESAMPLEnicht garantiert wird, dass die von Ihnen angegebene Anzahl von Zeilen (oder%) zurückgegeben wird, da dies auf Seiten und nicht auf Zeilen basiert und alle Zeilen von den identifizierten Seiten zurückgibt. Sofern Ihre Tabelle nicht nur Spalten mit fester Breite enthält, können die auf der Grundlage von% oder der Anzahl der Zeilen herausgezogenen Seiten eine sehr unterschiedliche Anzahl von Zeilen enthalten.

Sie können dies mit der REPEATABLEOption konsistenter gestalten , aber dadurch wird nicht die richtige Anzahl von Zeilen zurückgegeben. Wenn Sie lediglich versuchen, eine genaue Anzahl oder einen genauen Prozentsatz zufälliger Zeilen abzurufen, verwenden Sie:

SELECT TOP (10) -- or 10 PERCENT
  columns
FROM dbo.table
ORDER BY NEWID();

Bitte lesen Sie diesen Tipp und diese Frage sowie alle Antworten durch .

Aaron Bertrand
quelle
3

Ich stimme @Aaron zu, aber ich sollte erwähnen, wenn Sie wirklich zufällige Datensätze möchten, ist dies besonders in großen Tabellen am besten geeignet:

SELECT * FROM Table1
  WHERE (ABS(CAST(
  (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10

Bitte lesen Sie die vollständige Beschreibung in MSDN

Ich hoffe das hilft.

QMaster
quelle