DB вопрос

Все, что вы хотели знать о программизме, но боялись спросить.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Re: DB вопрос

Сообщение StS »

alpax писал(а):А зачем два селекта? По-моему этого будет достаточно:
SELECT 1 from transaction
WHERE Id=1
limit 1

Кстати, а "TOP #" есть только в MS SQL или это более распространенная опция? Насчет синтаксиса правда сомневаюсь - что-то типа такого:
SELECT top 1 1 FROM transaction WHERE Id=1

(эх, давно не брал я в руки сиквел :))
Действительно, зачем? Так даже еще лучше.

The clauses DISTINCT ON, LIMIT, and OFFSET are not defined in the SQL standard.
http://www.postgresql.org/docs/8.3/inte ... elect.html
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: DB вопрос

Сообщение папа Карло »

нда.... ну народ и раздул флейм...

if exists (select top 1 1 from table where id = 1)
Аватара пользователя
Marmot
Графоман
Сообщения: 39283
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Re: DB вопрос

Сообщение Marmot »

папа Карло писал(а):нда.... ну народ и раздул флейм...

if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: DB вопрос

Сообщение папа Карло »

Marmot писал(а):
папа Карло писал(а):нда.... ну народ и раздул флейм...

if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
t-sql... а ему чего надо?
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

папа Карло писал(а):
Marmot писал(а):Это на каком диалекте?
t-sql... а ему чего надо?
не, не так:

t-sql... а разве еще какие бывают? :mrgreen:
Аватара пользователя
Marmot
Графоман
Сообщения: 39283
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Re: DB вопрос

Сообщение Marmot »

папа Карло писал(а):
Marmot писал(а):
папа Карло писал(а):нда.... ну народ и раздул флейм...

if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
t-sql... а ему чего надо?
PostgreSQL, но хотелось бы стандартное решение.
Тоже мне, "манагер", читать не умеет :)
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

Marmot писал(а):Тоже мне, "манагер", читать не умеет :)
манагер прежде всего говорить должен уметь, а читать уж как получится :mrgreen2:
Аватара пользователя
sobomax
Маньяк
Сообщения: 3699
Зарегистрирован: 29 июн 2006, 22:53
Откуда: Vancouver

Re: DB вопрос

Сообщение sobomax »

select exists(select id from table where id=1 limit 1);

Будет true/false, если надо 1/0 то можно обернуть в case when (http://www.postgresql.org/docs/8.3/stat ... ional.html).

-Maxim
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
Аватара пользователя
sobomax
Маньяк
Сообщения: 3699
Зарегистрирован: 29 июн 2006, 22:53
Откуда: Vancouver

Re: DB вопрос

Сообщение sobomax »

Yury писал(а):
sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
В моем запросе разницы большой не будет. Выбирать одно поле или несколько должно быть все равно.

Если говорит про оригинальный вопрос с count(*), в случае если по id есть индекс то заметной разницы между вариантом с count() и вариантом с exists() в принципе тоже быть не должно. Однако если результат запроса будет использоваться в более сложном селекте то exists() теоретически лучше потому что он позволит оптимизатору "понять" что именно требуется и оптимизировать запрос на более высоком уровне. В случае если там будет функция count() этот самый count() скорее всего будет для оптимизатора "черным ящиком", то есть в случае если возвращаемое значение используется в другом where или join он будет исполнен много раз снова и снова вызывая торможение.

-Maxim
Аватара пользователя
Yury
The L'ony
Сообщения: 26202
Зарегистрирован: 22 янв 2004, 13:48
Откуда: Мирный -> Vancouver
Контактная информация:

Re: DB вопрос

Сообщение Yury »

sobomax писал(а):
Yury писал(а):
sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
В моем запросе разницы большой не будет. Выбирать одно поле или несколько должно быть все равно.

Если говорит про оригинальный вопрос с count(*), в случае если по id есть индекс то заметной разницы между вариантом с count() и вариантом с exists() в принципе тоже быть не должно. Однако если результат запроса будет использоваться в более сложном селекте то exists() теоретически лучше потому что он позволит оптимизатору "понять" что именно требуется и оптимизировать запрос на более высоком уровне. В случае если там будет функция count() этот самый count() скорее всего будет для оптимизатора "черным ящиком", то есть в случае если возвращаемое значение используется в другом where или join он будет исполнен много раз снова и снова вызывая торможение.

-Maxim
спасибо,
я и имел в виду твой вариант (он же мой :D, почти)
Аватара пользователя
Algor
Маньяк
Сообщения: 1355
Зарегистрирован: 14 мар 2006, 01:38
Откуда: Самара->Ванкувер

Re: DB вопрос

Сообщение Algor »

sobomax писал(а): Если говорит про оригинальный вопрос с count(*), в случае если по id есть индекс то заметной разницы между вариантом с count() и вариантом с exists() в принципе тоже быть не должно. Однако если результат запроса будет использоваться в более сложном селекте то exists() теоретически лучше потому что он позволит оптимизатору "понять" что именно требуется и оптимизировать запрос на более высоком уровне. В случае если там будет функция count() этот самый count() скорее всего будет для оптимизатора "черным ящиком", то есть в случае если возвращаемое значение используется в другом where или join он будет исполнен много раз снова и снова вызывая торможение.

-Maxim
Да здесь и сравнивать не нужно, однозначно exists будет работать оптимальнее, так как идет поиск в базе до только первой записи удовлетворяющей условию, далее идет выход true, и никаких дополнительных поисков и операций как в случае с использованием in (..) или count(*)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: DB вопрос

Сообщение папа Карло »

Marmot писал(а):Тоже мне, "манагер", читать не умеет :)
дык за это и промотят :)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: DB вопрос

Сообщение папа Карло »

Yury писал(а):
sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
при современных оптимайзерах скорее всего нет... но(!) когда код пишет таким образом то оптимайзеру просто не оставляют выбора на "фантазию", чтобы не переоптимизировал :) но вообще ты прав вопрос более теоретический :)
Аватара пользователя
Marmot
Графоман
Сообщения: 39283
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Re: DB вопрос

Сообщение Marmot »

папа Карло писал(а):
Marmot писал(а):Тоже мне, "манагер", читать не умеет :)
дык за это и промотят :)
Ага, теперь понятно, как получилось такое чудо, как Стив :)
Ответить