100% bych s vámi souhlasil - pomocí INT IDENTITY
je mnohem lepší!
GUID se může zdát jako přirozená volba pro váš primární klíč – a pokud opravdu musíte, pravděpodobně byste mohli argumentovat, že je použijete pro PRIMÁRNÍ KLÍČ tabulky. Co bych důrazně doporučil nedělat je použít sloupec GUID jako klíč clusteru , což SQL Server dělá ve výchozím nastavení, pokud mu výslovně neřeknete, že to tak není.
Opravdu potřebujete oddělit dva problémy:
1) primární klíč je logická konstrukce – jeden z kandidátských klíčů, který jednoznačně a spolehlivě identifikuje každý řádek ve vaší tabulce. Může to být opravdu cokoliv – INT, GUID, řetězec – vyberte si to, co má pro váš scénář největší smysl.
2) klastrovací klíč (sloupec nebo sloupce, které definují „shlukovaný index“ v tabulce) – toto je fyzický věc související s úložištěm a zde je vaší nejlepší volbou malý, stabilní a stále se zvyšující typ dat – INT nebo BIGINT jako výchozí možnost.
Ve výchozím nastavení se primární klíč v tabulce serveru SQL také používá jako klíč clusteru - ale nemusí to tak být! Osobně jsem zaznamenal masivní nárůst výkonu při rozdělení předchozího primárního / klastrového klíče založeného na GUID na dva samostatné klíče – primární (logický) klíč na GUID a klastrovací (objednací) klíč na samostatné INT IDENTITY(1, 1) sloupec.
Jako Kimberly Tripp - Královna indexování – a jiní již mnohokrát uvedli – GUID jako klíč pro shlukování není optimální, protože kvůli své náhodnosti povede k masivní fragmentaci stránek a indexů a obecně špatnému výkonu.
Ano, já vím – existuje newsequentialid()
v SQL Server 2005 a novějších – ale ani ten není skutečně a plně sekvenční, a proto také trpí stejnými problémy jako GUID – jen o něco méně nápadně.
Pak je tu další problém, který je třeba zvážit:shlukovací klíč v tabulce bude přidán také ke každé položce na každém neklastrovaném indexu ve vaší tabulce – opravdu se chcete ujistit, že je co nejmenší. Typicky by INT s více než 2 miliardami řádků mělo být dostačující pro velkou většinu tabulek – a ve srovnání s GUID jako klastrovacím klíčem si můžete ušetřit stovky megabajtů úložiště na disku a v paměti serveru.
Rychlý výpočet – použití INT vs. GUID jako primárního a clusterového klíče:
- Základní tabulka s 1 000 000 řádky (3,8 MB vs. 15,26 MB)
- 6 neklastrovaných indexů (22,89 MB vs. 91,55 MB)
CELKEM:25 MB vs. 106 MB - a to jen na jednom stole!
Ještě pár podnětů k zamyšlení – vynikající věci od Kimberly Tripp – přečtěte si to, přečtěte si to znovu, strávte to! Je to skutečně evangelium indexování SQL Serveru.
- GUID jako PRIMÁRNÍ KLÍČ a/nebo seskupený klíč
- Debata o seskupených indexech pokračuje
- Stále rostoucí klíč shlukování – debata o seskupených indexech..........opět!
- Místo na disku je levné – to je ne pointa!