Czas pobierania całej tabeli

0

Dobrzy ludzie, przychodzę z pytaniem, które od jakiegoś czasu mnie nurtuje, a nie potrafię znaleźć na nie odpowiedzi.

Mam w MS SQLu tabelę złożoną z przeszło stu sześćdziesięciu kolumn wszelkiej maści, choć w większości CHAR i NUMERIC. Przy nieco ponad 19k rekordów tabela waży 36MB.
Pomińmy fakt, że wiele z pól wypchane jest spacjami i skorzystałbym na zmianie ich na VARCHAR oraz to, że przydałoby się podzielić tę tabelę na conajmniej dwie, bo zastanawia mnie cos zupełnie innego.

Wrzuciłem bazę do siebie na localhosta, na dysk SSD (żeby nie było, choć to nie powinno mieć znaczenia w moim przypadku), dla pewności odbudowałem indeks klastrowany (czy tam klastrowy, jak kto woli) i odpalam sobie magiczne zapytanie

SELECT * FROM tabela

Plan zapytania wygląda niemagicznie i tak, jak bym się go spodziewał, czyli wyłącznie Clustered Index Scan.

Wszystko fajnie, pięknie, ale zwrócenie wyniku takiego zapytania w SSMS trwa trzy sekundy. I tu się gubię ze swoja płytka znajomością bebechów MSSQLa - serwer jest nieprzeciążony, zasobów ma aż nadto (bo 12GB RAMu raczej mu nie jest potrzebne do takiej operacji), a odczytanie 36MB trwa 3 sekundy? To samo zapytanie wykonane z mojej aplikacji trwa sekundę. Czyli tak, jakby dwie sekundy SSMS potrzebował dwóch sekund na wyświetlenie? Mniejsza o to. Co z tą sekundą? Jedna tabela, bez joinów, bez sortowania, agregacji. Po prostu wysłanie niecałych 40MB z RAMu (przy drugim i kolejnych wywołaniach nie ma już fizycznych odczytów) bezpośrednio do aplikacji odpalonej na serwerze. Co się składa na ten czas? Tylko bez wyzwisk, proszę :)

0

No dobra a wez zrob SELECT nazwy_kolumn, nazwy kolumn i zobacz ile czasu bedzie gdy wypiszesz te 60 kolumn

1

Jedyne co mi przychodzi do głowy to, że SSMS nie ma pojęcia o typach danych podczas zapytania i sięga jeszcze w inne miejsca i robi inne zapytania, żeby dociągnąć meta dane, a potem zbudować grida.
Możesz zobaczyć co się stanie jak odpalisz takie zapytanie z 1 zamiast * - wówczas powinien pobrać tabelkę źle nie będzie potrzebował dodatkowych informacji do jej wyświetlenia.

0

Wiele razy słyszałem, że wylistowanie wszystkich kolumn w selekcie działa szybciej, niż *, ale nigdy jakoś tego nie zaobserwowałem. Działa to tak samo długo.
"Select 1" siłą rzeczy zadziała szybko, bo serwer musi jedynie sprawdzić, ile ma rekordów w tabeli (ile jedynek zwrócić) - 350ms w SSMS
Podobnie, jeśli wybiorę sobie jedną kolumnę, czy kilka Im więcej kolumn wymienię, tym dłużej trwa pobieranie i czas ten rośnie do czasu pobierania wszystkiego - to wydaje się mieć sens, że im mniej danych chcę dostać, tym krócej będzie trwało ich pobranie, przesłanie i wyświetlenie.

Nie jest jednak kwestią, że ta gwiazdka coś psuje, nie w tym problem. Jeśli stworzę sobie tabelę z dwiema kolumnami, gdzie jedna to ID, a druga to jakiś tekst i upcham w nią kilkadziesiąt megabajtów (odpowiednio dużo rekordów), to jej pobranie będzie trwało dużo dłużej, niż tego bym oczekiwał.
Naiwnie myślałem, że skoro baza znajduje się na dysku SSD, (który nie ma problemu z losowymi odczytami, bo czas dostępu jest wręcz pomijalny), a na dodatek cała jest scache'owana w RAMie, to odczyt lokalny będzie zdecydowanie szybszy, niż te 30MB/s. Chyba, że to jakiś błąd w konfiguracji samego serwera?

1

