Heim >Datenbank >MySQL-Tutorial >Wie wähle ich effizient eine bestimmte Anzahl von Zeilen in SQL Server aus?
Abfrage 1:
DECLARE @Range AS INT = 10 ;WITH CTE AS( SELECT TOP (@Range) Duration = ROW_NUMBER() OVER(ORDER BY OBJECT_ID) FROM sys.all_columns ORDER BY [Object_id] ) SELECT Duration from CTE
Erklärung:
Diese Abfrage ist durch die Anzahl der Zeilen in sys.all_columns begrenzt Tisch. Wenn Sie @Range auf 10.000 setzen, werden daher nur 7.374 Zeilen zurückgegeben, da dies die Anzahl der Zeilen in sys.all_columns ist.
Abfrage 2:
DECLARE @start INT = 1; DECLARE @end INT = 10; WITH numbers AS ( SELECT @start AS number UNION ALL SELECT number + 1 FROM numbers WHERE number < @end ) SELECT * FROM numbers OPTION (MAXRECURSION 0);
Erklärung:
Diese alternative Abfrage verwendet a rekursiver gemeinsamer Tabellenausdruck (CTE), um eine Zahlentabelle von @start bis @end zu generieren. Die OPTION (MAXRECURSION 0) ist notwendig, um Rekursionsfehler beim Erstellen einer Tabelle mit einer unbegrenzten Anzahl von Zeilen zu verhindern.
Kaskadierte CTE-Lösung:
Erklärung:
Ein kaskadierter CTE-Ansatz ist der schnellste Weg, eine „Tally Table“ für zu erstellen eine große Anzahl von Zeilen.
DECLARE @Range AS INT = 7374 ;WITH E1(N) AS( -- 10 ^ 1 = 10 rows SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) ), E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows CteTally(N) AS( SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) FROM E8 ) SELECT * FROM CteTally
Vorteile von kaskadiertem CTE:
Das obige ist der detaillierte Inhalt vonWie wähle ich effizient eine bestimmte Anzahl von Zeilen in SQL Server aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!