2013-03-18 1 views
3
CREATE TABLE index_test 
(
    id int PRIMARY KEY NOT NULL, 
    text varchar(2048) NOT NULL, 
    value int NOT NULL 
); 
CREATE INDEX idx_index_value ON index_test (value); 
CREATE INDEX idx_index_value_and_text ON index_test (value, text); 
CREATE INDEX idx_index_text_and_value ON index_test (text, value); 
CREATE INDEX idx_index_text ON index_test (text); 

Таблица заполнена 10000 случайными строками, столбец «значение» имеет целые числа от 0 до 100, столбец «текст» имеет случайный хэш-бит 128 бит md5. Извините за использование неправильных имен столбцов.Почему Postgresql ищет текстовый индекс быстрее индекса Int?

Мои поиски:

select * from index_test r where r.value=56; 
select * from index_test r where r.value=56 and r.text='dfs'; 
select * from index_test r where r.text='sdf'; 

В любое время я сделать некоторые поиск ...

  1. если только индексы на 'текст' и/или 'стоимость' столбцов представлены
  2. в сочетании («текст» и «значение» вместе) показаны

... поэтому, в любое время я вижу следующее изображение:

Поиски целого столбца 'значение' является

  • медленнее
  • сложена из 2 поиска: * Растровые кучного сканирования на index_test * и * Растровые сканирования индекса на idx_index_value *

Поиск по столбцу "текст" varchar:

  • более быстрый
  • всегда с помощью индексного сканирования

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

ответ

2

Поскольку текст является хешем, уникальным по определению, будет только одна строка из строк 10k таблицы, соответствующей этому тексту.

Значение 56 будет существовать около 100 раз внутри строк 10 тыс., И оно будет разбросано по всей таблице. Поэтому планировщик идет первым в индекс и находит страницы, где находятся эти строки. Затем он посещает каждую из этих разбросанных страниц для извлечения строк.

+0

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

+0

@MikeBethany Вы не прочитали вопрос или не поняли его. Попробуйте успеть, а затем выполните поиск _cardinality_ –

+0

Я прочитал вопрос, и я это понимаю. Ваш ответ фактически ошибочен. Если вы не согласны, укажите, как я указал, как ваш ответ неправильный. Вам лучше использовать факты вместо эмоций. –

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