@Fac: Jak sobie spojrzysz na logiczną sekwencję wykonywania się zapytania https://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/ to select jest na samym końcu. Czyli najpierw baza odczyta dane dopiero będzie z nimi coś robić. Dane w SLQ serwerze trzymane są w wierszach (jak we wszystkich bazach sql) więc raczej do odczytu danych z dysku nie będzie miało znaczenia trzy potrzebujesz samego id czy wszystkich 160 kolumn - chyba że wystarczy odczytanie samego indeksu. Oczywiście późniejsze przesyłanie przez sieć itp jak najbardziej ma znaczenie co do ilości kolumn, jak i ewentualne wyplucie tego na GUI w SSMS w generycznym gridzie.

0

@UglyMan: Tym niemniej, jeśli fizycznie danych jest niewiele (nie oszukujmy się, 40MB to dla dzisiejszego sprzętu tyle, co nic), a serwer nie musi ich procesować (bo nie każę mu ich filtrować, przeliczać, ani choćby sortować), to ich odczyt powinien trwać tyle, co nic. Czemu się mylę?

1

@Fac: Ale odczyt może być szybki: późniejsze ich przetworzenie (160 kolumn) to może być "probolem". Robienie porównywanie na podstawie SSMS nie jest zbyt miarodajne.

2

A dlaczego jesteś przekonany, że te dane w ogóle są w RAM? Dawno się tym nie bawiłem a i tak nie mam w tym dużego doświadczenia to mogę się mylić, ale może zobacz czy da się coś sprawdzić pod kątem tego co ten Twój serwer trzyma w pamięci. Na szybko znalazłem coś takiego https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/monitor-and-troubleshoot-memory-usage?view=sql-server-ver15

0

@UglyMan: Stworzyłem sobie tabelę z czterema kolumnami CHAR(36), napasłem ją 220K rekordów i czas wykonania SELECTa jest podobny, co w moim "produkcyjnym" przypadku.

Może zadam pytanie inaczej - czy to jest całkowicie normalne, że trwa to tak "długo", czy może powinienem szukać jakiegoś błędu w konfiguracji?

0

to uzyj cache moze :)

3

@Fac: czy ty faktycznie mierzysz czas wykonywania zapytania, czy bazujesz na sekundach pokazywanych przez SSMS ?

Proponuje uzyć opcji Menu -> Query > Include Client Statistics. i sprawdzić Time Statiistics, zamiast wróżyć z jednej wartości.

1

Przy takiej ilości danych w tabeli nie ma o czym rozmawiać, RDMBS sobie to wszystko scachuje w pamięci. To tak jakbyś próbował optymalizować zapytanie przy 10 wierszach. Już nawet szybciej jest zrobić table scan niż przechodzić po indeksie.

Wrzuć tam pare milionów wierszy i sprawdź (kilka/kilkanaście GB).

0

@Charles_Ray: Tak, inaczej tego nigdy nie robię, bo statystki mam u siebie włączone domyślnie w SSMS

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(19090 rows affected)
Table 'TABLENAME'. Scan count 1, logical reads 3832, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 203 ms,  elapsed time = 2784 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

To samo zapytanie wysłane przez ODBC (spoza SSMS) w widoczne jest w Profilerze z czasem trwania dokładnie 948ms. Rozumiem, że SSMS działa trochę inaczej, niż ODBC i te dwie sekundy potrzebne mu są na "wyświetlenie", ale skąd reszta czasu?

0

Zadeklaruj sobie tabele w zmiennej i zrób na niej insert into z tabeli produkcyjnej. Jeśli bedziesz miał ok. 200ms to znaczy że pozostały czas to przesyłanie i wyświetlanie danych z zapytania

0

Możesz podać DDL tej tabeli?

Co pokazują statystyki czasu o których wspomniałem w pierwszym poście?

0

@Panczo: Wolałbym tutaj DDLi nie podawać.
Statystyki prezentują się następująco:
1: SELECT *
2: Wszystkie kolumny wymienione z nazwy
3: Wszystkie kolumny z wyłączeniem kolumn typu TEXT
4: Jedna, nieindeksowana kolumna typu NUMERIC
screenshot-20211115120300.png

W przypadku czwartego zapytania nadal wykonywany jest Clustered Index Scan, więc i tak czytana jest cała tabela, a czas wykonania jest o wiele szybszy (przez ODBC trwa to 28 milisekund). Przy testowaniu pierwszych trzech zapytań przez ODBC osiągam bardzo podobne wyniki, które oscylują między 1230 a 1300 milisekund (te czasy liczę od wysłania zapytania do odebrania wszystkich danych, bez ich wyświetlania)

