Спящий запрос для извлечения записей занимает много времени

Я пытаюсь получить набор записей из таблицы. Я использую запрос:

select * from EmployeeUpdates eu where eu.updateid>0 and eu.department = 'EEE' 

Таблица EmployeeUpdates содержит около 20 миллионов записей. 'updateid' является первичным ключом, и в настоящее время в таблице нет записей с отделом 'EEE'. Но запрос занимает много времени, из-за чего время вызова веб-сервиса истекает.

В настоящее время у нас есть индекс только для столбца «updateid». «Отдел» — это новый столбец, для которого мы ожидаем записи «EEE».

Какие изменения я могу внести, чтобы получить результаты быстрее?


person Chillax    schedule 28.01.2014    source источник
comment
Создайте индекс с помощью (department,updated). Или разделите, используя идентификатор отдела в качестве ключа (если там меньше отделов)   -  person Maheswaran Ravisankar    schedule 28.01.2014


Ответы (2)


Во-первых, ваш sql недействителен, похоже, вам не хватает «и» между двумя условиями.

Я предполагаю, что все идентификаторы обновлений положительны, и поскольку это первичный ключ, они уникальны, поэтому я подозреваю, что eu.updateid>0 соответствует каждой строке. Это означает, что технически это не сканирование табличного пространства, а сканирование на основе индекса, хотя, если это сканирование содержит все 20 миллионов строк после сопоставления с индексом, вы также можете провести сканирование табличного пространства. Единственное, что вы действительно можете сделать, это добавить индекс к полю отдела. В зависимости от того, что это за данные, вы можете разместить их в отдельной таблице с числовым первичным ключом, а затем сохранить их как внешний ключ в таблице eu. Это означало бы, что вы просканировали все отделы, а затем получили связанные с ними обновления, а не искали каждое отдельное обновление для определенного отдела.

person M21B8    schedule 28.01.2014
comment
обновил мой вопрос с помощью «и». Кроме того, на данный момент есть только два отдела. Все записи в таблице теперь имеют отдел как «EC». В будущем мы будем получать записи «EEE» - person Chillax; 28.01.2014

Я думаю, вам следует изучить использование сопоставления таблицы для подкласса (подробнее здесь: http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/inheritance.html#inheritance-tablepersubclass-distributor ). Вы можете сделать отдел дискриминатором, и тогда у вас будут классы EEEEmployeUpdates и ECEmployeeUpdates. Ваш запрос может измениться, чтобы просто запросить EEEEmployeeUpdates.

person javaluva2    schedule 28.01.2014