Flytte Gjennomsnittet Sql Server


SQL Server-diskresultatprestandardata Del 2 andre viktige diskytelsesmålinger I den forrige delen av SQL Server-ytelsesberegningsserien presenterte vi de viktigste og nyttige diskresultatverdiene. Nå, vis godt andre viktige disk ytelsesmål Nåværende disk kø lengde Angir antall diskforespørsler som for tiden venter, samt forespørsler som for tiden blir betjent. Med forbehold om store variasjoner med mindre arbeidsbelastningen har oppnådd en stabil tilstand, og du har samlet et tilstrekkelig antall prøver for å etablere et mønster. 1 Metriske viser hvor mange IO-operasjoner som venter på å bli skrevet til eller lest fra harddisken og hvor mange prosessene som er behandlet. Hvis harddisken ikke er tilgjengelig, er disse operasjonene i kø og vil bli behandlet når disken blir tilgjengelig. Hele diskdelsystemet har en enkelt kø. Den nåværende diskkøylengde-metriske i Windows Performance Monitor er tilgjengelig for både fysisk og logisk disk. I noen tidligere versjoner av Performance Monitor ble denne disken kalt Diskkø lengde. Gjeldende diskkø lengdeverdi skal være mindre enn 2 per diskspindel. Merk at dette ikke er per logisk, men per fysisk disk. Hvis det er større, indikerer dette en potensiell flaskehals, slik at ytterligere undersøkelse og overvåkning av andre diskverdier anbefales. Begynn med å overvåke Disk Time (forklart nedenfor). Hyppige toppene bør også undersøkes Disk array systemer som RAID eller SAN har et stort antall disker og kontrollere, noe som gjør køer på slike systemer kortere. Fordi metriske ikke indikerer kø per disk, men for hele oppsettet, anser enkelte DBA at overvåkning av nåværende diskkø lengde på diskarrangementer ikke er nødvendig. Et annet scenario der gjeldende diskkø lengde kan være misvisende, er når data lagres i diskbufferen. Det vil bli rapportert som kø for å skrive og dermed vil gjeldende diskkø lengde være høyere enn faktisk gjennomsnittlig diskkø lengde. Den gjennomsnittlige diskkø lengde metriske viser informasjonen som ligner gjeldende lengde på diskkøen. bare verdien er ikke aktuell, men gjennomsnittlig over en bestemt tidsperiode. Terskelen er den samme som for forrige beregning opp til 2 per disk. For disksystemer er den anbefalte verdien mindre enn 2 per enkelt diskstasjon i en matrise. For eksempel innebærer i en 6-disk-array verdien for nåværende diskkø lengde på 12 at køen er 2 per disk. Det er to flere beregninger som ligner gjennomsnittlig diskkø lengde 8211 gjennomsnittlig disk lesekø lengde og gjennomsnittlig disk skriv kø lengde. Som navnene indikerer, viser de gjennomsnittlig kølengde for operasjoner som venter på disk som skal leses eller skrives. Disktid Denne telleren indikerer et diskproblem, men må observeres i sammenheng med gjeldende diskdisklengde-teller for å være virkelig informativ. Husk også at disken kan være en flaskehals før disktiden når 100 2 Disktidsmetoden indikerer hvor opptatt disken er å betjene lese - og skriveforespørsler, men som nevnt ovenfor, er det ikke en klar indikasjon på et problem som dets verdier kan være normal mens det er et alvorlig problem med diskopptak. Verdien er verdien for gjennomsnittlig diskkø lengde representert i prosent (dvs. multiplisert med 100). Hvis gjennomsnittlig disk kø lengde er 1, Disk tid er 100 Hva kan være forvirrende er at Disk Time verdiene kan være over 100, noe som ikke er logisk. Dette skjer hvis verdien for gjennomsnittlig diskkø lengde er større enn 1. Hvis gjennomsnittlig disk kø lengde er 3, er disk tid 300, noe som ikke betyr at prosesser bruker 3 ganger mer disk tid enn tilgjengelig, eller at det er en flaskehals hvis du Har en harddisk array, er den totale disktiden for alle disker vist uten angivelse av hvor mange disker som er tilgjengelige og hvilken disk som har den høyeste disktiden. For eksempel kan Disktid lik 500 bety god ytelse (i tilfelle du har 6 disker), eller ekstremt dårlig (hvis du bare har 1 disk). Du kan ikke fortelle uten å vite maskinvaren. Da denne telleren kan være misvisende, bruker noen DBAer ikke den som det finnes andre enklere og veiledende beregninger som viser diskytelse. Hvis verdien er høyere enn 90 per disk, er det nødvendig med ytterligere undersøkelser. Kontroller først verdien for gjeldende diskkø lengde. Hvis den er høyere enn terskelen (2 per fysisk disk), må du kontrollere om høyverdiene forekommer ofte. Hvis maskinen ikke bare brukes til SQL Server, kan andre ressurskrevende programmer forårsake disk flaskehalser, slik at SQL Server-ytelsen vil lide. Hvis dette er tilfelle, bør du vurdere å flytte disse programmene til en annen maskin og bare bruke en dedikert maskin for SQL Server. Hvis dette ikke er tilfelle, eller ikke kan gjøres, bør du vurdere å flytte noen av filene til en annen disk - eller maskinarkivdatabase, database og Transaksjonslogg-sikkerhetskopier, bruk av en raskere disk eller legge til flere disker i en array Diskavlesningstid og Disk skrivetid Disketidstiden og Diskskrivtidsmetoden ligner Disktid. viser bare operasjonene som leses fra eller skrives til disk, henholdsvis. De er faktisk gjennomsnittlig disklestkø lengde og gjennomsnittlig disk skrive kø lengde verdier presentert i prosent. Verdiene som disse metriske viser kan være like misvisende som Disk tid på et tre-disk array system, hvis en disk leser 50 av tiden (Disk Les tid 50), den andre leser 85 av tiden, og den tredje er inaktiv, Disklestetiden er 135 og gjennomsnittlig disklestkø lengde 1.35. Ved et første blikk ser Disklesningstid 135 ut som et problem, men det er det ikke. Det betyr ikke at disker er opptatt 135 av tiden. For å få en reell verdi, bør du dele verdien med antall disker, og du får 1363 45, noe som indikerer normal ytelse. Idle Time Disken er inaktiv når den ikke behandler lese - og skriveforespørsler. Dette måler prosentandelen av disken var ledig under prøveintervallet. Hvis denne telleren faller under 20 prosent, er disksystemet mettet. Du kan vurdere å erstatte det gjeldende disksystemet med et raskere disksystem. 3 Hvis verdien er lavere enn 20, kan ikke disken til enhver tid betjene alle lese - og skriveforespørsler. Før du velger diskutskift, må du kontrollere om det er mulig å fjerne noen programmer på en annen maskin. Gratis plass I tillegg til Windows Performance Monitor er denne metriske tilgjengelig i Windows Utforsker i fanene Computer og Disk Properties. Mens Performance Monitor viser prosentandelen ledig ledig diskplass, viser Windows Utforsker beløpet i GB Dette måler prosentandelen ledig plass på den valgte logiske diskstasjonen. Vær oppmerksom på om dette faller under 15 prosent, da du risikerer å gå tom for ledig plass for operativsystemet til å lagre kritiske filer. En åpenbar løsning her er å legge til mer diskplass. 3 Hvis verdien viser plutselige topper uten åpenbare grunner, er det nødvendig med ytterligere undersøkelse. I motsetning til de fleste minne - og prosessor SQL Server-ytelsesstatistikker, kan diskverdier være ganske villedende. De kan ikke tydelig angi et ytelsesproblem, deres verdier kan være OK, da det faktisk er et alvorlig diskproblem, mens de merkelig høye verdiene kan vise normal ytelse, da de viser verdier for en rekke disker. Deretter kommer det til matriseverdier, maskinvarekonfigurasjonskunnskap er nødvendig for å lese dem riktig. Til tross for disse diskverdiene er det nødvendig for SQL Server-feilsøking. SQL Server IO-ytelse Alt du trenger å vurdere SQL Server IO-ytelse er avgjørende for overordnet ytelse. Tilgang til data på disken er mye tregere enn i minnet, så det er viktig å få mest mulig ut av lokal disk og SAN. Det er mye råd på nettet og i bøker om SQL Server IO-ytelse, men jeg har ikke funnet en enkelt kilde som viser alt å vurdere. Dette er mitt forsøk på å bringe all informasjon sammen på ett sted. Så her er en liste over alt jeg kan tenke på som kan påvirke IO-ytelsen. Jeg har bestilt det på de fysiske diskene og flyttet ledningen til serveren og til slutt koden og databaseskjemaet. Mislykket disk Når en stasjon mislykkes i en diskmatrise, må den byttes ut. Virkningen på ytelse før utskifting avhenger av lagringsarrangementet og RAID-konfigurasjonen som brukes. RAID 5 og RAID 6 bruker distribuert paritet, og denne pariteten brukes til å beregne lesingen når en disk mislykkes. Les ytelse mister fordelen av å lese fra flere disker. Dette er også sant, men i mindre grad, på RAID 1 (speilet) arrays. Leser mister fordelen av å lese fra flere striper for data på den mislykkede disken, og skriveren kan være litt tregere på grunn av økningen i gjennomsnittlig søketid. Skriv cache Når en transaksjon er forpliktet, må skrivingen til transaksjonsloggen fullføres før transaksjonen er merket som forpliktet. Dette er viktig for å sikre transaksjonell integritet. Det pleide å være at skrivebufferen ikke ble anbefalt, men mange av de nyeste lagringsarrayene har batteribackerte hurtigbuffere som er fullt sertifisert for bruk med SQL Server. Hvis du har muligheten til å variere distribusjonen av minne mellom lese - og skrivebuffer, kan du prøve å allokere så mye som mulig til skrivebufferen. Dette skyldes at SQL Server utfører sin egen lese-caching via bufferbassenget, slik at noen ekstra lesbuffer på diskkontrolleren ikke har noen fordel. Tynn levering Tynn levering er en teknologi som leveres av noen SAN'er, hvorved den faktiske disklagringen som brukes, er akkurat nok for dataene, mens den ser ut til serveren for å være full størrelse, med masse ledig plass. Hvor den totale disken allokert til alle servere overskrider mengden fysisk lagring, er dette kjent som over-provisioning. Noen SAN-leverandører prøver å hevde at ytelsen ikke påvirkes, men det er ikke alltid sant. Jeg så dette problemet nylig på et 3PAR-array. Sekventiell lesing var betydelig tregere på tynne forsynte LUNer. Bytte til tykke forsynte LUNer mer enn doblet sekvensiell leseutgang. Hvor er diskene Er de der du tror de er Det er helt mulig å være koblet til et lagringsarrangement, men for IO-forespørsler om å passere gjennom denne arrayen til en annen. Dette gjøres noen ganger som en billig måte å øke diskplass på. Bruk av eksisterende maskinvare som blir underutnyttet, er billigere enn å kjøpe flere disker. Problemet er at dette introduserer enda en komponent i banen og er skadelig for ytelse - og DBA kan ikke engang være oppmerksom på det. Pass på at du vet hvordan SAN er konfigurert. Smart Tiering Dette kalles forskjellige ting av forskjellige leverandører. Lagringsarrangementet vil bestå av to eller flere typer disk, med varierende ytelse og kostnad. Det er de langsommere 10K-diskene - disse er de billigste. Da har du 15K-diskene. Disse er raskere, men dyrere. Og så kan det være noen super-raske SSD-er. Disse er enda dyrere, selv om prisen kommer ned. Smart tiering migrerer data mellom tier, slik at mer brukte data er i raskere lagring, mens mindre vanlige data faller ned til den langsommere lagringen. Dette er i utgangspunktet OK, men du er DBA. Du bør allerede vite hvilke data som skal nås raskt, og som kan være tregere. Vil du virkelig ha en algoritme som gjør denne beslutningen for deg Og regelmessige vedlikeholdsoppgaver kan forveksle hele greia uansett. Vurder en belastning med indeksrekonstruksjoner som går over natten. La oss antar at den siste databasen som skal behandles, er en arkivdatabase - vil du at dette skal hogge SSD når brukerne logger inn første om morgenen, mens oppdragskritiske databasen slår seg ned i bunnlinjen. Dette er en oversimplisering, selvfølgelig. Tieringsalgoritmer er mer sofistikerte enn det, men poenget mitt står. Du bør bestemme prioritetene for SQL Server-dataene dine. Ikke la SAN-leverandørene (eller lagringsadministratorene) overtale deg ellers. Lagringsnivåreplikasjon Lagringsnivåreplikasjon er en gjenopprettingsfunksjon som kopierer blokknivådata fra den primære SAN til en annen - ofte plassert i et eget datasenter. SAN-leverandørene krever ingen innvirkning på ytelsen, og dette er sant hvis det er riktig konfigurert. Men jeg har sett dårlig konfigurert replikasjon har en alvorlig innvirkning på ytelsen. En klient hadde et par år med dårlig IO-ytelse. Da jeg kom med dem, spurte jeg om lagringsreplikasjonen var ansvarlig. Jeg ble fortalt at jeg ikke var så dum - leverandøren har sjekket og det er ikke problemet - det må være SQL Server seg noen få måneder senere ble jeg kontaktet igjen - de hadde slått av replikasjonen mens de var i ferd med å flytte til en ny datasenter og gjett hva skrive latency forbedret med en størrelsesorden. La meg gjenta at dette skyldtes dårlig konfigurasjon, og de fleste lagringsreplikasjoner påvirker ikke ytelsen merkbart. Men det er en annen ting å vurdere om du sliter med SQL Server IO-ytelse. Vertsbussadaptere Kontroller at SAN og HBA-firmware er kompatible. Noen ganger når en SAN oppgraderes, blir HBAene på serverne oversett. Dette kan føre til uregelmessige feil, eller til og med gjøre lagringen utilgjengelig. Ta en titt på HBA kødybde. En vanlig standard er 32, noe som kanskje ikke er optimal. Noen studier har vist at økning av dette til 64 eller høyere kan forbedre ytelsen. Det kan også gjøre ting verre, avhengig av arbeidsbelastning, SAN-merke og modell, diskoppsett, etc. Så prøv grundig om du kan. Noen lagringsadministratorer motvirker å endre HBA-kødybde som de tror alle vil ha det samme på sine servere og lagringsarrangementet vil bli oversvømt. Og de har rett, også Overtale dem at det bare er for deg. Lov om ikke å fortelle noen andre. Samme det. Bare få ekstra kødybde hvis du tror det vil være til nytte for ytelsen. For mange servere Når et selskap forker ut en liten formue på et lagringsnettverk, vil de få valuta for pengene. Så naturlig, hver ny server som følger med, blir tilkoblet, slik at den kan gjøre bruk av all den nydelige diskplassen. Dette er greit til et par servere begynner å utstede mange IO-forespørsler og andre brukere klager over en ytelsesdemping. Dette er noe jeg ser gjentatte ganger hos så mange kunder, og det er ingen enkel løsning. Selskapet ønsker ikke eller kan ikke ha råd til å kjøpe en annen SAN. Hvis du mener dette er et problem for deg, sett en tidsplan sammen av alle jobber - på tvers av alle servere - og prøv å omplanlegge noe slik at arbeidsbelastningen fordeles jevnere. Partisjon justering og formatering Jeg vil kort nevne partisjon justering, selv om Windows 2008 bruker en standard offset på 1 MB så dette er mindre et problem enn det pleide å være. Jeg er heller ikke overbevist om at mange moderne SAN har stor nytte av øvelsen. Jeg utførte en test på en EVA for noen år siden og fant bare en 2 forbedring. Likevel er noen få prosent fortsatt verdt å streve etter. Dessverre må du rive ned volumene dine og gjenskape partisjonene dine hvis dette skal løses på et eksisterende system. Dette er trolig ikke verdt bryet, med mindre du strever for hver siste tomme av ytelse. Formatering er noe annet som skal utføres riktig. SQL Server lagrer data i 8KB sider, men disse hentes i blokker med 8, kalt extents. Hvis diskene er formatert med 64KB allokeringsenheter, kan dette ha en betydelig ytelse. Multipathing Hvis du ikke bruker lokal disk, bør du ha litt redundans innebygd i lagringsundersystemet. Hvis du har en SAN, har du et komplisert nettverk av HBAer, tekstiler, brytere og kontroller mellom SQL Server og diskene. Det bør være minst to HBAer, brytere, etc., og disse skal alle sammenkobles på en slik måte at det er flere baner til diskene. Denne redundansen er først og fremst for høy tilgjengelighet, men hvis multipathing er konfigurert som aktiv, kan du også se ytelsesfordeler også. Network Attached Storage Siden SQL Server 2008 R2 har det vært mulig å opprette, gjenopprette eller legge til en database på en fildeling. Dette har en rekke mulige bruksområder, og spesielt for de mest miljøvennlige miljøene kan det gjøre kapasitetshåndtering enklere, og det blir raskere å flytte databaser mellom servere. Spørsmålet om å bli spurt, er imidlertid, hvis du virkelig vil ha dette i productionquot Ytelsen vil ikke være like god som lokale eller SAN-stasjoner. Det er flere komponenter i kjeden, så påliteligheten er kanskje ikke så god. Og ved å bruke nettverket, bruker dataene samme infrastruktur som alle andre TCPIP-trafikkene, som igjen kan påvirke ytelsen. Men det er gode nyheter Mens tilgjengeligheten fortsatt er bekymret, har forbedringer i SMB på Windows Server 2012 (og via en oppdatering til WIndows Server 2008 R2) gjort det betydelig raskere. Jeg så et tilbud fra en Microsoft-ansatt et sted som hevdet 97 av ytelsen til lokal lagring. Jeg kan ikke finne sitatet nå, og jeg husker ikke om han måler latens eller gjennomstrømning. Diskfragmentering Hvor ofte bruker du Diskdefragmenteringsverktøyet på PCen din for å analysere og defragmentere C-stasjonen Hvor ofte sjekker du fragmentering på diskene på SQL-serverne dine For de fleste som ikke er så nær, så er jeg slem. Likevel er volumfragmentering like skadelig for SQL Server-ytelsen som den er til PCen din. Du kan redusere sannsynligheten for diskfragmentering på en rekke måter: Forstørrelsesdata og loggfiler, i stedet for å stole på automatisk vekst Angi vekstøkninger til fornuftige verdier i stedet for standard 10 Unngå krympende data og loggfiler Aldri, Bruk alltid autoshrink-databasealternativet. Kontroller at disker er dedikert til SQL Server, og ikke delt med andre programmer. Du kan sjekke fragmentering ved hjelp av det samme verktøyet som på PCen. Diskdefragmentering er tilgjengelig på alle serverversjoner av Windows. En annen måte å sjekke på er via Win32Volume-klassen i WMI. Denne biten av PowerShell rapporterer filprosentfragmenteringen for alle volumer på en gitt server. Hvis du har betydelig fragmentering, er det et par måter å fikse det på. Mitt foretrukne alternativ er som følger, men krever litt nedetid. Stopp SQL-tjenestene Sikkerhetskopier filene på disken (spesielt MDF, NFD og LFD-filer - bedre trygg enn beklager) Kjør Windows Disk Defragmenter-verktøyet Start SQL-tjenestene Kontroller feilloggen for å sikre at det ikke oppstår feil under oppstart Kjør CHECKDB mot alle databaser ( unntatt tempdb). Jeg har aldri sett defragverktøyet fordi det er korrupsjon, men du kan ikke være for forsiktig. Et annet alternativ som ikke krever nedetid, er å bruke et tredjepartsverktøy som Diskeeper. Dette kan være svært effektivt ved å fikse og forhindre diskfragmentering, men det koster penger og bruker en filterdriver - se mine kommentarer nedenfor. Filterdrivere En filterdriver er et program som sitter mellom en IO-forespørsel og skrive til disken. Det tillater skrivingen å bli undersøkt og avvist, endret eller revidert. Den vanligste typen filterdriver er installert av antivirusprogramvare. Du vil ikke at anti-virus programvare sjekker hver eneste skrive til databasefilene dine. Du vil heller ikke at det sjekker sikkerhetskopiene dine heller, eller skriver til feilloggen eller standardsporingen. Hvis du har AV-programvare installert, kan du angi eksklusjoner. Ekskluder alle mapper som brukes av SQL Server, pluss stasjonene som brukes av data og loggfiler, pluss mappene som brukes til sikkerhetskopier. Enda bedre er å slå av online AV-kontroll og planlegge en skanning på en stille tid. OLTP og BI på samme server Det er sjelden å finne et system som er rent OLTP. De fleste vil også ha en slags rapporteringselement. Dessverre eksisterer de to typer arbeidsbelastning ikke alltid sammen. Jeg har lest mange artikler av Joe Chang, og i en artikkel forklarer han hvorfor dette er tilfelle. I hovedsak henter OLTP-spørringsplaner rader i små batcher (mindre enn en grense på 25 rader), og disse IO-forespørsler håndteres synkront av databasemotoren, noe som betyr at de venter på at dataene skal hentes før de fortsetter. Store BI arbeidsbelastninger og rapporteringsspørsmål, ofte med parallelle planer, utstede asynkrone IO-forespørsler og dra full nytte av HBA-muligheten til å stille forespørsler. Som et resultat av dette, må OLTP-forespørgene kjøre seg opp bak BI-forespørslene, og forårsake at OLTP-ytelsen nedbrytes vesentlig. Automatisk vekst og umiddelbar filinitialisering Det er godt å ha automatisk vekst aktivert, som en forholdsregel, selv om du også bør forhåndsforme data og loggfiler slik at det sjelden er nødvendig. Men hva skjer hvis en datafil vokser og du ikke har øyeblikkelig filinitialisering aktivert Spesielt hvis auto-voksen er satt for stor. Alle IO mot filen må vente på at filveksten skal fullføres, og dette kan bli rapportert i de beryktede kvotene som er tatt lenger enn 15 sekunder for å completequot-meldingen i feilloggen. Instant initialisering vil ikke hjelpe med loggvekst, så sørg for at loggen for automatisk vekst ikke er for høy. For mer informasjon om umiddelbar filinitialisering og hvordan du aktiverer det, se denne linken Database File Initialization. Og når det gjelder auto-vokse, se delen om proporsjonal fylling, under. Transaksjonslogg Ytelse Hvor lenge skriver transaksjonsloggen din Mindre enn 1 ms Mer enn 5 ms Se på virtuell filstatistikk, ytelsesteller eller WRITELOG ventetiden for å se om loggskrivetid er et problem for deg. Skriver til transaksjonsloggen er sekvensiell, og så skal skrivehodet på disken ideelt sett være der det var fra den siste loggskrivingen. Dette betyr ingen søketid og blazingly rask skrive ganger. Og siden en transaksjon ikke kan begå til loggen har herdet til disk, stole du på disse fortidene skriver for et ypperlig system. Råd i årevis har vært for transaksjonsloggen for hver database å være på egen disk. Og dette rådet er fortsatt bra for lokal disk, og for noen lagringsarrayer. Men nå som mange SAN har sin egen batteribackede skrivebuffer, er dette rådet ikke så kritisk som det pleide å være. Forutsatt at hurtigbufferen er stor nok til å takle toppbrudd av skriveaktivitet (og se mine tidligere kommentarer om å tildele mer cache til å skrive enn å lese), vil du få svært lav ventetid. Så hva hvis du ikke har luksusen til en mega-dollar SAN og masse skrivebuffer? Da er det rådene som har eksistert siden 1990-tallet fortsatt gyldig: En transaksjonsloggfil per database på egen disk RAID 1, RAID 10 eller RAID 01 Så forutsatt at du er fornøyd med loggfiloppsettet, kan det være noe som senker loggen din. Skriver virtuelle loggfiler Selv om en transaksjonslogg skrives i rekkefølge, kan selve filen bli fragmentert internt. Når den er opprettet, består den av flere biter som heter virtuelle loggfiler. Hver gang den vokser, enten manuelt eller automatisk, blir flere virtuelle loggfiler lagt til. En transaksjonslogg som vokser flere ganger, kan ende opp med tusenvis av virtuelle loggfiler. Å ha for mange VLF kan redusere logging og kan også redusere loggbackups. Du må også være forsiktig med å unngå store mengder VLF. En inaktiv virtuell loggfil slettes ikke før slutten er nådd, og den neste begynner å bli brukt. For full gjenopprettingsmodell skjer dette ikke før neste logg backup. Så en logg backup vil plutselig ha mye mer arbeid til, og kan forårsake ytelsesproblemer mens den finner sted. Svaret på en stor transaksjonslogg er å angi en innledende størrelse på maksimalt 8000 MB, og deretter vokse manuelt i biter på 8000 MB opp til målestørrelsen. Dette resulterer i maksimal VLF-størrelse på 512 MB, uten å skape et for stort antall VLF. Merk: Dette rådet er kun for manuell vekst. Ikke vokse automatisk med 8000MB Alle transaksjoner i databasen stopper mens ekstra plass er initialisert. Autogrow bør være mye mindre - men prøv å manuelt formatere filen slik at det ikke er sannsynlig at auto vokser. Log Manager Limits Databasemotoren setter grenser for hvor mye logg som kan være i flukt på en gang. Dette er en grense per database, og avhenger av hvilken versjon av SQL Server som brukes. SQL Server begrenser antall utestående IO og MB per sekund. Grensene varierer med versjon og om 32 bit eller 64 bit. Se Diagnostiser transaksjonslogg Ytelsesproblemer og grenser for loggbehandling for flere detaljer. Dette er grunnen til at skriveforsinkelsen skal være så lav som mulig. Hvis det tar 20 ms å skrive til transaksjonsloggen, og du er begrenset til 32 IO på en gang, betyr det maksimalt 1600 transaksjoner per sekund, langt under det som mange OLTP-databaser krever. Dette understreker også betydningen av å holde transaksjonsstørrelser små, da en veldig stor transaksjon kunne tenke å holde opp andre transaksjoner mens den forplikter seg. Hvis du tror at disse grensene påvirker logg skrive ytelse i databasene dine, er det flere måter å takle problemet på: Arbeide med å øke logg skrive ytelse Hvis du har minimal loggede operasjoner, kan du bytte database til å bruke BULK LOGGED gjenopprettingsmodellen. Forsiktig, men en loggskopi som inneholder en minimal loggoperasjon må gjenopprettes fullt ut. Punkt i tid gjenoppretting er ikke mulig. Del en høyvolumdatabase i 2 eller flere databaser, da logggrensene gjelder per database Ikke-sekvensiell loggaktivitet Det er handlinger utført av databasemotoren som flytter skrivehodet vekk fra slutten av loggfilen. Hvis transaksjoner fortsatt blir forpliktet mens dette skjer, har du en søknad om overhead og loggytelsen blir verre. Operasjoner som leser fra loggfilene inkluderer tilbakelevering av store transaksjoner, loggbackups og replikering (loggleseragenten). Det er lite du kan gjøre om de fleste av disse, men å unngå store tilbakeslag er noe som bør løses på design og utvikling av et program. Proportional Fill Svært aktive tabeller kan plasseres i en filgruppe som har flere datafiler. Dette kan forbedre leseytelsen hvis de er på forskjellige fysiske disker, og det kan forbedre skriveytelsen ved å begrense strid på tildelingssidene (spesielt sant for tempdb). Du mister imidlertid noen av fordelene, dersom du ikke utnytter proporsjonal fyllingsalgoritmen. Proportional fill er prosessen der databasen prøver å tildele nye sider i forhold til mengden ledig plass i hver datafil i filgruppen. For å få maksimal fordel, vær sikker på at hver fil er i samme størrelse og alltid vokser med samme trinn. Dette gjelder både manuell og automatisk vekst. En ting å være klar over er hvordan den automatiske veksten fungerer. SQL Server gjør sitt beste for å fylle filene med samme hastighet, men en vil alltid fylle opp like før de andre, og denne filen vil da automatisk vokse seg. Dette får da flere nye tildelinger enn de andre og blir en midlertidig hotspot til de andre også vokser og henter seg. Dette er usannsynlig å forårsake problemer for de fleste databaser, men for tempdb kan det være mer merkbart. Sporflagg 1117 fører til at alle datafiler i en filgruppe vokser sammen, så det er verdt å vurdere om dette er et problem for deg. Personlig vil jeg heller manuelt formatere filene slik at automatisk vekst ikke er nødvendig. tempdb-konfigurasjon Lar oss starte med noen få ting som alle er enige om: Tempdb-filer skal plasseres på den raskeste lagringen som er tilgjengelig. Lokal SSD er ideell, og fra SQL Server 2012 kan dette til og med muliggjøres i en klynge. Forstørr data og loggfiler, da automatisk vekst kan forårsake ytelsesproblemer mens det oppstår Nye midlertidige objekter blir opprettet hele tiden, slik at saken i GAM , SGAM og PFS-sider kan være et problem i noen miljøer Og nå noen meninger: Det er massevis av råd over hele nettet for å opprette en tempdb-datafil per kjerne for å redusere allokering. Paul Randall er uenig (En SQL Server DBA myt om dagen: (1230) tempdb skal alltid ha en datafil per prosessorkjerne). Han sier at for mange filer faktisk kan gjøre ting verre. Hans løsning er å skape færre filer og å øke kun hvis det er nødvendig. Det er flere råd, ofte gjentatte, for å skille tempdb-filer fra andre databaser og sette dem på egne fysiske spindler. Joe Chang er uenig og har et veldig godt argument for å bruke det felles bassenget på disker. (Plassering av data, logg og temp-fil). Jeg lar deg bestemme hva du skal gjøre AutoShrink AutoShrink-databasen har eksistert helt siden jeg begynte å bruke SQL Server, og forårsaker mange ytelsesproblemer for folk som har aktivert det uten å fullt ut innse hva det gjør. Ofte vil en tredjeparts applikasjon installere en database med dette alternativet aktivert, og DBA vil kanskje ikke legge merke til det til senere. Så hvorfor er det dårlig To grunner: Den brukes alltid i forbindelse med auto vokse, og den kontinuerlige syklusen med vekstkrymp vekker forårsaker en enorm fysisk diskfragmentering. Ive har allerede dekket det emnet tidligere i denne artikkelen Mens det utføres krympe, er det mye ekstra IO, noe som senker systemet for alt annet. Deaktiver det. Tildel nok plass til dataene og loggfilene, og størr dem deretter. Og ikke glem å fikse all den fragmenteringen mens du er i den. Utilstrekkelig minne Dette er en artikkel om SQL Server IO-ytelse, ikke minne. Så jeg vil ikke dekke det i detalj her - det er et emne for en annen artikkel. Jeg vil bare minne deg på at SQL Server elsker minne - jo mer jo bedre. Hvis hele databasen din passer inn i minnet, har du et mye raskere system, omgå all den langsomme IO. Mangel på minne kan føre til at skitne sider blir spylt til disk oftere for å gi plass til flere sider som leses. Mangel på minne kan også føre til økt tempdb IO, ettersom flere arbeidsbord for sortering og hashoperasjoner må spoles til disk. Uansett er punktet i denne delen virkelig å gjøre en setning: Fyll serverne med så mye minne som du har råd til, og så mye som utgaven av SQL Server og Windows kan adressere. SQL Server 2014 har en ny funksjon som tillater at noen tabeller beholdes i minnet, og åpnes via innsamlede lagrede prosedyrer. Noen redesign av noen av din eksisterende kode kan være nødvendig for å dra nytte av dette, men det ser ut som et godt ytelsesforhøye for de OLTP-systemene som begynner å bruke det. Høy bruk av tempdb tempdb kan være en stor forbruker av IO og kan påvirke total ytelse hvis den brukes overdrevet. Det er verdt å se på de ulike årsakene til bruken, og undersøke systemet ditt for å sikre at du har minimert disse så langt som mulig. Brukeropprettede midlertidige objekter De vanligste av disse er midlertidige tabeller, tabellvariabler og markører. Hvis det er en høy grad av opprettelse, kan dette føre til tildeling av sidebestemmelse, selv om det øker antall tempdb-datafiler, kan det delvis lindre dette. Prosesser som lager svært store midlertidige tabeller eller tabellvariabler er et stort nei, da disse kan føre til mye IO. Interne objekter Databasemotoren lager arbeidsbord i tempdb for håndtering av hash-tilkoblinger, sortering og spoling av mellomliggende resultatsett. Når sorteringsoperasjoner eller hash-tilkoblinger trenger mer minne enn det som er gitt, spilles de til disk (ved hjelp av tempdb), og du vil se Hash-advarsler og Sorter advarsler i standardsporet. I originally wrote a couple of paragraphs about how and why this happens and what you can do to prevent it, but then I found this post that explains it much better - Understanding Hash, Sort and Exchange Spill Events . Version Store The third use of tempdb is for the version store. This is used for row versioning. Row versions are created when snapshot isolation or read committed snapshot option is used. They are also created during online index rebuilds for updates and deletes made during the rebuild and for handling data modifications to multiple active result sets (MARS). A poorly written application (or rogue user) performing a large update that affects many thousands of rows when a row versioning based isolation level is in use may cause rapid growth in tempdb and adversely impact IO performance for other users. Table and Index Scans A table scan is a scan of a heap. An index scan is a scan of a clustered or non-clustered index. Both may be the best option if a covering index does not exist and a lot of rows are likely to be retrieved. A clustered index scan performs better than a table scan - yet another reason for avoiding heaps But what causes a scan to be used in the first place, and how can you make a seek more likely Out of date statistics Before checking indexes and code, make sure that statistics are up to date. Enable quotauto create statisticsquot. If quotauto update statisticsquot is not enabled make sure you run a manual statistics update regularly. This is a good idea even if quotauto update statisticsquot is enabled, as the threshold of approximately 20 of changed rows before the auto update kicks in is often not enough, especially where new rows are added with an ascending key. Index Choice Sometimes an existing index is not used. Have a look at improving its selectivity, possibly by adding additional columns, or modifying the column order. Consider whether a covering index could be created. A seek is more likely to be performed if no bookmark lookups will be needed. See these posts on the quottipping pointquot by Kimberly Tripp. The Tipping Point . Inefficient TSQL The way a query is written can also result in a scan, even if a useful index exists. Some of the reasons for this are: Non-sargable expressions in the WHERE clause. quotsargquot means Simple ARGument. So move calculations away from the columns and onto the constants instead. So for example, this will not use the index on OrderDate: WHERE DATEADD ( DAY. 1. OrderDate ) gt GETDATE () Whereas this will use an index if it exists (and it is selective enough): WHERE OrderDate gt DATEADD ( DAY. - 1. GETDATE ()) Implicit conversions in a query may also result in a scan. See this post by Jonathan Kehayias Implicit Conversions that cause Index Scans . Bad Parameter Sniffing Parameter sniffing is a good thing. It allows plan re-use and improves performance. But sometimes it results in a less efficient execution plan for some parameters. Index Maintenance Every index has to be maintained. Im not talking about maintenance plans, but about the fact that when rows are inserted, deleted and updated, the non-clustered indexes also have to be changed. This means additional IO for each index on a table. So it is a mistake to have more indexes than you need. Check that all indexes are being used. Check for duplicates and redundant indexes (where the columns in one are a subset of the columns in another). Check for indexes where the first column is identical but the rest are not - sometimes these can be merged. And of course, test, test, test. Index Fragmentation Index fragmentation affects IO performance in several ways. Range scans are less efficient, and less able to make use of read-ahead reads Empty space created in the pages reduces the density of the data, meaning more read IO is necessary The fragmentation itself is caused by page splits, which means more write IO There are a number things that can be done to reduce the impact of fragmentation, or to reduce the amount of fragmentation. Rebuild or reorganize indexes regularly Specify a lower fill factor so that page splits occur less often (though not too low, see below) Change the clustered index to use an ascending key so that new rows are appended to the end, rather than inserted in a random place in the middle Forwarded Records When a row in a heap is updated and requires more space, it is copied to a new page. But non-clustered indexes are not updated to point to the new page. Instead, a pointer is added to the original page to show where the row has moved to. This is called a forwarding pointer, and there could potentially be a long chain of these pointers to traverse to find the eventual data. Naturally, this means more IO. A heap cannot be defragmented by rebuilding the index (there isnt one). The only way to do this is to create a clustered index on the heap, and then drop it afterwards. Be aware that this will cause all non-clustered indexes to be rebuilt twice - once for the new clustered index, and again when it is dropped. If there are a lot of these it is a good idea to drop the non-clustered indexes first, and recreate them afterwards. Better still is to avoid heaps where possible. I accept there may be cases where they are the more efficient choice (inserting into archive tables, for example), but always consider whether a clustered index would be a better option - it usually is. Wasted Space In an ideal world every data page on disk (and in memory) would be 100 full. This would mean the minimum of IO is needed to read and write the data. In practise, there is wasted space in nearly all pages - sometimes a very high percent - and there are a lot of reasons why this occurs. Low fill factor Ive mentioned fill factor already. If it is too high, and page splits are occurring when rows are inserted or updated, it is sensible to rebuild the index with a lower fill factor. However, if the fill factor is too low you may have a lot of wasted space in the database pages, resulting in more IO and memory use. This is one of those quotsuck it and seequot scenarios. Sometimes a compromise is needed. Page splits This is also discussed above. But as well as fragmentation, page splits can also result in wasted space if the empty space is not reused. The solution is to defragment by rebuilding or reorganizing indexes regularly. Wasteful Choice of Data Types Use the smallest data types you can. And try to avoid the fixed length datatypes, like CHAR(255), unless you regularly update to the longest length and want to avoid page splits. The reasoning is simple. If you only use 20 characters out of 200, that is 90 wasted space, and more IO as result. The higher density of data per page the better. Lazy thinking might make developers create AddressLine1, AddressLine2, etc as CHAR(255), because they dont actually know what the longest should be. In this case, either do some research, find out that the longest is 50 characters (for example) and reduce them to CHAR(50), or use a variable length data type. Schema Design Ive already mentioned choice of data types above, but there are other schema design decisions that can affect the amount of IO generated by an application database. The most common one is designing tables that are too wide. I sometimes see a table with 20, 30, 50, even 100 columns. This means fewer rows fit on a page, and for some extreme cases there is room for just one row per page - and often a lot of wasted space as well (if the row is just slightly wider than half a page, thats 50 wasted). If you really do need 50 columns for your Customer table, ask yourself how many of these are regularly accessed. An alternative is to split into 2 tables. Customer, with just a few of the commonly used columns, and CustomerDetail with the rest. Of course, the choice of which columns to move is important. You dont want to start joining the tables for every query as that defeats the object of the exercise. Page or Row Compression Compression is another way of compacting the data onto a page to reduce disk space and IO. Use of row or page compression can dramatically improve IO performance, but CPU usage does increase. As long as you are not already seeing CPU bottlenecks, compression may be an option to consider. Be aware that compression is an Enterprise edition feature only. Backup Compression Since SQL Server 2008 R2, backup compression has been available on Standard edition as well as Enterprise. This is major benefit and I recommend that it be enabled on all instances. As well as creating smaller backups, it is also quicker and means less write IO. The small increase in CPU usage is well worth it. Enable it by default so that if someone sets off an ad hoc backup it will have minimal IO impact. Synchronous MirroringAlwaysOn High safety mode in database mirroring, or synchronous commit mode in AlwaysOn, both emphasise availability over performance. A transaction on the mirroring principal server or primary replica does not commit until it receives a message back from the mirror or secondary replica that the transaction has been hardened to the transaction log. This increases transactional latency, particularly when the servers are in different physical locations. Resource Governor in 2014 Up until and including SQL Server 2012 resource governor has only been able to throttle CPU and memory usage. Finally the ability to include IO in a resource pool has been added to SQL Server 2014. This has obvious use as a way of limiting the impact of reports on the system from a particular user, department or application. Gathering The Evidence There are a lot of ways you can measure SQL Server IO performance and identify which areas need looking at. Most of what follows is available in SQL CoPilot in graphical and tabular form, both as averages since last service start and as snapshots of current activity. Wait Types Use sys. dmoswaitstats to check number of waits and wait times for IOCOMPLETION, LOGBUFFER, WRITELOG and PAGEIOLATCH. Use this script to focus on the IO wait types: SELECT waittype. waitingtaskscount. waittimems - signalwaittimems AS totalwaittimems , 1. ( waittimems - signalwaittimems ) CASE WHEN waitingtaskscount 0 THEN 1 ELSE waitingtaskscount END AS avgwaitms FROM sys. dmoswaitstats WHERE waittype IN ( IOCOMPLETION. LOGBUFFER. WRITELOG. PAGEIOLATCHSH. PAGEIOLATCHUP. PAGEIOLATCHEX. PAGEIOLATCHDT. PAGEIOLATCHKP ) This shows averages since the last service restart, or since the wait stats were last cleared. To clear the wait stats, use DBCC SQLPERF (sys. dmoswaitstats, CLEAR) You can also check sys. dmoswaitingtasks to see what is currently being waited for. Virtual File Stats Query sys. dmiovirtualfilestats to find out which data and log files get the most read and write IO, and the latency for each file calculated using the stall in ms. SELECT d. name AS databasename. mf. name AS logicalfilename. numofbytesread. numofbyteswritten. numofreads. numofwrites. 1. iostallreadms ( numofreads 1 ) avgreadstallms. 1. iostallwritems ( numofwrites 1 ) avgwritestallms FROM sys. dmiovirtualfilestats (NULL, NULL) vfs JOIN sys. masterfiles mf ON vfs. databaseid mf. databaseid AND vfs. FILEID mf. FILEID JOIN sys. databases d ON mf. databaseid d. databaseid Performance Counters There are two ways of looking at performance counters. Select from sys. dmosperformancecounters, which shows all the SQL Server counters, or use Windows Performance Monitor (perfmon) to see the other OS counters as well. Some counters to look at are: SQL Server:Buffer Manager Lazy writessec The number of times per second that dirty pages are flushed to disk by the Lazy Writer process. An indication of low memory, but listed here as it causes more IO. Checkpoint pagessec The number of dirty pages flushed to disk per second by the checkpoint process. Page readssec Number of physical pages read from disk per second Page writessec Number of physical pages written to disk per second Readahead pagessec Pages read from disk in advance of them being needed. Expect to see high values in BI workloads, but not for OLTP SQL Server:Access Methods Forwarded recordssec Should be as low as possible. See above for explanation of forwarded records. Full scanssec The number of unrestricted full scans. Use of UDFs and table variables can contribute to this, but concentrating on seeks will help to keep the value down Page splitssec The number of page splits per second - combining splits due to pages being added to the end of a clustered index as well as quotgenuinequot splits when a row is moved to a new page. Use the technique from the link in the section on index fragmentation, above, to get a more accurate breakdown Skipped ghosted recordssec For information about ghosted records see An In-depth Look at Ghost Records in SQL Server Workfiles createdsec A measure of tempdb activity Worktables createdsec A measure of tempdb activity SQL Server:Databases Log bytes flushedsec The rate at which log records are written to disk Log flush wait time The duration of the last log flush for each database Log flush waitssec The number of commits per second waiting for a log flush Logical Disk Avg Disk secsRead Avg Disk secsWrite Avg Disk Read bytessec Avg Disk Write bytessec Using the sys. dmosperformancecounters DMV, a lot of counters display a raw value, which has to be monitored over time to see values per second. Others have to be divided by a base value to get a percentage. This makes this DMV less useful unless you perform these calculations and either monitor over time or take an average since the last server restart. This script uses the tempdb creation date to get the number of seconds since the service started and calculates the averages for these counters. It also retrieves all other counters and calculates those that are derived from a base value. USE master SET NOCOUNT ON DECLARE upsecs bigint SELECT upsecs DATEDIFF ( second. createdate. GETDATE ()) FROM sys. databases WHERE name tempdb SELECT RTRIM ( objectname ) objectname. RTRIM ( instancename ) instancename. RTRIM ( countername ) countername. cntrvalue FROM sys. dmosperformancecounters WHERE cntrtype 65792 UNION ALL SELECT RTRIM ( objectname ), RTRIM ( instancename ), RTRIM ( countername ), 1. CAST ( cntrvalue AS bigint ) upsecs FROM sys. dmosperformancecounters WHERE cntrtype 272696576 UNION ALL SELECT RTRIM ( v. objectname ), RTRIM ( v. instancename ), RTRIM ( v. countername ), 100. v. cntrvalue CASE WHEN b. cntrvalue 0 THEN 1 ELSE b. cntrvalue END FROM ( SELECT objectname. instancename. countername. cntrvalue FROM sys. dmosperformancecounters WHERE cntrtype 537003264 ) v JOIN ( SELECT objectname. instancename. countername. cntrvalue FROM sys. dmosperformancecounters WHERE cntrtype 1073939712 ) b ON v. objectname b. objectname AND v. instancename b. instancename AND RTRIM ( v. countername ) base RTRIM ( b. countername ) UNION ALL SELECT RTRIM ( v. objectname ), RTRIM ( v. instancename ), RTRIM ( v. countername ), 1. v. cntrvalue CASE WHEN b. cntrvalue 0 THEN 1 ELSE b. cntrvalue END FROM ( SELECT objectname. instancename. countername. cntrvalue FROM sys. dmosperformancecounters WHERE cntrtype 1073874176 ) v JOIN ( SELECT objectname. instancename. countername. cntrvalue FROM sys. dmosperformancecounters WHERE cntrtype 1073939712 ) b ON v. objectname b. objectname AND v. instancename b. instancename AND REPLACE ( RTRIM ( v. countername ), (ms). ) Base RTRIM ( b. countername ) ORDER BY objectname. instancename. countername Dynamic Management Views and Functions As well as the DMVs in the above scripts, there are a number of others that are useful for diagnosing SQL Server IO performance problems. Here are all the ones I use. Ill add some sample scripts when I get the time: sys. dmoswaitstats sys. dmiovirtualfilestats sys. dmosperformancecounters sys. dmiopendingiorequests sys. dmdbindexoperationalstats sys. dmdbindexusagestats sys. dmdbindexphysicalstats sys. dmosbufferdescriptors It can also be useful to see what activity there is on the instance. Here are your options: The Profiler tool is quick and easy to use - you can start tracing in a matter of seconds. However, there is some overhead and it may impact performance itself - especially when a lot of columns are selected. A server side trace is a better option. A server-side trace has less of an impact than running Profiler. It has to be scripted using system stored procedures, but Profiler has the ability to generate the script for you. Extended Event Sessions Extended events were first introduced in SQL Server 2008, and have been considerably enhanced in SQL 2012. They are very lightweight, and the use of server-side traces and Profiler is now deprecated. Nevertheless, use of extended events may impact performance of high transaction systems if you are not careful. Use an asynchronous target and avoid complicated predicates to limit the overhead. There are a number of tools for gathering performance data from your servers. SQLIO is a simple tool that creates a file on disk and tests latency and throughput for randomsequential IO, at various block sizes and with a variable number of threads. These are all fully configurable. SQLIO is a great way of getting a baseline on a new server or storage, for future comparison. Third party tools are another option for viewing performance metrics. Some show you what is happening on the server right now. Others are built into more complex (and expensive) monitoring solutions. Performance metrics obtained on virtual servers are unreliable. Performance counters and wait stats may give the impression that everything is OK, when it is not. I recommend the use of the performance monitoring tools provided by the VM vendor. In the case of VMWare, this is very easy to use and is built into Virtual Center. This turned into a much bigger article than I expected - SQL Server IO performance is a big subject I started with everything I knew, and double checked my facts by searching the web and checking books. In the process I learnt a whole lot of new stuff and found a lot of useful links. It has been a useful exercise. Hopefully this has been useful for you too. Importing SQL Server Data Using SSIS - Which Option is Fastest By: Daniel Calbimonte Read Comments (27) Related Tips: More Integration Services Development This article is useful for SSIS developers who do not know which tasks are best to use in an SSIS projects. The main problem is that at the end of development if performance is slow then you will need to rebuild the project and change components. This article shows various ways of importing data and shows which types of components perform best within SSIS. The contest will be between the following components: ODBC Tasks ADO NET Tasks OLEDB Task SQL Server Destination T-SQL Tasks I created different SSIS packages in order to test performance. In this demo I used SSIS 2012 and the database Adventureworks 2012 . In this demo I am going to import the table AdventureWorks2012.Sales. SalesOrderDetail to the test2 database which is on the same instance of SQL Server. SalesOrderDetails is the table with more rows in AdventureWorks2012. In order to create the database test2 and the destination table dbo. OrderDetails, use this T-SQL code: Test 1 - ODBC Tasks The first example will use ODBC Source and ODBC Destination as shown below: When we run the package we notice the average time is 5 minutes 57 seconds to import the rows: Test 2 - ADO NET Tasks As noticed, ODBC is pretty slow. Lets try another approach. We are going to truncate the destination table first: Lets try ADO tasks to import the same data and verify if these components are faster: The average elapsed time in my testing was 11 seconds. This is much better. Test 3 - OLEDB Tasks This time we are going to import the same data using the OLEDB Tasks. Again we will truncate the table in the test2 database first. The average elapsed time is 5 seconds. Note that I am using the fast load option with the Table Lock option in the OLE DB Destination Task: If we do not use the fast load option, the average elapsed time was 2 minutes and 21 seconds: OK. The fast load option really improves performance. I will return to that configuration. What about the OLE DB Source. By default I am using the option Table or view in the OLE DB Source as shown below: Lets use a SQL Command instead as shown below. The average elapsed time is 2.85 seconds . Test 4 - SQL Server Destination Now, lets try to use the SQL Destination as the destination instead of OLE DB Destination: The average elapsed time is 2.5 seconds. At this point it is the best option. Test 5 - Execute T-SQL Task Finally, some people think that the best option is to use the Execute T-SQL Task: I am using a simple insert statement to import data from one source to another: The average elapsed time is 1.8 seconds Finally Ive been told that if the query runs inside a stored procedure it is even faster: Lets create a stored procedure: After creating the stored procedure we are going to call it in the Execute T-SQL Task: The average elapsed time is 2.12 seconds . The stored procedures does not improve performance. Lets review the table with the results: You may think the morale of the story is to use the Execute T-SQL Task instead of other SSIS tasks. In this example we were importing data on the same instance, but this will not always be the case. So the morale of the story is that there are many alternatives when creating a SSIS project and we have to carefully study the alternatives in different scenarios. There are great SSIS tools and we do not always use the best options. With each new version of SSIS new tasks are added and performance may be improved with existing tasks. The main changes in SSIS for SQL 2008 and 2012 are related to performance improvements. Next Steps If you are working in a SSIS project make sure you are using the best tasks and also verify if there are other SSIS tasks that can be used in your project. Also make sure you are following the best practices recommended by the experts: Last Update: 7132012 Great read and analysis, but I have one caveat to add. If you need to move a large amount of data, you need to take care of the transaction log growth. This is not a much of a concern using SSIS. For instance, I needed to move 1.3 billion rows (15 columns) and began using TSQL which quickly filled my logs. However, using OLE DB Source and Destination (Bulk Inserts) with fast load, there was little impact to the log file. Thursday, September 20, 2012 - 9:19:12 AM - vinodhkumar Its very useful. great job. Thanks Monday, August 27, 2012 - 10:54:42 AM - Orlando Colamatteo I agree with some others that the testbed is a bit contrived. If youre looking to move data from one table to another on the same instance then SSIS will rarely be a viable option. Some form of T-SQL will almost certainly outperform an SSIS operation. A more realistic scenario is moving data between two disparate data sources. It is surpising how poorly the ODBC Destination performs, especially in light of what Microsoft has publicly said in that they will be moving away from OLE DB interfaces and standardizing on ODBC in future products: In the ODBC Destination I expected Microsoft to implement the loading of data via the bulk load API as they did with the FastLoad option of the OLE DB Destination. On a separate note regarding loading data into MySQL with SSIS: In the past I did some performance tests with the Cherry City OLE DB driver for MySQL and it is horribly slow as it only inserts one row at a time. This is not to mention the fact that it crashed BIDS regularly when developing with it. Given the lack of a benefit I would stick with the tools built into SSIS and avoid the hassle of installing and configuring a third party driver. If youre using SSIS 2005 I would recommend using a Script Component as a Destination and issuing batch-inserts against a connection made using the MySQL ODBC Driver: msdn. microsoften-uslibraryms135939.aspx If youre using SSIS 2008 I would recommend using an ADO NET Destination with the MySQL ODBC Driver. In my tests it was only able to achieve about 240 rowsminute throughput to MySQL which is quite disappointing: msdn. microsoften-uslibrarybb895291(vsql.105).aspx If youre using SSIS 2012 I would recommend using an ODBC Destination with the MySQL ODBC Driver. In my tests it outperformed the ADO NET Destination over 3 to 1 but still only achieved about 800 rowsminute throughput, which was still quite disappointing: msdn. microsoften-uslibraryhh758691(vsql.110).aspx

Comments

Popular posts from this blog

Dag Trade Alternativer Strategier

Flytte Gjennomsnittet Og Eksponentiell Moving Average

Forex Bootcamp Fibonacci