it-swarm-eu.dev

Logické operátory OR AND A ve stavu a pořadí podmínek v KDE)

Podívejme se na tato dvě tvrzení:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Pokud CONDITION 1 je TRUE, bude CONDITION 2 být zkontrolováno?
Pokud CONDITION 3 je FALSE, bude CONDITION 4 být zkontrolováno?

A co podmínky pro WHERE: optimalizuje stroj SQL Server všechny podmínky v klauzuli WHERE? Pokud programátoři umístí podmínky do práva , aby se ujistili, že jej optimalizátor serveru SQL vyřeší v pravém pravém způsobem?

PŘIDAT:

Děkuji Jackovi za odkaz, překvapení z kódu t-sql:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

V tomto případě nevzniká výjimka dělení nulou .

ZÁVĚR:

Pokud má C++/C #/VB zkrat, proč to nemůže mít SQL Server?

Abychom na to skutečně odpověděli, podívejme se, jak oba pracují s podmínkami. Všechny C++/C #/VB mají zkraty definované ve specifikacích jazyka, aby se urychlilo provádění kódu. Proč se obtěžovat s vyhodnocováním podmínek N OR), když první z nich je již pravdivý, nebo podmínek M AND, když je první z nich již nesprávný.

My jako vývojáři si musíme být vědomi, že SQL Server funguje jinak. Jedná se o systém založený na nákladech. Abychom získali optimální plán provádění pro náš dotaz, musí procesor dotazů vyhodnotit každou podmínku a přiřadit mu cenu. Tyto náklady jsou pak vyhodnoceny jako celek, aby vytvořily práh, který musí být nižší než definovaný práh, který má SQL Server pro dobrý plán. Pokud jsou náklady nižší než definovaná prahová hodnota, použije se plán, pokud ne, celý proces se opakuje znovu s jinou kombinací nákladů na podmínky. Náklady zde jsou buď skenování nebo vyhledávání nebo sloučení spojení nebo spojení hash atd. Z tohoto důvodu není zkratování, jaké je k dispozici v C++/C #/VB, jednoduše nemožné. Můžete si myslet, že nutit použití indexu ve sloupci se počítá jako zkrat, ale ne. Vynucuje pouze použití tohoto indexu a tím zkracuje seznam možných prováděcích plánů. Systém je stále založen na nákladech.

Jako vývojář si musíte být vědomi, že SQL Server nedělá zkrat, jako je tomu v jiných programovacích jazycích, a není nic, co byste mohli udělat, abyste jej donutili.

35
garik

Na serveru SQL Server není žádná záruka, pokud nebo v jakém pořadí budou příkazy zpracovány v klauzuli WHERE. Jediný výraz, který umožňuje zkratování příkazu, je CASE-WHEN. Toto je z odpovědi, kterou jsem zveřejnil na Stackoverflow:

Jak SQL Server zkratuje WHERE vyhodnocení stav

Dělá to, když se vám to líbí, ale ne způsobem, na který si okamžitě vzpomenete.

Jako vývojář si musíte být vědomi toho, že SQL Server neprovádí zkratování jako v jiných programovacích jazycích a není nic, co můžete udělat, abyste to donutili .

Pro další podrobnosti zkontrolujte první odkaz ve výše uvedené položce blogu, který vede k jinému blogu:

Má SQL Server zkrat?

Konečný rozsudek? No, já ještě žádný nemám, ale je asi bezpečné říci, že jediný čas, kdy můžete zajistit konkrétní zkrat, je, když vyjádříte více WHEN podmínek v CASE výrazu . Se standardními booleovskými výrazy optimalizátor posouvá věci tak, jak uzná za vhodné, na základě tabulek, indexů a dat, na která se dotazujete.

27
MicSim

SQL je deklarativní programovací jazyk. Na rozdíl od toho, řekněme, C++, což je imperativní programovací jazyk.

Tj. můžete to říct co chcete v konečném výsledku, ale nemůžete diktovat jak výsledek se provádí, je to všechno až do motoru.

Jediný skutečný způsob, jak zaručit „zkratování“ (nebo jakýkoli jiný řídicí tok ) uvnitř WHERE, je použití indexovaných pohledů, dočasných tabulky a podobné mechanismy.

PS. Můžete také použít rady pro provádění plánu („naznačit“ motor, jak provést dotaz, které indexy použít a jak je používat), jen jsem si myslel, že bych to měl zmínit, zatímco jsme na toto téma ...

0
jitbit