Wspominałem, że stworzyłem sobie tabelę z czterema polami znakowymi, wypchałem ją danymi do podobnej "masy" (około 35MB). Przez ODBC odczyt całej takiej tabeli trwa niecałe pół sekundy, a jednej kolumny (czyli ćwiartki tabeli) - 158ms. I tu wydaje mi się logiczne, że przy ponad 160 kolumnach odczytanie tej samej "masy" będzie trwało dłużej, niż przy zaledwie czterech kolumnach, ale Nadal wydaje mi się, że pół sekundy na tak niewielką ilość danych ładowanych... z RAMu do RAMu to wieczność. Wytłumaczcie, proszę, co mogę robić źle albo wyprowadźcie z błędu mówiąc, że "ten typ tak ma"...

1

Z tego co wkleiłeś to Serwer odpowiada od razu, Client processing time to generalnie parametr który liczy czas od odebrania pierwszego pakietu do ostatniego.
Jak widać pozbycie się się kolumn typu text daje ponad 45% zmiany w czasie wykonania, ile ich jest?

Z ciekawości ile wyniesie średni czas jak wykonasz tych selectów 0 x z rzędu?

0

@Panczo: Trzy kolumny typu text tam są. W tych statystykach widać 45% oszczędności czasu, ale przy odczytywaniu przez ODBC widać co najwyżej kilka procent (i tak samo oszczędzam na wycięciu innych kolumn).

Jak widać poniżej, statystyki pomiędzy poszczególnymi wywołaniami nie różnią się diametralnie.

screenshot-20211117100339.png

Czy macie jeszcze jakieś pomysły, jak można to przyspieszyć?

0

Nie wiem czy to pomoże, ale dla pewności:

ALTER INDEX ALL ON [dbo].[nazwatabeli] REBUILD;
sp_updatestats;
0

Tutaj DDL o wiele prostszej, ale ważącej podobnie tabeli (200K rekordów, ~30MB):

CREATE TABLE [dbo].[TEST](
	[col1] [char](36) NULL,
	[col2] [char](36) NULL,
	[col3] [char](36) NULL,
	[col4] [char](36) NULL
) 

INSERT INTO test
SELECT NEWID(),NEWID(),NEWID(),NEWID() 
FROM	(select top 400 * from master..spt_values) a
CROSS JOIN(select top 500 * from master..spt_values) b

I samo zapytanie - u mnie przez ODBC wykonanie i przesłanie wyniku trwa ~400ms

SELECT * FROM test
0

