Optimalazece databáze   otázka

SQL

Ahoj, mám takový problém se svou databází, proto bych Vás chtěl požádat o pomoc, popř. nějaké nasměrování.

Moje internetová stránka má celkem rozsáhlou databázi - cca. 40 tabulek a některé mají i několik desítek tisíc záznamů. V databázi jsou ukládany i datové soubory. Databáze ale narostla a začíná být značně pomalá. Odstranil jsem z databáze tedy všechny binnary data - potažmo sloupce, které je obsahovali. S velikostí a rychlostí db to ale ani nehlo – pořád je stejná. Dočetl jsem se, že by mohla pomoct reindexace dat (ale nemohu najít, kde se to dělá).

Pomůže reindaxe pro zrychlení databáze nebo jaké další kroky byste mi poradily, aby byla databáze rychlejší?

Díky za každou radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

40 tebulek a několik desítek tisíc záznamů je pro SQL brnkačka, pokud máš odpovídajcí HW.

V dotazu ji mohl napsat alespoň o jaký SQL server se jedná a zdali je to hosting, nebo vlastní.

Z vlastní zkušenosti vím, že je třeba zapnout indexy v tabulkách na vybrané sloupce, následně se zobrazování dat pekelně zrychlí.

Další věc je, kolik RAM je pro SQL dostupné - čím víc tím lépe. Na starém SQL serveru jsm měl 1 GB RAM a bylo to utrpení, nyní mám 16GB a SQL si vezme ve špičce 10GB. Když hledam záznamy v tabulce, která má 1/2 milionu záznamů, tak zobrazení požadovaných dat je téměř okamžité.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za rady. Hosting mám u QSH (verze Basic), tj. měl by tam být MS SQL 2008.

Mohu se zeptat, jak se reindexace přesně provádí? Zda musím napsat ručně nějakou proceduru nebo je na to nějaký nástroj v myLittleAdmin?

Omlouvám se adminům serveru za překlepy v názvu tématu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde ještě o to, zdali jste si sám vytvářel indexy na vybrané sloupce, pokud ne, tak jsou ve výchozím stavu indexy nastavene v tabulkách na sloupce s PK.

Jak na indexy http://msdn.microsoft.com/en-us/library/...

a nebo doporučuji pohledat na webu něco o indexech

-- a zde je kod jak indexovat určité sloupce (doporučuje se provádět indexace s rozumem, to znamená vybrat opravdu ty důležité sloupce)


CREATE NONCLUSTERED INDEX [IX_PRESTUPKY_1] ON [dbo].[Název tavbulky] 
(
	[Sloupec 1] ASC,
	[Sloupec 3] ASC,

)WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Optimalizace databáze je docela věda. Jedna z věcí, které se dají dělat, je vytváření indexů. Musíte je udělat tam, kde se hodí, naopak tam, kde potřeba nejsou, by být neměly, protože to zpomaluje.

Dobrý tip pro začátek je v SQL Server Management Studiu zkusit proti té databázi pustit SQL dotazy, které generuje aplikace (můžete je snadno najít třeba pomocí nástroje SQL Server Profiler, anebo je prostě vykopírujete rovnou z aplikace).

Dotaz si dáte do SSMS, v toolbaru, jak je tlačítko Execute, najdete podle tooltipu tlačítko Include Actual Execution Plan a to zakliknete.

Po puštění dotazu se v dolní části okna místo dvou záložek Results a Messages objeví i třetí - Execution Plan. To je exekuční plán a vidíte na něm jednotlivé části dotazu, kolik která zabrala atd. Pokud ale dotaz trvá dlouho a je neefektivní, SSMS to zjistí a nad tím plánem vám vygeneruje přímo deklaraci toho indexu, co potřebujete, a co by měl pomoci. Není rozhodně dobré brát to 100% vážně, ale velmi často se to trefilo. Mějte na paměti, že v indexu by měly být všechny sloupce, podle kterých vyhledáváte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Moc děkuji za ten typ. Velmi mi to pomohlo při hledání, které dotazy jsou "nejhorší". SQL Server Profiler je také velmi dobrý nástroj, který jsem dříve neznal. Děkuji ;-)

Ještě bych se chtěl optat, jestli je tato procedura dobrá, pro reindexaci současných indexů.

CREATE PROCEDURE spReindexAllTables AS  
    SET NOCOUNT ON  
    DECLARE @TblName char(100)  
    DECLARE IdxCursor CURSOR FOR SELECT name FROM sysobjects WHERE type='U'  
    OPEN IdxCursor  
    FETCH NEXT FROM IdxCursor INTO @TblName  
    WHILE @@FETCH_STATUS=0 BEGIN  
        DBCC DBREINDEX(@TblName)  
        FETCH NEXT FROM IdxCursor INTO @TblName  
    END  
    CLOSE IdxCursor  
    DEALLOCATE IdxCursor   
GO  
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Reindexace stoprocentně pomůže. Doporučil bych ji naplánovat jako pravidelně prováděnou úlohu.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback