Страница 2 из 3
Re: DB вопрос
Добавлено: 27 май 2008, 14:19
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
Re: DB вопрос
Добавлено: 27 май 2008, 15:32
папа Карло
нда.... ну народ и раздул флейм...
if exists (select top 1 1 from table where id = 1)
Re: DB вопрос
Добавлено: 27 май 2008, 15:42
Marmot
папа Карло писал(а):нда.... ну народ и раздул флейм...
if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
Re: DB вопрос
Добавлено: 27 май 2008, 15:53
папа Карло
Marmot писал(а):папа Карло писал(а):нда.... ну народ и раздул флейм...
if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
t-sql... а ему чего надо?
Re: DB вопрос
Добавлено: 27 май 2008, 15:55
Yury
папа Карло писал(а):Marmot писал(а):Это на каком диалекте?
t-sql... а ему чего надо?
не, не так:
t-sql... а разве еще какие бывают?

Re: DB вопрос
Добавлено: 27 май 2008, 15:56
Marmot
папа Карло писал(а):Marmot писал(а):папа Карло писал(а):нда.... ну народ и раздул флейм...
if exists (select top 1 1 from table where id = 1)
Это на каком диалекте?
t-sql... а ему чего надо?
PostgreSQL, но хотелось бы стандартное решение.
Тоже мне, "манагер", читать не умеет

Re: DB вопрос
Добавлено: 27 май 2008, 15:57
Yury
Marmot писал(а):Тоже мне, "манагер", читать не умеет

манагер прежде всего говорить должен уметь, а читать уж как получится

Re: DB вопрос
Добавлено: 27 май 2008, 16:12
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
Re: DB вопрос
Добавлено: 27 май 2008, 16:20
Yury
sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
Re: DB вопрос
Добавлено: 27 май 2008, 16:56
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
Re: DB вопрос
Добавлено: 27 май 2008, 18:45
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
спасибо,
я и имел в виду твой вариант (он же мой

, почти)
Re: DB вопрос
Добавлено: 27 май 2008, 19:04
Algor
sobomax писал(а): Если говорит про оригинальный вопрос с count(*), в случае если по id есть индекс то заметной разницы между вариантом с count() и вариантом с exists() в принципе тоже быть не должно. Однако если результат запроса будет использоваться в более сложном селекте то exists() теоретически лучше потому что он позволит оптимизатору "понять" что именно требуется и оптимизировать запрос на более высоком уровне. В случае если там будет функция count() этот самый count() скорее всего будет для оптимизатора "черным ящиком", то есть в случае если возвращаемое значение используется в другом where или join он будет исполнен много раз снова и снова вызывая торможение.
-Maxim
Да здесь и сравнивать не нужно, однозначно exists будет работать оптимальнее, так как идет поиск в базе до только первой записи удовлетворяющей условию, далее идет выход true, и никаких дополнительных поисков и операций как в случае с использованием in (..) или count(*)
Re: DB вопрос
Добавлено: 27 май 2008, 22:11
папа Карло
Marmot писал(а):Тоже мне, "манагер", читать не умеет

дык за это и промотят

Re: DB вопрос
Добавлено: 27 май 2008, 22:14
папа Карло
Yury писал(а):sobomax писал(а):select exists(select id from table where id=1 limit 1)
максим, скажи мне как геолог геологу - в плане производительности будет разница между select id и select * в вышеприведенном коде?
чисто теоретический интерес, для моих таблиц что так, что так моргнуть не успеваю
при современных оптимайзерах скорее всего нет... но(!) когда код пишет таким образом то оптимайзеру просто не оставляют выбора на "фантазию", чтобы не переоптимизировал

но вообще ты прав вопрос более теоретический

Re: DB вопрос
Добавлено: 27 май 2008, 22:14
Marmot
папа Карло писал(а):Marmot писал(а):Тоже мне, "манагер", читать не умеет

дык за это и промотят

Ага, теперь понятно, как получилось такое чудо, как Стив
