Простая оптимизация запросов - PullRequest
1 голос
/ 29 октября 2010

Эй, ребята, простите, если это слишком простой вопрос. Я в основном хочу подсчитать количество мужчин и женщин в базе данных. Поэтому я знаю, что два простых запроса выполнят это, например:

select count(*) from table where gender='male'
select count(*) from table where gender='female'

Однако это кажется очень неэффективным, поскольку я знаю, что оба приведенных ниже запроса - это один и тот же запрос:

select count(*) from table where gender='female'
select count(*) from table where gender<>'male'

Есть ли оптимальный способ получения этой информации, без необходимости проходить каждую строку в базе данных дважды?

Ответы [ 7 ]

9 голосов
/ 29 октября 2010

Вы также можете использовать GROUP BY:

SELECT gender, Count(1) as genderCount
FROM   table
GROUP BY gender

Это приведет к чему-то вроде этого:

gender       genderCount

Male         10

Female       15
5 голосов
/ 29 октября 2010
select sum(case when gender='male' then 1 end) as MaleCount,
    sum(case when gender='female' then 1 end) as FemaleCount
from table
4 голосов
/ 29 октября 2010

Вы можете использовать группу по предложению.

select gender, count(gender) from table group by gender;
1 голос
/ 29 октября 2010

Да, вместо этого используйте оператор case.

SELECT
    COUNT(CASE gender WHEN 'male'   then 1 END) AS Males
    COUNT(CASE gender WHEN 'female' then 1 END) AS Females
FROM table
0 голосов
/ 29 октября 2010

@ redfilter: если таблица не содержит записей, ваш запрос будет просто возвращать NULL-значения, а не 0 (как целое число)

0 голосов
/ 29 октября 2010

Что ж, RedFilter и erwin atuli, вероятно, дали ответ на ваш вопрос, но если вы просто обеспокоены производительностью, то вам следует поместить индекс в столбец пола, и производительность этих запросов должна быть хорошей, так что вы можетевыполнить их несколько раз.

Если вы используете oracle, то для индексации данных такого типа следует использовать Bitmap Index.

Многие базы данных кэшируют такие результаты агрегирования в любом случае.

0 голосов
/ 29 октября 2010
(select count(*) from table where gender='male')
UNION
(select count(*) from table where gender='female')

первый ряд - мужчины, второй ряд - женщины ...

...