it-swarm-eu.dev

Jsou pohledy optimalizovány, když k nim přidám klauzuli WHERE?

Je to důležité, pokud filtrujete pohled uvnitř nebo mimo pohled?

Existuje například rozdíl mezi těmito dvěma dotazy?

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Nebo

SELECT Id
FROM MyView
WHERE SomeColumn = 1

A MyView je definován jako

SELECT Id, SomeColumn
FROM MyTable

A je odpověď jiná, pokud je zdrojová tabulka umístěna na propojeném serveru?

Ptám se, protože musím dotazovat velkou tabulku (44 mil řádků) dvakrát z propojeného serveru a získat souhrn výsledků. Chci vědět, jestli bych měl vytvořit dva pohledy pro přístup k datům, jeden pro každý dotaz, nebo jestli se mohu dostat pryč s jediným pohledem a klauzulí WHERE.

30
Rachel

Měli byste vidět absolutně žádný rozdíl v plánech nebo výkonu mezi těmito dvěma možnostmi. Po zobrazení dotazu se rozbalí na dotaz proti základní tabulce, což znamená, že bude použito stejné vyhledávání nebo skenování.

Nyní, v závislosti na typu dat a selektivitě MyColumn, pokud byste chtěli vytvořit filtrovaný index na základní tabulce (při přechodu na SQL Server 2008+), můžete získat lepší výkon, ale to opět nesmí se lišit pohledem nebo bez.

14
Aaron Bertrand

Zde je jen rychlý příklad, který ukazuje, že by neměl být žádný rozdíl. Databáze je databáze AdventureWorks.

Definice dvou pohledů:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

Zde by byl první dotaz s klauzulí WHERE zahrnutou do definice pohledu:

select *
from person.vContactWhere

Zde je plán provedení:

enter image description here

A druhý dotaz s klauzulí WHERE není v definici pohledu, ale v dotazu SELECT:

select *
from person.vContactNoWhere
where ContactID = 24

Zde je tento plán provedení:

enter image description here

Jak můžete vidět z těchto plánů provádění, jsou totožné se stejnými výsledky. Nevím o situaci, kdy by tento typ logiky/designu měl jiné výsledky. Takže bych byl ochoten říci, že jste v každém případě v bezpečí, a jít s osobními preferencemi (nebo obchodními postupy).

6
Thomas Stringer

Na základě whatI'mreading , SQL použije standardní standard, jako dílčí dotaz, při určování plánu provádění.

Takže pomocí mého příkladu dotazu,

SELECT Id
FROM MyView
WHERE SomeColumn = 1

kde MyView je definován jako

SELECT Id, SomeColumn
FROM MyTable

měl by generovat stejný plán provádění jako

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

ale tento plán provádění se může lišit od plánu, který by byl vytvořen

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Nejsem si jistý, zda by tato odpověď byla stejná pro Indexovaná zobrazení

2
Rachel