NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: SQL - Hledání 1 záznamu z XYZ totožných v tabulce s 1M záznamy

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Neaktivní uživatel:25.2.2018 3:47

Hoj,

příklad:

Mám tabulku s články(dejme tomu, že je tam 1M článku), každý článek má bool field "enabled". Každý zapnutý článek = enabled = true.
Potřebují SQL skript, který začne prohledávát tabulku s články a když narazí na první článek který má enabled = true, aby se zastavil.

SELECT TOP 1 *
FROM Articles
WHERE enabled = true

Nevyhovuje, protože to projde všechny články a vratí 1 záznam. = prohledá 1m záznamů.
Já potřebují aby se to zastavilo hned jak narazí na první vyhovujíci článek. = prohledá +- 10 záznamů.

Neřešil to náhodou někdo?
Je to vůbec možné?

Editováno 25.2.2018 3:48
Odpovědět
25.2.2018 3:47
Neaktivní uživatelský účet
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:25.2.2018 8:47

Nie som síce nejako zvlásť zbehlý v SQL, ale neskúšal si použiť FETCH FIRST?
https://www.ibm.com/…tclause.html

Nahoru Odpovědět
25.2.2018 8:47
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:25.2.2018 13:33

Inak, prečo tvoja query prechádza všetky články? Vo Visual Studiu sa dá zobraziť execution plan a u mňa mi pri SELECT TOP 1 tvrdí, že naozaj prečíta len 1 záznam (to isté aj pri whereovanom dopyte).

https://prnt.sc/ijhbc3

Nahoru Odpovědět
25.2.2018 13:33
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Neaktivní uživatel:25.2.2018 14:35

No Navicat mi ukazuje stejný počet záznámu a stejný execution time:

SELECT TOP 1 *
FROM Articles
WHERE enabled = true

a

SELECT *
FROM Articles
WHERE enabled = true

Koukal jsem se na W3Schools a píše se tam:

The SELECT TOP clause is used to specify the number of records to return.

To by i sedělo s tím co mi ukazuje navicat, tedy přečte vše a vráti 1. Takže jsem z toho teď zmatený :D

Editováno 25.2.2018 14:38
Nahoru Odpovědět
25.2.2018 14:35
Neaktivní uživatelský účet
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Neaktivní uživatel
Marek Uhlik:25.2.2018 19:39

Zkus Limit 1, ten by měl dělat to co chceš.

 
Nahoru Odpovědět
25.2.2018 19:39
Avatar
Ondřej Crha
Člen
Avatar
Ondřej Crha:26.2.2018 16:05

LIMIT použít nemůže. Používá TOP, z toho usuzuju, že jede na MSSQL, ne na MySQL.

@Bogdan: Ať mě případně někdo opraví, ale je jedno, jak omezíš počet výsledků, protože procesor postupuje:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

Schválně jsem si zkusil TOP 1 omezený WHERE z tabulky s 10 záznamy, pak znovu to samé, ale s 60M(!) záznamy, rozdíl byl naprosto zanedbatelný (v řádu jednotek ms).

 
Nahoru Odpovědět
26.2.2018 16:05
Avatar
plelovsky
Člen
Avatar
plelovsky:27.2.2018 8:04

Dotaz nemá smysl, protože jazyk SQL je deklarativní, tj. specifikuji co chci dostat, a ne jak.
Společně s TOP lze použít ORDER BY a mít příslušné indexy.

 
Nahoru Odpovědět
27.2.2018 8:04
Avatar
Odpovídá na plelovsky
Neaktivní uživatel:27.2.2018 12:36

To jsem potřeboval vědět, jestli to jde pomocí SQL.
Takže to budu muset nechat zatím takto, a potom přemýšlet jak to udělat lépe :)

Nahoru Odpovědět
27.2.2018 12:36
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.