Jeg trodde jeg en gang leste et sted at det å skrive til tempdb er raskere enn en faktisk tabell som ikke er i tempdb. Er dette sant i noen kapasitet? Jeg trodde jeg husker at det sa noe spesielt om tempdb og lagring av data i minnet?
Svar
å skrive til tempdb er raskere enn en faktisk tabell som ikke er i tempdb
Det stemmer. Det er to IO-forbedringer i TempDb.
Skriver til en tabell i en brukerdatabase må ha loggpostene sine skyllet til disken når de blir begått, eller hvis et minimalt logget innlegg (som SELECT … INTO) må databasesidene skylles til disken Slik minimal logging fungerer i en brukerdatabase er at databasesidene blir skrevet direkte til disken. Når SELECT … INTO er ferdig, har de nye sidene blitt skrevet til de fysiske filene.
TempDb skriver trenger ikke å skylles til disk på commit siden TempDb aldri blir gjenopprettet etter en feil. Så de er rett og slett ikke. Endringene dine genererer loggposter, men loggbufferen skylles bare til disken når den er full, ikke for hver kommisjon.
Og siden SQL Server 2014 er ikke de minimalt loggede innsatsene i TempDb ikke alltid skrevet til disken. Hvis du laster inn en liten, kortvarig temp-tabell, det kan kanskje ikke skrives til disken i det hele tatt. Loggen vil ha noen få poster om sidetildelingene og metadataoppføringene for tabellen, men det er det.
EG kjør følgende batch i tempdb, en full gjenopprettingsdatabase og en enkel gjenopprettingsdatabase for å se forskjellene.
drop table if exists foo go declare @data bigint declare @log bigint select @log = sum(case when type_desc = "LOG" then num_of_bytes_written end) ,@data = sum(case when type_desc = "ROWS" then num_of_bytes_written end) from sys.database_files f cross apply sys.dm_io_virtual_file_stats(db_id(),f.file_id) fs select * into foo from sys.objects select -@log + sum(case when type_desc = "LOG" then num_of_bytes_written end) log_bytes ,-@data + sum(case when type_desc = "ROWS" then num_of_bytes_written end) data_bytes , (select recovery_model_desc from sys.databases where database_id = db_id()) recovery_model from sys.database_files f cross apply sys.dm_io_virtual_file_stats(db_id(),f.file_id) fs
og du vil se noe sånt som:
For enkel gjenoppretting:
log_bytes data_bytes recovery_model -------------------- -------------------- --------------- 24576 16384 SIMPLE
for full gjenoppretting:
log_bytes data_bytes recovery_model -------------------- -------------------- --------------- 36864 0 FULL
og for tempdb:
log_bytes data_bytes recovery_model -------------------- -------------------- --------------- 0 0 SIMPLE
Noen ganger for tempdb vil du se loggbufferen tømmes:
log_bytes data_bytes recovery_model -------------------- -------------------- --------------- 61440 0 SIMPLE
Kommentarer
- Det er et tilfelle der den første innsatsen er raskere, men den kommer tilbake for å bite deg senere. Denne demoen viser et spørsmål som bringer data inn i bufferbufferen som tar mye lengre tid da den lat skribenten er opptatt med å skrive til platen tempdb-sider som er skitne for en temp-tabell som ikke eksisterer lenger youtube .com / watch? v = X60ipwYv1Ms & feature = youtu.be
- Ja. Det er ' en potensiell fremtidig forbedring for å eliminere flushing Buffer Pool-sider som ikke er tildelt noe objekt. Men å laste en stor temp-tabell vil alltid kjøre IO, enten direkte eller indirekte ved å redusere minnet som er tilgjengelig for caching.
Svar
I tillegg til å skrive til tempdb ofte ikke alle treffende disk / nettverk IO, som utvidet i David Brownes svar , avhengig av IO konfigurasjon, kan det hende at selv når dataene er store nok til at de må spoles til disk, er det fortsatt raskere enn å velge i en «normal» tabell:
-
TempDB kan være på forskjellige stasjoner, så ha sin egen IO-båndbredde. Dette er spesielt viktig med spinnende stasjoner i stedet for SSD-er. Lesing fra og skriving til samme database (eller en annen database på samme stasjoner) vil innebære flere hodebevegelser som legg til mer IO-ventetid og potensielt strup effektiv IO-båndbredde. Kopiering av data mellom databaser på forskjellige stasjoner / matriser vil ikke ha samme ekstra latens.
-
TempDB kan til og med være på fa ster media enn hovedlagringen. Kanskje på lokale stasjoner der hovedlagring er i nettverket, eller NVMe SSD-er der hovedbutikken er på tradisjonelle stasjoner.
Begge disse forskjellene kan også sees i samme database hvis du bruker flere filgrupper for å spre deler av dataene mellom forskjellige stasjoner / matriser.
Det motsatte kan også være sant hvis du har flere databaser som er aktivt i bruk. Ettersom TempDB er en delt ressurs, kan det være at belastningen, og stasjonene / nettverket som er vert for den, er større enn datafilene for noen enkelt DB.