2011-07-05 11 views
7

Czy baza danych przerwie pętlę wyboru tak szybko, jak ma jeden rekord podczas korzystania z Top 1?Top 1 szybciej, jeśli wybierzesz tylko jeden wiersz

Więc select top 1 * from customer where cusId = 1234

jest szybszy niż select * from customer where cusId = 1234 ?

cusId jest wyjątkowy, więc czy MSSql rozumie, aby zrobić to "szybciej" bez top 1?

+1

WITH (FASTFIRSTROW) może pomóc * czasami *. Często zdarza się, że mam: Z (NOLOCK FASTFIRSTROW), gdy brudne odczyty są dopuszczalne. – SQLMason

+1

Podejrzewam, że uzyskasz bardziej zauważalną wydajność i wzrost łatwości utrzymania, ponieważ nie używasz * (nawet jeśli używasz wszystkich kolumn) i poprawnie powołujesz się na klienta (dbo.customer), niż martwiąc się o dodanie tego nieistotnego operatora do zapytania. –

Odpowiedz

4

Jeśli klucz cusId jest kluczem podstawowym, oba powinny mieć takie same parametry: wydajność.

EDIT:

możliwość dodawania tylko napowietrznych z TOP 1, jeśli masz unikatowy indeks że wróci 1 wynik i tak.

Będzie inaczej, jeśli zamówisz coś, niż jesteś zainteresowany tylko jednym rzędem.

WIĘCEJ:

Nie ma zapętlenie zaangażowany, o ile nie jest zaangażowany skanowanie tabeli i nie ma w ogóle indeksu dla cusId. W takim przypadku, TOP 1 i tak nie może ci pomóc.

+0

Co zrobić, gdy 'cusIs' nie jest kluczem podstawowym? –

+4

+1 - jeśli porównasz plany wykonania, "góra" ma dodatkowy krok, ale koszt jest zbyt mały, aby je policzyć. –

0

Moim zdaniem select * from customer where cusId = 1234 będzie bardziej faster..b/c ma jedną operację wykonać mniej niż pierwszy ...

+0

To prawda, ale różnica jest tak mała (ponieważ cusId jest unikalna), którą można zignorować. – Kamyar

Powiązane problemy