Vianetsintä SQL Server Performance
SQL-kirjoitus kannettavaa tietokonetta ja koodin taustaa vasten. Opi sql-ohjelmointikieltä, tietokonekursseja, koulutusta.
viime aikoina olemme työstäneet SQL Serverin suorituskykyyn liittyviä ongelmia joillekin suurasiakkaillemme, jotka käyttävät SQL Serveriä tietokantanaan. Tässä artikkelissa, aion tiivistää, mitä olen oppinut prosessin kuvaamalla joitakin vaiheita voimme ryhtyä vaikeuksiin-ampua suorituskykyä kysymys.
Tarkista SQL Server Configuration
varmista, että tietokantapalvelimeen on määritetty riittävästi resursseja, kuten suoritinytimien määrä ja muistin määrä.
palvelimen kokoonpanon tarkistamiseksi voit avata ”System Information” – näkymän:
to check SQL Server memory setting,
- Käynnistä SQL Server Management Studio.
- Napsauta tietokannan ilmentymää hiiren kakkospainikkeella ja valitse ”Ominaisuudet”.
- klikkaa ” muisti ”-taulukkoa” Palvelimen ominaisuudet ” – ponnahdusikkunassa.
- Tarkista Muistiasetukset.
varmista, että Tilannevedostila on käytössä
varmista, että tilannevedostila on käytössä tietokantaa varten. Jotta SQL Server Ei lukittuisi, snapshot mode-lippu on otettava käyttöön. Suorita seuraava kysely tarkistaaksesi, onko lippu päällä:
SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= '<database_name>'
jos kysely palauttaa ’1’, tilannevedostila on jo käytössä. Muussa tapauksessa käynnistä seuraava kysely.
ALTER DATABASE <database_name> SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
sukua: Vaatimusten määrittely ja täytäntöönpano peruslinjat
Tarkista Tietokantaindeksit
Tarkista tietokantaindeksit varmistaaksesi, ettei puuttuvia indeksejä ole. Suorita seuraava kysely luetteloidaksesi kaikki tietokannan indeksit (luotto: tsql-luettelo kaikista indekseistä & indeksisarakkeet SQL Server DB-Stack Overflow):
SELECT t.name TableName, col.name ColumnName, ind.name IndexNameFROM sys.indexes indINNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_idINNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_idINNER JOIN sys.tables t ON ind.object_id = t.object_idWHERE (ind.is_primary_key = 0 AND t.is_ms_shipped = 0)ORDER BY t.name, col.name, ind.name
Tallenna kyselyn tulokset tekstitiedostoon, jossa sarkaimet on rajattu, jotta ne voidaan tuoda taulukkolaskentaohjelmaan myöhemmin.
Vältä pirstoutumista
varmista, etteivät tietokannan indeksit ole pirstaloituneet. Tietokannan indeksit auttavat nopeuttamaan tietokantakyselyä. Mutta kun ne pirstoutuvat, kyselyt voivat kulkea todella hitaasti. Osana tietokannan ylläpitoa indeksit tulisi järjestää uudelleen tai rakentaa uudelleen säännöllisesti.
suorita seuraava kysely tarkistaaksesi kaikkien tietokannan indeksien fragmentoitumisprosentin (credit: How to Check Index Fragmentation on Indexes in a Database):
SELECT dbschemas.Jama Software AS 'Schema', dbtables.Jama Software AS 'Table', dbindexes.Jama Software AS 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count, dbindexes.fill_factorFROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstatsINNER JOIN sys.tables dbtables ON dbtables. = indexstats.INNER JOIN sys.schemas dbschemas ON dbtables. = dbschemas.INNER JOIN sys.indexes AS dbindexes ON dbindexes. = indexstats. AND indexstats.index_id = dbindexes.index_idWHERE indexstats.database_id = DB_ID()ORDER BY indexstats.avg_fragmentation_in_percent DESC
tässä on otoskyselyn tulos tietokannasta, jossa on erittäin hajanaisia indeksejä:
niiden indeksien osalta, joiden sivumäärä on yli 1000, ”avg_framentation_in_percent” tulisi pitää alle 10%: ssa. Pienillä indekseillä ei ole väliä. Nyrkkisääntönä voidaan pitää indeksejä, joiden fragmentaatioprosentit ovat 5-30 prosenttia, ja indeksejä, joiden fragmentaatioprosentit ovat yli 30 prosenttia, voidaan järjestää uudelleen.
järjestää yhden indeksin uudelleen:
ALTER INDEX REORGANIZE
yhden indeksin uudelleenrakentaminen:
ALTER INDEX REBUILD WITH (ONLINE = ON)
voit myös uudelleenjärjestää tai rakentaa indeksin uudelleen SQL Server Management Studion avulla napsauttamalla hiiren kakkospainikkeella indeksiä, jonka haluat rakentaa uudelleen tai uudelleen.
jos tietokannassa on useita eheyttäviä indeksejä, voit suorittaa seuraavan kyselyn rakentaaksesi ne kaikki uudelleen (luotto: SQL SERVER – 2008 -2005-Rebuild Every Index of All Tables of Database – Rebuild Index with fillfactor). Huomaa, että kysely voi olla käynnissä jonkin aikaa suurelle tietokannalle. On suositeltavaa suorittaa kysely tietokannan ollessa tyhjäkäynnillä tai offline-tilassa.
DECLARE @TableName VARCHAR(255)DECLARE @sql NVARCHAR(500)DECLARE TableCursor CURSOR FORSELECT OBJECT_SCHEMA_NAME()+'.'+name AS TableNameFROM sys.tablesOPEN TableCursorFETCH NEXT FROM TableCursor INTO @TableNameWHILE @@FETCH_STATUS = 0BEGINSET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD'PRINT @sqlEXEC (@sql)FETCH NEXT FROM TableCursor INTO @TableNameENDCLOSE TableCursorDEALLOCATE TableCursorGO
harkitse ylläpitotyön perustamista SQL Server studioon tietokannan indeksin uudelleenorganisoinnin suorittamiseksi säännöllisesti. Vaikka uudelleenrakentaminen indeksit SQL Server pitäisi luultavasti tehdä offline tai kun järjestelmä on tyhjäkäynnillä, indeksin uudelleenjärjestely voitaisiin tehdä verkossa. Tässä on hyvä artikkeli tästä aiheesta: Rebuild or Reorganisize: SQL Server Index Maintenance.
jos haluat määrittää indeksin uudelleenorganisointisuunnitelman SQL Server-palvelimessa, napsauta hiiren kakkospainikkeella ”hallinta”, sitten ”Ylläpitosuunnitelmat” ja valitse ”Uusi huoltosuunnitelma” tai ”ylläpitosuunnitelma ohjattu”. Seuraa ohjeita luoda suunnitelma.
RELATED: Release Management Options in Jama Connect
Run Missing Index Report
SQL Server tarjoaa työkalun, joka analysoi tietokannan toimintaa ja suosittelee muita indeksejä, jotka voivat auttaa kyselyn suorituskykyä. Mietintö voisi antaa meille joitakin ajatuksia siitä, miksi tietyt kyselyt ovat hitaita.
raportin tuottamiseksi suorita seuraava kysely sen jälkeen, kun tietokanta-instanssia on käytetty jonkin aikaa (luotto: Älä vain sokeasti luoda niitä ”puuttuvat” indeksit!):
SELECT d., s = OBJECT_SCHEMA_NAME(d.), o = OBJECT_NAME(d.), d.equality_columns, d.inequality_columns, d.included_columns, s.unique_compiles, s.user_seeks, s.last_user_seek, s.user_scans, s.last_user_scan, s.avg_total_user_cost, s.avg_user_impactFROM sys.dm_db_missing_index_details AS dINNER JOIN sys.dm_db_missing_index_groups AS gON d.index_handle = g.index_handleINNER JOIN sys.dm_db_missing_index_group_stats AS sON g.index_group_handle = s.group_handleWHERE d.database_id = DB_ID() AND OBJECTPROPERTY(d., 'IsMsShipped') = 0
lue artikkeli löytää puuttuvat indeksit ymmärtää lähtö tämän kyselyn.
Monitor Database Sessions
use Activity Monitor to monitoring database sessions. Microsoft SQL Server Management Studion mukana tulee Activity Monitor, jota voidaan käyttää tietokannan istuntojen seuraamiseen.
Etsi istuntoja, jotka muut istunnot estävät pitkään. Napsauta istuntoa hiiren kakkospainikkeella ja valitse” Tiedot ” näyttääksesi prosessiin liittyvän kyselyn yksityiskohdat.
Käytä Windows Resource Monitor
Windows Resource monitoria voidaan käyttää SQL Server-prosessin muistin ja suorittimen käytön seuraamiseen, jotta voidaan varmistaa, että järjestelmässä on riittävästi muistia eikä suoritin ole kylläinen. Huomaa, että SQL Server 2008: sta tunnetaan ongelma, jossa Resurssienvalvonnassa SQL Server-prosessille esitetty muistiluku ei ole oikea.
tunnista hitaat kyselyt
jos olemme todenneet, että suorituskyky ei liity resursseihin, seuraava askel on tunnistaa hitaat kyselyt, jotka johtavat huonoon suorituskykyyn.
seuraava kysely palauttaa 100 parasta hidasta kyselyä, jotka kestävät yli 300 ms (luotto: Pitkät kyselyt):
SELECT st.text, qp.query_plan, qs.*FROM ( SELECT TOP 50 * FROM sys.dm_exec_query_stats ORDER BY total_worker_time DESC) AS qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS stCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qpWHERE qs.max_worker_time > 300 OR qs.max_elapsed_time > 300
tässä on kuvakaappaus joitakin näytteen tuloksia:
kun olemme keränneet listan hitaista kyselyistä, voisimme ajaa ne suoraan tietokantaan ja tarkastella suoritussuunnitelmia ymmärtääksemme nämä kyselyt.
muut työkalut
tässä on luettelo muista työkaluista, joita voidaan käyttää SQL Server-ja Java-sovellusten vianmääritykseen:
- SQL Server Profiler: voidaan tunnistaa hitaat kyselyt. Voit aloittaa sen SQL Server Management studiosta
- VisualVM: voidaan käyttää Java-resurssien käytön seurantaan ja langankaatojen tekemiseen
- Java Mission Control / Flight recording: monitor and record system events
- JProfiler: tunnista hitaat palvelu-tai tietokantapuhelut (kehitys, ei tue 8.x deployment)
- New Relic: voi seurata tietokannan suorituskykyä ja tallentaa hitaita kyselyitä
Tarkistuslistat
tässä on luettelo tiedoista, joita voidaan kerätä SQL Server-ongelmien vianmääritykseen:
- tietokantapalvelimen kokoonpano (suoritinytimien lukumäärä, fyysinen muisti, levytila, Windows Serverin versio, SQL Serverin versio, SQL Serverin Muistiasetukset)
- sovelluspalvelimen kokoonpano (suoritinytimien lukumäärä, fyysinen muisti, levytila, Java-ydinmuistiasetukset)
- tietokannan indeksitilastot
- tietokannan pirstoutumistilastot
- SQL Serverin puuttuva indeksiraportti
- tietokantapalvelimen muisti ja suoritintilastot, kun palvelin on hidas
- operaatiot, jotka aiheuttavat järjestelmän hitauden
- SQL Serverin hidas kyselyraportti
- Tietokantataulukon tilastot
- pari Java-sovellusten langankaatoa, jotka on otettu hitaan toiminnan aikana soveltuvin osin
johtopäätös
Vianetsintä SQL Serverin suorituskykyyn liittyvät ongelmat eivät ole aina suoraviivaisia. Mutta oikeilla työkaluilla ja kärsivällisyydellä meidän pitäisi pystyä ymmärtämään näiden ongelmien syy. Toivottavasti tämän artikkelin tiedot auttavat siinä.
- tekijä
- tuoreita viestejä
- Vianetsintä SQL Server Performance-October 12, 2016
- Docker Containersin sisällä kulkevien Java-sovellusten seuranta-kesäkuu 1, 2016