2016-05-24 5 views
20

natknąłem to pytanie:Will "Gdzie 0 = 1" analizować pełną tabelę lub po prostu wrócić nazwy kolumn

SQL Server: Select Top 0?

Chcę zapytać, czy mogę używać kwerendy

SELECT * FROM table WHERE 0=1 

lub

SELECT TOP 0 * FROM table 

czy natychmiast zwróci tylko nazwy kolumn, czy też będzie dalej analizował cały stół i na koniec zwraca zero wyników?

Mam stół produkcyjny z 10.000 rzędami - czy sprawdzi on stan WHERE w każdym rzędzie?

+10

optymalizator kwerendy SQL Server jest wystarczająco inteligentny, aby zobaczyć, że 'gdzie 0 = 1 'może nigdy *** *** mogło być prawdziwe, a tym samym nie przeszkadza sprawdzenia wszelkich wierszy - bez sensu .... –

+0

co z innymi serwerami, takimi jak Oracle, czy są one zbyt inteligentne? – Friendy

+4

Większość z nich, jeśli nie wszystkie, to prawdopodobnie ... –

Odpowiedz

30

SQL Server optymalizator kwerendy jest wystarczająco inteligentny, aby dowiedzieć się, że ten stan może WHEREnigdy produkować true wynik na każdym rzędzie, więc nie przeszkadza faktycznie przeszukiwanie tabeli.

Jeśli spojrzeć na rzeczywisty plan wykonania dla takiego zapytania, to łatwo zauważyć, że nic jest zrobione i kwerenda zwraca natychmiast:

enter image description here

+0

Witaj @Marc_S, link do obrazu nie działa teraz. więc proszę, możesz to zaktualizować. – Ajay2707

+1

@ Ajay2707 to tam jest. Co masz na myśli mówiąc "nie działa"? – zerkms

+0

@ Ajay2707: to nie jest link - to tylko zwykły zrzut ekranu .... –

2

Zarówno zapytanie służy do coraz pusty zestaw stołowy;

SELECT TOP 0 * FROM table 
SELECT * FROM table WHERE 0=1 

jak również dla osiągnięcia poniżej rzeczy:

  1. Aby uzyskać taką samą strukturę nazwy kolumny
  2. używana do szczegółów kolumn powrót, ale nie dane
  3. i chcą zapytanie do sprawdzenia łączności
+0

Tak, jestem już przy użyciu że ładowności do poszukiwania Widget pokazując dane zerowe ale nazwy kolumn, byłem tylko martwi będzie analizować pełny tabeli lub nie. – Friendy

+0

po prostu zwraca nazwę kolumny, więc nie martw się o użycie 0 = 1. –

5

W zapytaniu

SELECT * FROM table WHERE 0=1 

Klauzula WHERE nigdy nie będzie prawdziwa, więc SQL Server nie będzie skanował całej twojej tabeli.

I w zapytaniu

SELECT TOP 0 * FROM table 

jesteś określające TOP 0 więc SQL Server jest bardzo inteligentny, więc nigdy nie skanuje tabeli powrocie 0 wierszy.

Oba zapytania zwrócą tylko nagłówki kolumn.

15

MySql jest wystarczająco inteligentny, aby go wykryć i wiedzieć, że jest niemożliwy do wykonania.

desc SELECT * FROM table WHERE 0=1; 

enter image description here

+0

super dzięki za dodatkową odpowiedź :) – Friendy