Получение отсчета от больших таблиц - PullRequest
2 голосов
/ 22 февраля 2012

Я пытался получить счет из таблицы с миллионами записей.Мой запрос выглядит примерно так:

Select count(*)
from Users
where status = 'A' and office_id = '000111' and user_type = 'C'

Состояние может быть A или C, Тип пользователя может быть C или R. Статус, Office_id и User_type являются строками

Результат имеет около 10 миллионовстроки, и это занимает много времени.Я просто хочу общее количество.

Был бы признателен, если бы кто-нибудь мог сказать мне, почему это занимает так много времени, и обходной путь, если таковой имеется.

Сообщите мне, если потребуется какая-либо дополнительная информация.ядром базы данных является Oracle 11g

Редактировать: I Добавлен индекс для всех трех столбцов.Все еще нет улучшения.Также пробовал приведенный ниже запрос, но он всегда возвращает общее количество в таблице без проверки условий.

SELECT COUNT(office_id_key) 
FROM Users
WHERE EXISTS (SELECT * FROM Users WHERE status = 'A' AND office_id = '000111' AND user_type = 'C')

Ответы [ 4 ]

4 голосов
/ 22 февраля 2012

Почему бы просто не создать индексы в таблице для age и place, тогда ваш поиск будет быстрее, чем просто сканирование всей таблицы на предмет этих значений.

CREATE INDEX age_index ON Employee(age);
CREATE INDEX place_index ON Employee(place);

Это должно ускорить процесс.

ИЗМЕНЕНО НА ОСНОВЕ ИЗМЕНЕНИЯ ЗАПРОСА

CREATE INDEX status_index ON Users(status);
CREATE INDEX office_id_index ON Users(office_id);
CREATE INDEX user_type_index ON Users(user_type);
2 голосов
/ 22 февраля 2012

Вы хотите создать следующий многостолбцовый индекс для таблицы Users, чтобы улучшить запрос:

(office_id, status, user_type)

База данных может использовать «покрывающий» индекс с COUNT(*).Создайте индекс со столбцами в указанном порядке из-за количества элементов.

0 голосов
/ 22 февраля 2012

count (1) работает быстрее, чем count (*)

0 голосов
/ 22 февраля 2012

После добавления индексов, я думаю, что изменение где, где существует, и подзапрос также может помочь.

Edit2: удалено существует, поскольку оно возвращало все допустимые, обычно подзапрос имеет несколько объединений, но я предполагаю, что в случае с одной таблицей возвращается все true.Я прочитал, что счетчик оптимизирован, чтобы действовать аналогично существующему, когда в нем только одна таблица, а не условие where, поэтому я рассматриваю результаты как таблицу.Надеюсь, это даст такие же быстрые результаты.

select count(1) from
(select 1 from Employee where age = '25' and place = 'bricksgate')

Редактировать: Когда вы используете «где существует», сервер БД не загружает ваши данные в память, а также использует преимущества индексов, потому что вы будете читать значения из индексов, не делая дорогостоящий поиск таблиц,Вы также можете изменить count (*) на count (place) - таким образом, он также ограничит поля индексированным полем.

В исходном запросе ваши данные выполняли поиск в таблице, а затем загружалиих в память, чтобы их просто посчитали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...