Я не могу сказать или настроить этот запрос для вас. Но я рекомендую вам создать окончательный запрос, взглянув на план объяснения. План объяснения скажет вам, используются ли индексы, сколько сканирований строк вы выполняете и, возможно, вы можете начать с этого. Для объяснения запроса выполните
explain select * from dummy_table where x = 'abcd' and y like '%dfs%
and z not in ('ab','cd','ef')
Плюс, лучше, чтобы у вас не было запросов с %like%
, поскольку он никогда не будет попадать в индексы.
Производительность запросов будет улучшаться, если вы используете хранимую процедуру. Прикладной уровень отделен от уровня базы данных. Хранимые процедуры являются родными для баз данных. Например, если вы хотите выполнить итерацию по запросу select, содержащему 10000 строк, вы можете сделать это как с помощью приложения, так и с помощью хранимой процедуры. Недостаток выполнения этого на прикладном уровне заключается в том, что вам придется приводить записи в блоках (JDBC плавно делает это для вас, используя объект набора результатов), должна происходить какая-то передача данных. Это связано с задержкой в отношении размера памяти, скорости передачи ч / б приложения и дБ и т. Д.
Принимая во внимание, что когда вы делаете это в хранимой процедуре, память является локальной для базы данных, и вся обработка может выполняться там. Я не говорю, что вы должны полностью изолировать прикладной уровень от базы данных, но все же SP гораздо лучше, особенно когда вы имеете дело с огромными записями и сложными запросами.