Saturday, April 28, 2007

Optimering utav SQL server. Underhålla Indexen

Underhålla indexen
För att hålla indexen optimerade krävs att man frekvent kör optimeringsjobb för att indexen skall vara uppdaterade. Beroende på hur mycket som ändras och läggs till i en tabell så måste dessa jobb köras mer eller mindra ofta. Vilka index behöver då underhåll? Ett bra sätt att se detta är att kolla vilka querys som tar tid och används frekvent. Detta kan vi göra i SQL Profilern med hjälp utav templaten SQLProfilerTSQL_Duration. Querys som tar tid är ett bra alternativ för att se över indexen för.
I SQL 2000 kör vi dbcc dbreindex eller dbcc indexdefrag för att optimera indexen. Skillnaden mellan dessa två är att indexdefrag går att köra online, dvs indexet är tillgängligt under operationen. Dbcc dbreindex är att föredra om det är hög fragmentering i indexet och du kan även välja fyllnadsgrad.

Kommandon för SQL 2000:
DBCC DBREINDEX ('tabellnamn', '',80);
DBCC INDEXDEFRAG ('databasnamn', 'tabellnamn', 'indexnamn')


I SQL 2005 har man ersatt dbcc dbreindex och indexdefrag med Alter index och rebuild eller reorganize. Man har även möjlighet att göra rebuild online och att välja att sorteringen skall göras i tempdb, vilket kan vara bra ur prestandard synpunkt. Kräver dock att tempdb ligger på en egen diskyta annars gör det ingen nytta.

Kommandon för SQL 2005:
Alter index all (för alla index i tabellen)
On tabellnamnet
Rebuild with (fillfactor = 80, SORT_IN_TEMPDB = ON, ONLINE = ON);



Är avg_fragmentation_in_percent value mindre än 30% så välj REORGANIZE.
Alter index all (för alla index i tabellen)
On tabellnamnet
Reorganize;

Friday, April 20, 2007

Optimering utav SQL server. Index

Att skapa och identifiera nödvändiga index
När man skall se över indexen i en datatbas så fokusera i förstahand på tabeller med mycket data och som används frekvent. Dom andra spelar inte så stor roll. För att kunna optimera indexen så skall man vara medveten om hur databasen används och vilka frågor som är vanligast annars blir det svårt att göra något. Nedan följer ett antal punkter man skall ha i åtanke vid indexoptimering.

Överväg att Indexera alla kolumner där klausulerna WHERE, ORDER BY, GROUP BY, TOP och DISTINCT används ofta.

Ta bort index som inte används utav Queryoptimizern. Indexen tar bara onödig plats och prestandard om dom inte används.

Vilken fyllnadsgrad skall indexen ha. Är det bara läsning som sker mot tabellen så är en full fyllnadsgrad att föredra (Pading index) medan en tabell som det skrivs mycket till kanske skall ligga på 50%.

Som en tumregel så bör alla tabeller ha ett Clustrat Index. Generellt sett, men inte alltid, så ska det Clustrade Indexet finnas på en kolumn vars värden ökar monotont, såsom t ex identitetskolumner eller kolumner vars värden ökar – och är unika. I många fall så är primärnyckeln en ideal kolumn för Clustrade Index.

Returneras bara ett värde från tabellen så är det bättre med ett icke clustrat index.

Kolumner utav typen image, text skall inte ha några index.

Om man har två eller fler tabeller som JOINas ihop väldigt ofta, så bör de kolumner som används för JOINerna ha de korrekta Indexen.

Om möjligt se till att göra indexen unika, när databasmotorn hitta värdet behöver den inte fortsätta att söka igenom hela indexet för den vet att det bara finns ett unikt värde.

Index skall skapas på så smala kolumner som möjligt.

Ett index är ge bättre resultat på en kolumn med numeriska värden än tecken.

Index kan påverka olika operationer både positivt och negativt. Tex en query som gör en select går mycket bättre när man lägger till ett clustrat index. Men om samma tabell kanske fylls med data vid ett tillfälle per dygn och det då görs en massa inserts så kan samma index påverka denna operation mycket negativt. Vid detta tillfälle kan man låta droppa indexet före operationen för att sedan skapa det igen efteråt.

Thursday, April 19, 2007

Restore utav Microsoft SQL server 2000

Restore utav en SQL server kan vara lite knepigt. Här följer en instruktion som skall följas steg för steg. Restore kan göras till likvärdig filstruktur vilket är enklast eller till en helt olik filstruktur på en annan server vilket är lite mer kompext. Nedan följer först den enkla varianten sedan den till en annan filstruktur.
Första stegen är att installera upp en ny server med samma konfiguration, tex namn, nätverksinställningar och liknande. Observera att det är viktigt att diskar och partitioner blir likadant konfigurerat som på den servern man skall efterliknar annars kan det bli lite strul när man återläser systemdatabaserna för SQL. Djupare beskrivning utav detta kan läsas senare i dokumentet.



