2013-04-04 2 views
0

Насколько я понимаю, когда мы запускаем SQL-запрос с COUNT, DISTINCT или LIKE %query% (подстановочные знаки с обеих сторон), индексы не могут использоваться и база данных должна выполнять полное сканирование таблицы.Можем ли мы повысить производительность запросов COUNT, DISTINCT и LIKE?

Есть ли способ повысить производительность этих запросов?

Действительно ли они не могут использовать индексы, или мы можем это исправить?

Можем ли мы сделать проверку только индекса, если нам нужно вернуть только один столбец? Например: select count(id) from MY_TABLE: возможно, в этом случае мы можем выполнить только проверку по индексу и избежать попадания всей таблицы, если у нас есть индекс на «id»?

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

UPDATE Что касается меня, то я использую PostgreSQL.

+1

Какие РСУБД? SQL Server будет использовать более узкий индекс в 'id' (если он доступен) для' select count (id) из MY_TABLE' –

+0

И даже без каких-либо условий 'SELECT DISTINCT a, b FROM t;' будет использовать индекс на '(a, b) 'или' (b, a) ' –

+0

На какой платформе базы данных? Например, Postgres имеет расширение под названием [Wildspeed] (http://www.sai.msu.su/~megera/wiki/wildspeed), которое позволяет индексировать запросы 'LIKE'. –

ответ

0

с PostgreSQL, вы можете создавать индексы GIN pg_trgm для текстовых строк, чтобы сделать LIKE '% foo%' быстрее, хотя для этого требуются аддоны и PostgreSQL 9.1 или выше.

Я сомневаюсь, что сам по себе будет использовать индекс. Я попытался на самом деле и не мог заставить его использовать его. Вы можете использовать силу для индекса, который будет использоваться с помощью рекурсивного CTE, чтобы вытащить отдельные записи (что можно назвать «разреженным сканированием»). Мы делаем что-то подобное, вытягивая отдельные годы из учетной записи. Это требует написания специальных запросов, хотя это не общий случай.

count (*) никогда не сможет использовать индекс из-за правил mvcc. Однако вы можете получить приблизительные результаты, просмотрев соответствующие системные каталоги.

Смежные вопросы