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.

SQL
SELECT YEAR(datetime), MONTH(datetime), count(*) 
FROM [Database].[dbo].[Table] 
GROUP BY YEAR(datetime), MONTH(datetime) 
ORDER BY YEAR(datetime) desc, MONTH(datetime) desc

Fö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.

SQL
ALTER DATABASE faktabank SET RECOVERY Simple
DBCC SHRINKFILE (database_name_log, 1)
ALTER DATABASE database_name SET RECOVERY Full

Fö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.

SQL
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 desc

Fö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.

SQL
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 TableCursor

Check if Table Exists

Droppar och återskapar tabeller utan fel om de inte finns.

SQL
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.