Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Managed Instance
Vstupně-výstupní operace z instance databázového stroje SQL Serveru zahrnuje logické a fyzické čtení. K logickému čtení dochází pokaždé, když databázový stroj požádá o stránku z mezipaměti vyrovnávací paměti, označovanou také jako fond vyrovnávací paměti. Pokud stránka není aktuálně ve vyrovnávací paměti, fyzické načítání nejprve zkopíruje stránku z disku do vyrovnávací paměti.
Požadavky na čtení generované instancí databázového stroje jsou řízeny relačním modulem a optimalizovány modulem úložiště. Relační modul určuje nejúčinnější metodu přístupu (například prohledávání tabulky, prohledávání indexu nebo čtení s klíči). Metody přístupu a komponenty správce vyrovnávací paměti modulu úložiště určují obecný vzor čtení, který se má provést, a optimalizují čtení potřebná k implementaci metody přístupu. Vlákno vykonávající dávkové úlohy plánuje operace čtení.
Čtení dopředu
Databázový stroj podporuje mechanismus optimalizace výkonu, který se nazývá čtení dopředu. Předběžné načítání předpokládá, která data a indexové stránky jsou potřebné pro provedení plánu dotazu, a přenáší tyto stránky do mezipaměti před jejich použitím dotazem. Tento proces umožňuje překrývání výpočtů a vstupně-výstupních operací, přičemž plně využívá procesor i disk.
Mechanismus pro čtení umožňuje databázovému stroji číst až 64 souvislých stránek (512 kB) z jednoho souboru. Čtení se provádí jako jediné čtení scatter-gather na odpovídající počet (pravděpodobně nesouvislých) vyrovnávacích pamětí v mezipaměti. Pokud některé ze stránek v rozmezí již existují ve vyrovnávací paměti, odpovídající stránka z načítání se po dokončení čtení zahodí. Rozsah stránek se může také oříznout z obou stran, pokud jsou odpovídající stránky již přítomné v mezipaměti.
Existují dva druhy čtení dopředu: jeden pro datové stránky a jeden pro indexové stránky.
Čtení datových stránek
Kontroly tabulek používané databázovým strojem ke čtení datových stránek jsou efektivní. Stránky mapy přidělení indexu (IAM) v databázi SQL Serveru uvádějí rozsahy používané tabulkou nebo indexem. Modul úložiště může přečíst IAM a vytvořit seřazený seznam adres disku, které se musí číst. To umožňuje modulu úložiště optimalizovat vstupně-výstupní operace jako velké sekvenční čtení, která se provádějí v posloupnosti na základě jejich umístění na disku. Další informace o stránkách IAM naleznete v tématu Správa prostoru používaného objekty.
Čtení indexových stránek
Modul úložiště čte indexové stránky sériově v pořadí klíčů. Například tento obrázek ukazuje zjednodušenou reprezentaci sady listových stránek, která obsahuje sadu klíčů. Dále je znázorněn zprostředkující indexový uzel, který mapuje tyto listové stránky. Další informace o struktuře stránek v indexu naleznete v tématu Seskupené a neseskupené indexy.
Úložný stroj používá informace na mezilehlé indexové stránce nad úrovní listu k plánování sériového předběžného čtení pro stránky, které obsahují klíče. Pokud je požadavek proveden pro všechny klíče od ABC do DEF, úložný stroj nejprve přečte indexovou stránku nad listovou stránkou. Nečte ale jenom každou datovou stránku v posloupnosti ze stránky 504 na stránku 556 (poslední stránka s klíči v zadaném rozsahu). Místo toho modul úložiště prohledá zprostředkující indexovou stránku a vytvoří seznam listových stránek, které se musí číst. Úložný modul pak naplánuje všechna čtení podle pořadí klíčů. Modul úložiště také rozpozná, že stránky 504/505 a 527/528 jsou souvislé a provádí jedno bodové čtení pro načtení sousedních stránek v jedné operaci. Pokud je v sériové operaci načteno mnoho stránek, naplánuje modul úložiště blok čtení najednou. Po dokončení podmnožiny těchto čtení modul úložiště naplánuje stejný počet nových čtení, dokud nejsou naplánována všechna požadovaná čtení.
Modul úložiště používá předběžné načítání k urychlení vyhledávání základní tabulky z neclusterovaných indexů. Řádky listu neclusterovaného indexu obsahují ukazatele na datové řádky, které obsahují každou konkrétní hodnotu klíče. Vzhledem k tomu, že modul úložiště čte listové stránky neclusterovaného indexu, začne také plánovat asynchronní čtení pro řádky dat, jejichž ukazatele byly již načteny. To umožní modulu úložiště načíst řádky dat z podkladové tabulky před dokončením kontroly neclusterovaného indexu. Předběžné načítání se používá bez ohledu na to, jestli má tabulka clusterovaný index. Edice SQL Server Enterprise používá více předběžného načítání než jiné edice SQL Serveru, což umožňuje čtení více stránek dopředu. Úroveň předběžného načtení není možné konfigurovat v žádné edici. Další informace o neclusterovaných indexech naleznete v tématu Shlukované a neshlukované indexy.
Pokročilé skenování
V edici SQL Server Enterprise umožňuje funkce pokročilého skenování více úlohám sdílet úplné skeny tabulek. Pokud plán provádění příkazu Transact-SQL vyžaduje prohledání datových stránek v tabulce a databázový stroj zjistí, že tabulka už je prohledávaná jiným plánem provádění, databázový stroj připojí druhé prohledávání k prvnímu na aktuálním místě druhého prohledávání. Databázový stroj načte každou stránku jednou a předává řádky z každé stránky do obou plánů provádění. To pokračuje až do dosažení konce tabulky.
V tomto okamžiku má první prováděcí plán kompletní výsledky skenování. Druhý plán vykonávání však musí stále načítat datové stránky, které byly přečteny, ještě předtím, než se připojil k probíhajícímu skenování. Skenování druhého plánu spuštění se pak vrátí zpět k první datové stránce tabulky a pak pokračuje skenováním tam, kde se spojil s prvním skenováním. Libovolný počet kontrol se dá takto zkombinovat. Databázový stroj opakovaně prochází datové stránky, dokud nenaplní všechny průchody. Tento mechanismus se také nazývá "merry-go-round scan" a ukazuje, proč pořadí výsledků vrácených z SELECT příkazu nemůže být zaručeno bez ORDER BY klauzule.
Předpokládejme například, že máte tabulku s 500 000 stránkami.
UserA spustí příkaz Transact-SQL, který vyžaduje kontrolu tabulky. Když tato kontrola zpracuje 100 000 stránek, UserB spustí další příkaz Transact-SQL, který prohledá stejnou tabulku. Databázový stroj naplánuje jednu sadu požadavků na čtení pro stránky za 100 001 a předá řádky z každé stránky zpět do obou prohledávání. Když kontrola dosáhne 200 000. stránky, UserC spustí další příkaz Transact-SQL, který prohledá stejnou tabulku. Počínaje stránkou 200 001 předává databázový stroj řádky z každé stránky, které přečte zpět do všech tří kontrol. Po přečtení 500 000. řádku se skenování pro UserA dokončí, a skenování pro UserB a UserC se vrátí zpět a začne číst stránky od stránky 1. Jakmile databázový engine přejde na stránku 100 000, kontrola UserB je dokončena. Skenování UserC pak pokračuje samostatně, dokud nedosáhne stránky 200 000. V tuto chvíli byly dokončeny všechny kontroly.
Bez pokročilého skenování by každý uživatel musel soutěžit o místo ve vyrovnávací paměti a způsobit kolize ramene disku. Stejné stránky by se pak četly jednou pro každého uživatele, místo aby byly jednou přečteny a sdíleny více uživateli, což zpomaluje výkon a zatěžuje zdroje.