Způsob 1, špatný:

Plán se skenováním

To na mém stroji trvalo 6 sekund, paralelně přes více vláken, což spotřebovalo desítky sekund CPU na všechny ty výpočty a třídění. (A tabulka Users nemá ani 1 GB.)

Metoda 2, lepší, ale divná: TABLESAMPLE

Tato metoda vyšla v roce 2005 a má spoustu háčků. Je to něco jako výběr náhodné stránky a pak vrácení několika řádků z této stránky. První řádek je tak trochu náhodný, ale ostatní ne.

Transact-SQL

1
SELECT * FROM StackOverflow.dbo.Users TABLESAMPLE (.01 PERCENT);

Plán vypadá, jako by prováděl skenování tabulky, ale provádí pouze 7 logických čtení:

Plán s falešným skenováním

Ale zde jsou výsledky – je vidět, že skočí na náhodnou 8K stránku a pak začne postupně vyčítat řádky. Ve skutečnosti to nejsou náhodné řádky.

Náhodné jako čísla mafiánské loterie

Můžete místo toho použít velikost vzorku ROWS, ale to má poněkud zvláštní výsledky. Například v tabulce Stack Overflow Users, když jsem řekl TABLESAMPLE (50 ROWS), jsem ve skutečnosti dostal zpět 75 řádků. To proto, že SQL Server místo toho převádí velikost řádků na procenta.

Metoda 3, nejlepší, ale vyžaduje kód: Náhodný primární klíč

Zjistěte nejvyšší pole ID v tabulce, vygenerujte náhodné číslo a vyhledejte toto ID. Zde řadíme podle ID, protože chceme najít nejvyšší záznam, který skutečně existuje (zatímco náhodné číslo mohlo být smazáno.) Docela rychlé, ale hodí se jen pro jeden náhodný řádek. Pokud byste chtěli 10 řádků, museli byste takový kód zavolat 10krát (nebo vygenerovat 10 náhodných čísel a použít klauzuli IN.)

Plán provádění ukazuje shlukové prohledávání indexů, ale chytá pouze jeden řádek – mluvíme pouze o 6 logických čteních pro vše, co zde vidíte, a skončí téměř okamžitě:

Plán, který může

Je tu jeden háček: pokud má Id záporná čísla, nebude to fungovat podle očekávání. (Například řekněme, že začínáte pole identity na -1 a krok -1 směřuje stále dolů, jako moje morálka.)

Metoda 4, OFFSET-FETCH (2012+)

Daniel Hutmacher v komentářích přidal toto:

A řekl: „Ale správně to funguje jen se shlukovým indexem. Hádám, že je to proto, že to prohledá (@řádky) řádků v hromadě, místo aby provedl vyhledávání v indexu.“

Bonusová stopa č. 1: Sledujte, jak o tom diskutujeme

Přemýšleli jste někdy, jaké to je být v chatovací místnosti naší společnosti? Tato desetiminutová diskuse na Slacku vám poskytne docela dobrou představu:

Spoiler alert: nebyla. Jen jsem pořídil screenshoty.

Bonusová skladba č. 2: Mitch Wheat kope hlouběji

Chcete hloubkovou analýzu náhodnosti několika různých technik? Mitch Wheat se ponoří opravdu hluboko a doplní to grafy!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.