Backend-utveckling · SQL
SQL-databas
SQL-frågor, optimering och underhåll för SQL Server.
01 · Frågor
SQL Query Examples
Frågor för rapportering och felsökning på en SQL Server-databas.
Group and Sort by Month and Year
Grupperar rader på månad och år utifrån en datetime2 och sorterar sedan på antalet.
SELECT YEAR(datetime), MONTH(datetime), count(*)
FROM [Database].[dbo].[Table]
GROUP BY YEAR(datetime), MONTH(datetime)
ORDER BY YEAR(datetime) desc, MONTH(datetime) descFörklaring: Grupperar poster på år och månad och sorterar fallande på antal.
Shrink Log File
Krymper databasens loggfil genom att tillfälligt växla till simple recovery.
ALTER DATABASE faktabank SET RECOVERY Simple
DBCC SHRINKFILE (database_name_log, 1)
ALTER DATABASE database_name SET RECOVERY FullFörklaring: Byter recovery-läge, krymper loggfilen och återställer sedan full recovery.
Check Table Fragmentation
Visar fragmenteringsgraden för alla tabeller och index i databasen.
SELECT
dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.alloc_unit_type_desc,
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent descFörklaring: Returnerar fragmenteringsstatistik för alla index, sorterad med värsta fragmentering först.
02 · Underhåll
Database Maintenance
Skript för indexunderhåll och säker hantering av tabeller.
Rebuild All Table Indexes
Bygger om alla index för samtliga tabeller i databasen.
USE 'database_name' --Enter the name of the database you want to reindex
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'base table'
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC DBREINDEX(@TableName, '', 90)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursorCheck if Table Exists
Droppar och återskapar tabeller utan fel om de inte finns.
IF OBJECT_ID('dbo.MyTable_Name', 'U') IS NOT NULL
DROP TABLE MyTable_Name
IF OBJECT_ID('dbo.MyTable_Name', 'U') IS NULL
CREATE TABLE MyTable_Name(
TheDateTime datetime NOT NULL,
Name nvarchar(64) NOT NULL,
Data varbinary(MAX) NOT NULL
)03 · Praxis
Best Practices
- Use Parameterized Queries
- Använd parametrar för att stoppa SQL-injection och återanvända exekveringsplaner.
- Exempel: Använd @param i stället för att konkatenera strängar i frågan.
- Index Strategy
- Indexera kolumner i WHERE, JOIN och ORDER BY, men undvik överindexering.
- Exempel: Granska exekveringsplaner för att hitta saknade index.
- Regular Maintenance
- Schemalägg index-ombyggnad, statistikuppdatering och integritetskontroller.
- Exempel: Sätt upp maintenance plans för automatisk optimering.
- Monitor Performance
- Använd DMV:er (Dynamic Management Views) för att hitta långsamma frågor och flaskhalsar.
- Exempel: Fråga sys.dm_exec_query_stats för att hitta dyra frågor.
04 · Felsökning
Vanliga problem och lösningar
- Blocking and Deadlocks
- Långa transaktioner blockerar andra frågor och orsakar timeouts.
- Lösning: Kortare transaktioner, rätt indexering och READ COMMITTED SNAPSHOT-isolering.
- Index Fragmentation
- Fragmenterade index gör frågorna långsammare över tid.
- Lösning: Regelbundet indexunderhåll och övervakning av fragmenteringsnivåer.
- Poor Query Performance
- Frågor går långsammare än väntat på grund av saknade index eller dåliga planer.
- Lösning: Analysera exekveringsplaner, lägg till saknade index och uppdatera statistik.
- Growing Log Files
- Transaktionsloggfiler växer oväntat stora.
- Lösning: Sätt rätt recovery-modell och schema för loggbackup.
05 · Tips
SQL Development Tips
- Test på utvecklingsmiljö först
- Testa alltid komplicerade queries och maintenance-skript på en dev-miljö innan produktion.
- Använd execution plans
- Aktivera Show Actual Execution Plan för att förstå hur SQL Server exekverar dina queries.
- Dokumentera komplexa queries
- Lägg till kommentarer i SQL-kod som förklarar business logic och komplexa joins.