na sql 2019, wersja ODBC 17 (https://www.microsoft.com/en-us/download/details.aspx?id=56567)

screenshot-20211118115341.png

Zrobiłem testową tabelke ze 160 kolumnami i 20000 wierszami ok 23 MB:



/****** Object:  Table [dbo].[test4]    Script Date: 2021-11-18 10:37:04 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test4]') AND type in (N'U'))
DROP TABLE [dbo].[test4]
GO

/****** Object:  Table [dbo].[test4]    Script Date: 2021-11-18 10:37:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[test4](
	[pk] [int] IDENTITY(1,1) NOT NULL,
	[char1] [char](5) NULL,
	[char2] [char](5) NULL,
	[char3] [char](5) NULL,
	[char4] [char](5) NULL,
	[char5] [char](5) NULL,
	[char6] [char](5) NULL,
	[char7] [char](5) NULL,
	[char8] [char](5) NULL,
	[char9] [char](5) NULL,
	[char10] [char](5) NULL,
	[char11] [char](5) NULL,
	[char12] [char](5) NULL,
	[char13] [char](5) NULL,
	[char14] [char](5) NULL,
	[char15] [char](5) NULL,
	[char16] [char](5) NULL,
	[char17] [char](5) NULL,
	[char18] [char](5) NULL,
	[char19] [char](5) NULL,
	[char20] [char](5) NULL,
	[char21] [char](5) NULL,
	[char22] [char](5) NULL,
	[char23] [char](5) NULL,
	[char24] [char](5) NULL,
	[char25] [char](5) NULL,
	[char26] [char](5) NULL,
	[char27] [char](5) NULL,
	[char28] [char](5) NULL,
	[char29] [char](5) NULL,
	[char30] [char](5) NULL,
	[char31] [char](5) NULL,
	[char32] [char](5) NULL,
	[char33] [char](5) NULL,
	[char34] [char](5) NULL,
	[char35] [char](5) NULL,
	[char36] [char](5) NULL,
	[char37] [char](5) NULL,
	[char38] [char](5) NULL,
	[char39] [char](5) NULL,
	[char40] [char](5) NULL,
	[char41] [char](5) NULL,
	[char42] [char](5) NULL,
	[char43] [char](5) NULL,
	[char44] [char](5) NULL,
	[char45] [char](5) NULL,
	[char46] [char](5) NULL,
	[char47] [char](5) NULL,
	[char48] [char](5) NULL,
	[char49] [char](5) NULL,
	[char50] [char](5) NULL,
	[char51] [char](5) NULL,
	[char52] [char](5) NULL,
	[char53] [char](5) NULL,
	[char54] [char](5) NULL,
	[char55] [char](5) NULL,
	[char56] [char](5) NULL,
	[char57] [char](5) NULL,
	[char58] [char](5) NULL,
	[char59] [char](5) NULL,
	[char60] [char](5) NULL,
	[char61] [char](5) NULL,
	[char62] [char](5) NULL,
	[char63] [char](5) NULL,
	[char64] [char](5) NULL,
	[char65] [char](5) NULL,
	[char66] [char](5) NULL,
	[char67] [char](5) NULL,
	[char68] [char](5) NULL,
	[char69] [char](5) NULL,
	[char70] [char](5) NULL,
	[char71] [char](5) NULL,
	[char72] [char](5) NULL,
	[char73] [char](5) NULL,
	[char74] [char](5) NULL,
	[char75] [char](5) NULL,
	[char76] [char](5) NULL,
	[char77] [char](5) NULL,
	[char78] [char](5) NULL,
	[char79] [char](5) NULL,
	[char80] [char](5) NULL,
	[char81] [char](5) NULL,
	[char82] [char](5) NULL,
	[char83] [char](5) NULL,
	[char84] [char](5) NULL,
	[char85] [char](5) NULL,
	[char86] [char](5) NULL,
	[char87] [char](5) NULL,
	[char88] [char](5) NULL,
	[char89] [char](5) NULL,
	[char90] [char](5) NULL,
	[char91] [char](5) NULL,
	[char92] [char](5) NULL,
	[char93] [char](5) NULL,
	[char94] [char](5) NULL,
	[char95] [char](5) NULL,
	[char96] [char](5) NULL,
	[char97] [char](5) NULL,
	[char98] [char](5) NULL,
	[char99] [char](5) NULL,
	[char100] [char](5) NULL,
	[char101] [char](5) NULL,
	[char102] [char](5) NULL,
	[char103] [char](5) NULL,
	[char104] [char](5) NULL,
	[char105] [char](5) NULL,
	[char106] [char](5) NULL,
	[char107] [char](5) NULL,
	[char108] [char](5) NULL,
	[char109] [char](5) NULL,
	[char110] [char](5) NULL,
	[char111] [char](5) NULL,
	[char112] [char](5) NULL,
	[char113] [char](5) NULL,
	[char114] [char](5) NULL,
	[char115] [char](5) NULL,
	[char116] [char](5) NULL,
	[char117] [char](5) NULL,
	[char118] [char](5) NULL,
	[char119] [char](5) NULL,
	[char120] [char](5) NULL,
	[float1] [float] NULL,
	[float2] [float] NULL,
	[float3] [float] NULL,
	[float4] [float] NULL,
	[float5] [float] NULL,
	[float6] [float] NULL,
	[float7] [float] NULL,
	[float8] [float] NULL,
	[float9] [float] NULL,
	[float10] [float] NULL,
	[float11] [float] NULL,
	[float12] [float] NULL,
	[float13] [float] NULL,
	[float14] [float] NULL,
	[float15] [float] NULL,
	[float16] [float] NULL,
	[float17] [float] NULL,
	[float18] [float] NULL,
	[float19] [float] NULL,
	[float20] [float] NULL,
	[int1] [int] NULL,
	[int2] [int] NULL,
	[int3] [int] NULL,
	[int4] [int] NULL,
	[int5] [int] NULL,
	[int6] [int] NULL,
	[int7] [int] NULL,
	[int8] [int] NULL,
	[int9] [int] NULL,
	[int10] [int] NULL,
	[int11] [int] NULL,
	[int12] [int] NULL,
	[int13] [int] NULL,
	[int14] [int] NULL,
	[int15] [int] NULL,
	[int16] [int] NULL,
	[int17] [int] NULL,
	[int18] [int] NULL,
	[int19] [int] NULL,
	[int20] [int] NULL,
	[text1] [text] NULL,
	[text2] [text] NULL,
 CONSTRAINT [PK_test4] PRIMARY KEY CLUSTERED 
(
	[pk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO



insert into test4 (char1,char2,char3,char4,char5,char6,char7,char8,char9,char10,char11,char12,char13,char14,char15,char16,char17,char18,char19,char20,char21,char22,char23,char24,char25,char26,char27,char28,char29,char30,char31,char32,char33,char34,char35,char36,char37,char38,char39,char40,char41,char42,char43,char44,char45,char46,char47,char48,char49,char50,char51,char52,char53,char54,char55,char56,char57,char58,char59,char60,char61,char62,char63,char64,char65,char66,char67,char68,char69,char70,char71,char72,char73,char74,char75,char76,char77,char78,char79,char80,char81,char82,char83,char84,char85,char86,char87,char88,char89,char90,char91,char92,char93,char94,char95,char96,char97,char98,char99,char100,char101,char102,char103,char104,char105,char106,char107,char108,char109,char110,char111,char112,char113,char114,char115,char116,char117,char118,char119,char120,float1,float2,float3,float4,float5,float6,float7,float8,float9,float10,float11,float12,float13,float14,float15,float16,float17,float18,float19,float20,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16,int17,int18,int19,int20,text1,text2)
values (replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),replicate('A',5),100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,'',''
)
GO
insert into test4 (char1,char2,char3,char4,char5,char6,char7,char8,char9,char10,char11,char12,char13,char14,char15,char16,char17,char18,char19,char20,char21,char22,char23,char24,char25,char26,char27,char28,char29,char30,char31,char32,char33,char34,char35,char36,char37,char38,char39,char40,char41,char42,char43,char44,char45,char46,char47,char48,char49,char50,char51,char52,char53,char54,char55,char56,char57,char58,char59,char60,char61,char62,char63,char64,char65,char66,char67,char68,char69,char70,char71,char72,char73,char74,char75,char76,char77,char78,char79,char80,char81,char82,char83,char84,char85,char86,char87,char88,char89,char90,char91,char92,char93,char94,char95,char96,char97,char98,char99,char100,char101,char102,char103,char104,char105,char106,char107,char108,char109,char110,char111,char112,char113,char114,char115,char116,char117,char118,char119,char120,float1,float2,float3,float4,float5,float6,float7,float8,float9,float10,float11,float12,float13,float14,float15,float16,float17,float18,float19,float20,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16,int17,int18,int19,int20,text1,text2)
select top 2500 char1,char2,char3,char4,char5,char6,char7,char8,char9,char10,char11,char12,char13,char14,char15,char16,char17,char18,char19,char20,char21,char22,char23,char24,char25,char26,char27,char28,char29,char30,char31,char32,char33,char34,char35,char36,char37,char38,char39,char40,char41,char42,char43,char44,char45,char46,char47,char48,char49,char50,char51,char52,char53,char54,char55,char56,char57,char58,char59,char60,char61,char62,char63,char64,char65,char66,char67,char68,char69,char70,char71,char72,char73,char74,char75,char76,char77,char78,char79,char80,char81,char82,char83,char84,char85,char86,char87,char88,char89,char90,char91,char92,char93,char94,char95,char96,char97,char98,char99,char100,char101,char102,char103,char104,char105,char106,char107,char108,char109,char110,char111,char112,char113,char114,char115,char116,char117,char118,char119,char120,float1,float2,float3,float4,float5,float6,float7,float8,float9,float10,float11,float12,float13,float14,float15,float16,float17,float18,float19,float20,int1,int2,int3,int4,int5,int6,int7,int8,int9,int10,int11,int12,int13,int14,int15,int16,int17,int18,int19,int20,text1,text2
from test4 cross join (
select * from master..spt_values) v
go 8

Wyniki:

screenshot-20211118115922.png

Serwer w sieci na jakimś słabym serwerze nie lokalnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1