Återställning utav Operativsystemet och servern

Installation av Operativsystem inklusive uppdateringar på en helt ny server med likvärdig konfiguration, så som Tex att disk konfigurationen blir rätt.

Installation av MS SQL Server inklusive samma SupportPack nivå som innan. Collation mm kvittar då dessa inställningar finns i Master databasen som skall läsas in från backup senare.

När servern är installerad så skall SQL servern återställas så att SQL få sin ursprungliga konfiguration.

Återställning utav SQL servern

Tänk först på att stänga av övervakningsagenter och liknande innan man går vidare så att inte de håller på att starta SQL.

Backupdatat återläses från backupmedia till den nya servern till en lämplig katalog.

Börja med återläsning av Master databasen. Detta görs genom att starta SQL Servern i singleusermode. Stoppa först tjänsten och öppna sedan en kommandopromt.
Skriv Sqlservr.exe –c –m Välj sedan restore på Master databasen i EnterpriseManager alternativt i QueryAnalyzer. Fodras dock att man behärska Transact SQL kommandon. Peka ut sökvägen dit backupfilerna nu finns och genomför restoren. Databaserna hamnar nu på samma ställen som de ursprungligen fanns.

Efter restoren utav Master databasen så stängs SQL servern tjänsten av automatiskt. Starta upp den igen som vanligt och läs på övriga systemdatabaser på vanligt sätt.

Nu är servern installerad och konfigurerad som före systemkrashen. Nu kan datat för användadatabaserna läsas tillbaks.

Återläsning till annan filstruktur, flytt till ny server

För att återställa SQL server till en annorlunda filstruktur än ursprunget måste man göra enligt följande punkt för punkt lista. Det är viktigt att det görs exakt rätt. Här använder jag Queryanalyzern istället för Enterprise Manager.

Först starta man SQL via kommandopromten: sqlservr.exe -c –f
Nu är SQL igång och då ansluter man med Queryanalyzern till server. I den skriver man följande kommando för att restora. Observera att vi ändra sökvägarna till databasfilerna. Master restoras sen stoppas SQL automatiskt.

RESTORE DATABASE master FROM DISK='d:\sql\master.bcp' WITH
MOVE 'master' to 'c:\mssql\data\master.mdf',
MOVE 'mastlog' to 'c:\mssql\data\mastlog.ldf',
REPLACE
GO


Efter att master databasen är restorad så startas SQL från kommandopromten igen som innan fast med ett par andra parametra. Skriv följande: sqlservr.exe -c -f -T3608 -(T3607) -T4022
T3608 kommandot säger till SQL att starta utan någon annan databas vilket ger oss möjlighet att ändra Tempdb sökvägen. Informationen i Master databasen säger nu att den ligger på det gamla stället i filsystemet vilket vi måste ändra för att kunna starta upp SQL på ett riktigt sätt. För att ändra skriv följande i Queryanalyzern:

update sysdatabases SET filename = 'C:\MSSQL\Data\tempdb.mdf'
where name = 'tempdb'
GO


Även model databasens sökväg måste ändras annars kan vi inte fortsätta.

update sysdatabases SET filename = 'C:\MSSQL\Data\model.mdf'
where name = 'model'
GO


Sen måste den sökvägen till filerna i själva Tempdb ändras.

ALTER database tempdb MODIFY File (name = tempdev, Filename = 'c:\mssql\data\tempdb.mdf')
GO
ALTER database tempdb MODIFY File (name = templog, Filename = 'c:\mssql\data\templog.ldf')
GO


Nu kan man gå vidare med att göra restore utav de andra systemdatabaserna msdb och model. Stäng ner SQL och starta upp den normalt. Gör sedan restore i Quryanalyzern eller Enterprisemanager.

restore database msdb from disk = 'd:\sql\msdb.bcp'
with move 'msdbdata' to 'c:\mssql\data\msdbdata.mdf', move 'msdblog' to 'c:\mssql\data\msdblog.ldf', replace


Då är restoren klar. Om servern har fått ett nytt namn måste detta ändras. Eftersom man har restorat master databasen från ett annat system så står det gamla namnet kvar i vissa systemtabeller. Detta ändras med följande kommandon i Queryanalyzern:

exec sp_dropserver 'old name'
exec sp_addserver 'new name', 'local'


Nu är SQL Servern helt återställd och kan användas igen.

Frågetecken kring SQL Jobb

I samband med namnbyte på servern kan man få problem med att jobben inte går att editera efteråt. Detta beror på att det i tabellen sysjobs och columnen originating_server i MSDB databasen står det gamla servernamnet. Ändera detta till rätt servernamn.

UPDATE SYSJOBS SET ORIGINATE_SERVER = 'namnet'

Även i sysjobssteps tabellen och columnen server kan fel finnas. Bör vara NULL eller servernamnet men det nya namnet.