Najszybszy sposób określenia, czy wpis istnieje


Jak sama nazwa wskazuje ... staram się znaleźć najszybszy i najtańszy sposób na ustalenie, czy rekord istnieje w tabeli, czy nie.
Prośba o próbkę:
SELECT COUNT(*) FROM products WHERE products.id = ?; vsSELECT COUNT(products.id) FROM products WHERE products.id = ?; vsSELECT products.id FROM products WHERE products.id = ?;

Powiedzmy, że
?
zamienił miejscami z
'TB100'
... zarówno pierwsze, jak i drugie zapytanie zwróci dokładnie ten sam wynik (powiedzmy ...
1  dla tej rozmowy). Ostatnie zapytanie zwróci[code]„TB100”
zgodnie z oczekiwaniami lub nic, jeśli
id
nie znajduje się w tabeli. [/code]Celem jest sprawdzenie, czy
id
znajduje się w tabeli, czy nie. Jeśli nie, to program wstawi następny rekord, jeśli taki istnieje, to pominie go lub wykona zapytanie UPDATE w oparciu o inną logikę programu poza zakresem tego pytania.
Który jest szybszy i mniejszy? (Powtarza się to dziesiątki tysięcy razy na uruchomienie programu i będzie uruchamiane wiele razy dziennie).
(Wykonywanie tego zapytania do serwera M $ SQL z języka Java za pośrednictwem sterownika JDBC dostarczonego przez M $)
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

ISTNIEJE
(lub
NIE ISTNIEJE
) jest specjalnie zaprojektowany do sprawdzania, czy coś istnieje i dlatego powinien być (i jest) najlepszą opcją. Zatrzyma się na pierwszym pasującym wierszu, więc nie wymaga klauzuli
TOP
i w rzeczywistości nie zawiera żadnych wybranych danych, więc nie ma narzutu rozmiaru kolumny. Możesz bezpiecznie użyć
SELECT *
tutaj - nie różni się to od
SELECT 1
,
SELECT NULL
czy
SELECT AnyColumn
.. ...

(możesz nawet użyć nieprawidłowego wyrażenia, takiego jak
SELECT 1/0
, i nie ulegnie ono zerwaniu)
http://www.sqlfiddle.com/#!6/d41d8/6290
.
IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

SELECT TOP 1 products.id FROM products WHERE products.id = ?;
przejmie wszystkie Twoje sugestie, ponieważ przestanie działać po znalezieniu pierwszego rekordu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nic nie może wygrać -
SELECT TOP 1 1 FROM products WHERE id = 'some value';

Nie musisz liczyć, aby wiedzieć, czy w tabeli są dane. I nie używaj aliasu, gdy nie musisz.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

SELECT CASE WHEN EXISTS (SELECT TOP 1 *
FROM dbo.[YourTable]
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END

To podejście zwraca wartość logiczną dla Ciebie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz także użyć
If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END ELSE
BEGIN
--<Do something>
END
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie zakładaj, że ktoś o tym wspomniał, ale jeśli masz pewność, że dane pod tobą się nie zmienią, możesz również zastosować wskazówkę NoLock, aby upewnić się, że nie blokuje się podczas czytania.
SELECT CASE WHEN EXISTS (SELECT 1 
FROM dbo.[YourTable] WITH (NOLOCK)
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

SELECT COUNT(*) FROM products WHERE products.id = ?;

Jest to cross-relacyjne rozwiązanie bazodanowe, które działa we wszystkich bazach danych.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniżej znajduje się najprostszy i najszybszy sposób określenia, czy rekord istnieje w bazie danych, czy nie
Dobrze, że działa we wszystkich relacyjnych bazach danych
SELECT distinct 1 products.id FROM products WHERE products.id = ?;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
when no_data_found then
dbms_output.put_line(i||' does not exists');end;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używałem tego w przeszłości i nie wymaga pełnego skanowania tabeli, aby sprawdzić, czy coś istnieje. Jest bardzo szybki ...
UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
--Do work
END
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla tych, którzy natkną się na to w tle MySQL lub Oracle - MySQL obsługuje klauzulę LIMIT do wybierania na ograniczonej liczbie rekordów, podczas gdy Oracle używa ROWNUM.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się