it-swarm-eu.dev

Proč ORDER BY nepatří do pohledu?

I rozumímže vynemůžeteORDER BY v pohledu. (Alespoň v SQL Server 2012, se kterým pracuji)

Také chápu, že „správným“ způsobem třídění pohledů je vložení ORDER BY kolem příkazu SELECT dotazujícího zobrazení.

Ale vzhledem k tomu, že jsou praktické a praktické názory SQL relativně nové, rád bych pochopil, proč se tak děje záměrně. Pokud jsem sledoval historii správně, bylo to jednou možné a bylo to výslovně odstraněno z SQL Server 2008 atd. (Neuvádějte mě v přesné verzi).

Nejlepší důvod, proč mohu přijít s tím, proč společnost Microsoft tuto funkci odstranila, je proto, že „pohled je netříděný soubor dat“.

Předpokládám, že existuje dobrý logický důvod, proč by pohled měl být netříděn. Proč nemůže být pohled pouze sloučeným sběrem dat? Proč konkrétně un - seřazené? Nezdá se, že je těžké přijít s situacemi, kdy (alespoň pro mě/IMHO) se zdá být naprosto intuitivní mít tříděný pohled.

53
ngmiceli

(Samozřejmě indexované pohledy stranou.)

Pohled není zhmotněn - data nejsou uložena, tak jak je lze třídit? Pohled je jako uložená procedura, která obsahuje pouze SELECT bez parametrů ... neobsahuje data, pouze drží definici dotazu. Protože různé odkazy na pohled mohou vyžadovat data seřazená různým způsobem, tak, jak to uděláte - stejně jako výběr z tabulky, která je také podle definice netříděnou řadou řádků, je zahrnout pořadí do vnějšího dotazu. .

Také dát trochu nahlédnout do historie. Dalo by se nikdy dát do zobrazení ORDER BY, Aniž byste zahrnuli také TOP. A v tomto případě ORDER BY Určoval, které řádky byly zahrnuty TOP, nikoli jak by byly prezentovány. Stalo se tak, že v SQL Server 2000, pokud TOP byl 100 PERCENT Nebo {some number >= number of rows in the table}, Byl optimalizátor poměrně zjednodušující a nakonec vytvořil plán s takovým typem, který odpovídal TOP/ORDER BY. Ale toto chování nebylo nikdy zaručeno ani zdokumentováno - bylo na něj založeno pouze na základě pozorování, což je špatný zvyk . Když vyšel SQL Server 2005, toto chování se začalo „lámat“ kvůli změnám v optimalizátoru, které vedly k použití různých plánů a operátorů - mimo jiné by byl TOP / ORDER BY Zcela ignorován, pokud by to bylo TOP 100 PERCENT. Někteří zákazníci si na to stěžovali tak hlasitě, že Microsoft vydal příznak trasování k obnovení starého chování. Nechci vám říkat, co je to za vlajku, protože nechci, abyste ji použili a chci se ujistit, že je záměr správný - pokud chcete předvídatelné pořadí řazení, použijte ORDER BY Na vnější dotaz.

Abychom shrnuli a přesně objasnili bod, který jste si udělali: Microsoft neodstranil nic nic neodstranil. Vylepšili produkt a jako vedlejší účinek se toto nezdokumentované nezaručené chování stalo méně spolehlivým. Celkově si myslím, že produkt je pro něj lepší.

39
Aaron Bertrand

Pokud bylo povoleno třídění pohledů, jaký by měl být výsledek?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 
9
Martin Smith

jednou z možností je vyhnout se konfliktním druhům - pokud je pohled tříděn podle jednoho pořadí a výběr v tomto pohledu je tříděn podle jiného pořadí (není si vědom třídění pohledu), může dojít k výkonu. Je tedy bezpečnější nechat požadavek na třídění na uživateli.

dalším důvodem je, že řazení je spojeno s výkonem, takže proč penalizuje všechny uživatele zobrazení, když jen někteří uživatelé potřebují řazení.

7
srini.venigalla

ANSI SQL umožňuje pouze ORDER BY na nejvzdálenější dotaz z různých důvodů, jedním z nich je to, co se stane, když je subselect/view/CTE připojen k jiné tabulce a vnější dotaz má ORDER BY sám.

SQL server jej nikdy nepodporoval uvnitř pohledu (pokud jste jej nepokoušeli pomocí TOP 100 PERCENT což podle mého názoru většinou způsobuje chybu).

I když jste spustili chybu, výsledky nikdy nebyly spolehlivé a třídění ne vždy vyšlo tak, jak jste očekávali.

Kompletní technické vysvětlení naleznete v tomto blogovém příspěvku týmu Optimalizátor dotazů TOP 100% OBJEDNÁVKA Zvažováno Škodlivé.

Výchozí implementace plánu pro tento kód se stane řadením řádků v rámci provádění operace TOP. Často to znamenalo, že se výsledky náhodně vrátily v seřazeném pořadí, a to vedlo zákazníky k tomu, aby věřili, že existuje záruka, že budou řádky tříděny. Ve skutečnosti tomu tak není. Pokud chcete, aby byly řádky vráceny uživateli v seřazeném pořadí, musíte použít OBJEDNÁVKU BY v nejvzdálenějším bloku dotazů (na ANSI), abyste zajistili pořadí prezentace prezentace.

Pohledy se chovají jako tabulky, jejichž obsah je určen výsledky dotazu.

Tabulky nemají pořádek; jsou to jen pytle řádků.

Proto ani pohledy nemají pořadí. Můžete je však řadit výběrem řádků v konkrétním OBJEDNÁVKU.

3