Re: Не используютя индекс

Lists: pgsql-ru-general
From: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
To: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Не используютя индексы.
Date: 2005-05-11 08:09:30
Message-ID: 20050511080929.GF6159@virtonconsultants.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Доброго времени суток!

Вот есть проблема, может быть кто сталкивался и решал...

Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
данные прегнал с помощью самописного скрипта при помощи copy). Всё
прошло успешно, все данные были прегнны в pg, но тут столкнулся с
проблемкой...

Есть одна большая таблица, порядка 3500000 записей, весит все это добро
около 2,3Gb.

В таблице есть поле:

id bigserial

по полю создан индекс:

CREATE UNIQUE INDEX test_id_index ON test (id).

Но он не используется ни при каких запросах, всегда идёт полный скан
таблицы.

Уже просто замучался...

Как "сказать" планировщику что индека нужно использовать?

С уважением.
--
Denis A. Egorov


From: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
To: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не используютя индекс
Date: 2005-05-11 08:11:23
Message-ID: Pine.GSO.4.62.0505111209300.11640@ra.sai.msu.su
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---559023410-1144747756-1115799083=:11640
Content-Type: TEXT/PLAIN; charset=koi8-r; format=flowed
Content-Transfer-Encoding: 8BIT

Денис,

ты должен сообщить информацию
* версия PostgreSQL
* делал ли ты 'vacuum analyze' после создания индексов
* привести 'explain analyze select .....' и его выдачу

Тогда ты можешь рассчитывать, что кто-нибудь тебе поможет.

Олег
On Wed, 11 May 2005, Denis A. Egorov wrote:

> Доброго времени суток!
>
>
> Вот есть проблема, может быть кто сталкивался и решал...
>
> Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
> данные прегнал с помощью самописного скрипта при помощи copy). Всё
> прошло успешно, все данные были прегнны в pg, но тут столкнулся с
> проблемкой...
>
> Есть одна большая таблица, порядка 3500000 записей, весит все это добро
> около 2,3Gb.
>
>
> В таблице есть поле:
>
> id bigserial
>
> по полю создан индекс:
>
> CREATE UNIQUE INDEX test_id_index ON test (id).
>
> Но он не используется ни при каких запросах, всегда идёт полный скан
> таблицы.
>
> Уже просто замучался...
>
> Как "сказать" планировщику что индека нужно использовать?
>
>
>
> С уважением.
>

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83
---559023410-1144747756-1115799083=:11640--


From: "Viktor Vislobokov" <vvislobokov(at)parma-telecom(dot)ru>
To: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не использ
Date: 2005-05-11 08:14:07
Message-ID: 4281BECF.6000005@lukoilperm.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Стесняюсь спросить - а статистику ты собрал?
И пример запроса с подробностями в студию.

>Доброго времени суток!
>
>
>Вот есть проблема, может быть кто сталкивался и решал...
>
>Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
>данные прегнал с помощью самописного скрипта при помощи copy). Всё
>прошло успешно, все данные были прегнны в pg, но тут столкнулся с
>проблемкой...
>
>Есть одна большая таблица, порядка 3500000 записей, весит все это добро
>около 2,3Gb.
>
>
>В таблице есть поле:
>
>id bigserial
>
>по полю создан индекс:
>
>CREATE UNIQUE INDEX test_id_index ON test (id).
>
>Но он не используется ни при каких запросах, всегда идёт полный скан
>таблицы.
>
>Уже просто замучался...
>
>Как "сказать" планировщику что индека нужно использовать?
>
>
>
>С уважением.
>
>

--
С уважением, Виктор


From: "Alexander M(dot) Pravking" <fduch(at)antar(dot)bryansk(dot)ru>
To: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 08:44:22
Message-ID: 20050511084422.GA717@dyatel.antar.bryansk.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

On Wed, May 11, 2005 at 11:09:30AM +0300, Denis A. Egorov wrote:
> Вот есть проблема, может быть кто сталкивался и решал...
>
> Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
> данные прегнал с помощью самописного скрипта при помощи copy). Всё
> прошло успешно, все данные были прегнны в pg, но тут столкнулся с
> проблемкой...
>
> Есть одна большая таблица, порядка 3500000 записей, весит все это добро
> около 2,3Gb.
>
>
> В таблице есть поле:
>
> id bigserial
>
> по полю создан индекс:
>
> CREATE UNIQUE INDEX test_id_index ON test (id).
>
> Но он не используется ни при каких запросах, всегда идёт полный скан
> таблицы.

Приведи пример запроса. Насколько я помню, с bigint у постгреса
небольшая засада - в запросе параметр должен быть явно приведён к
bigint, например:

SELECT * FROM test WHERE id = 12; -- индекс не будет использоваться
SELECT * FROM test WHERE id = 12::bigint; -- должно быть OK

Докопаться до причин можно порывшись в архивах :)

--
Fduch M. Pravking


From: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
To: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 08:45:11
Message-ID: 20050511084510.GG6159@virtonconsultants.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Здравствуйте, Oleg Bartunov!

Да, vacuum делал, и не раз, но что-то не помогает.

version
----------------------------------------------------------------------
PostgreSQL 7.4.7 on i386-portbld-freebsd4.11, compiled by GCC 2.95.4

explain ANALYZE SELECT id from test WHERE id=123423 limit 1;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Limit (cost=100000000.00..100280942.84 rows=1 width=8) (actual time=53298.684..53298.684 rows=0 loops=1)
-> Seq Scan on test (cost=100000000.00..100280942.84 rows=1 width=8) (actual time=53298.671..53298.671 rows=0 loops=1)
Filter: (id = 123423)
Total runtime: 53298.741 ms

On Wed, May 11, 2005 at 12:11:23PM +0400, you wrote:

-> Денис,
->
-> ты должен сообщить информацию
-> * версия PostgreSQL
-> * делал ли ты 'vacuum analyze' после создания индексов
-> * привести 'explain analyze select .....' и его выдачу
->
-> Тогда ты можешь рассчитывать, что кто-нибудь тебе поможет.
->
-> Олег
-> On Wed, 11 May 2005, Denis A. Egorov wrote:
->
-> >Доброго времени суток!
-> >
-> >
-> >Вот есть проблема, может быть кто сталкивался и решал...
-> >
-> >Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
-> >данные прегнал с помощью самописного скрипта при помощи copy). Всё
-> >прошло успешно, все данные были прегнны в pg, но тут столкнулся с
-> >проблемкой...
-> >
-> >Есть одна большая таблица, порядка 3500000 записей, весит все это добро
-> >около 2,3Gb.
-> >
-> >
-> >В таблице есть поле:
-> >
-> >id bigserial
-> >
-> >по полю создан индекс:
-> >
-> >CREATE UNIQUE INDEX test_id_index ON test (id).
-> >
-> >Но он не используется ни при каких запросах, всегда идёт полный скан
-> >таблицы.
-> >
-> >Уже просто замучался...
-> >
-> >Как "сказать" планировщику что индека нужно использовать?
-> >
-> >
-> >
-> >С уважением.
-> >
->
-> Regards,
-> Oleg
-> _____________________________________________________________
-> Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
-> Sternberg Astronomical Institute, Moscow University (Russia)
-> Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
-> phone: +007(095)939-16-83, +007(095)939-23-83

--
Denis A. Egorov


From: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
To: "Alexander M(dot) Pravking" <fduch(at)antar(dot)bryansk(dot)ru>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 08:52:02
Message-ID: 20050511085202.GH6159@virtonconsultants.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Здравствуйте, Alexander M. Pravking!

Да! :)

Вы оказались совешенно правы!

Всё работает когда поставил приведение к типу.

Теперь возникае другой вопрос: это что теперь нужно визде ставить
привидение?

On Wed, May 11, 2005 at 12:44:22PM +0400, you wrote:

-> On Wed, May 11, 2005 at 11:09:30AM +0300, Denis A. Egorov wrote:
-> > Вот есть проблема, может быть кто сталкивался и решал...
-> >
-> > Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
-> > данные прегнал с помощью самописного скрипта при помощи copy). Всё
-> > прошло успешно, все данные были прегнны в pg, но тут столкнулся с
-> > проблемкой...
-> >
-> > Есть одна большая таблица, порядка 3500000 записей, весит все это добро
-> > около 2,3Gb.
-> >
-> >
-> > В таблице есть поле:
-> >
-> > id bigserial
-> >
-> > по полю создан индекс:
-> >
-> > CREATE UNIQUE INDEX test_id_index ON test (id).
-> >
-> > Но он не используется ни при каких запросах, всегда идёт полный скан
-> > таблицы.
->
-> Приведи пример запроса. Насколько я помню, с bigint у постгреса
-> небольшая засада - в запросе параметр должен быть явно приведён к
-> bigint, например:
->
-> SELECT * FROM test WHERE id = 12; -- индекс не будет использоваться
-> SELECT * FROM test WHERE id = 12::bigint; -- должно быть OK
->
-> Докопаться до причин можно порывшись в архивах :)
->
-> --
-> Fduch M. Pravking
->

--
Denis A. Egorov


From: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
To: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 09:15:54
Message-ID: Pine.GSO.4.62.0505111312460.11640@ra.sai.msu.su
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

---559023410-1594243340-1115802954=:11640
Content-Type: TEXT/PLAIN; charset=koi8-r; format=flowed
Content-Transfer-Encoding: 8BIT

Обновись до 8.02 или явно делай cast
explain ANALYZE SELECT id from test WHERE id=123423::bigint limit 1;

Олег
On Wed, 11 May 2005, Denis A. Egorov wrote:

> Здравствуйте, Oleg Bartunov!
>
> Да, vacuum делал, и не раз, но что-то не помогает.
>
> version
> ----------------------------------------------------------------------
> PostgreSQL 7.4.7 on i386-portbld-freebsd4.11, compiled by GCC 2.95.4
>
>
>
> explain ANALYZE SELECT id from test WHERE id=123423 limit 1;
> QUERY PLAN
> ----------------------------------------------------------------------------------------------------------------------------
> Limit (cost=100000000.00..100280942.84 rows=1 width=8) (actual time=53298.684..53298.684 rows=0 loops=1)
> -> Seq Scan on test (cost=100000000.00..100280942.84 rows=1 width=8) (actual time=53298.671..53298.671 rows=0 loops=1)
> Filter: (id = 123423)
> Total runtime: 53298.741 ms
>
>
>
> On Wed, May 11, 2005 at 12:11:23PM +0400, you wrote:
>
> -> Денис,
> ->
> -> ты должен сообщить информацию
> -> * версия PostgreSQL
> -> * делал ли ты 'vacuum analyze' после создания индексов
> -> * привести 'explain analyze select .....' и его выдачу
> ->
> -> Тогда ты можешь рассчитывать, что кто-нибудь тебе поможет.
> ->
> -> Олег
> -> On Wed, 11 May 2005, Denis A. Egorov wrote:
> ->
> -> >Доброго времени суток!
> -> >
> -> >
> -> >Вот есть проблема, может быть кто сталкивался и решал...
> -> >
> -> >Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
> -> >данные прегнал с помощью самописного скрипта при помощи copy). Всё
> -> >прошло успешно, все данные были прегнны в pg, но тут столкнулся с
> -> >проблемкой...
> -> >
> -> >Есть одна большая таблица, порядка 3500000 записей, весит все это добро
> -> >около 2,3Gb.
> -> >
> -> >
> -> >В таблице есть поле:
> -> >
> -> >id bigserial
> -> >
> -> >по полю создан индекс:
> -> >
> -> >CREATE UNIQUE INDEX test_id_index ON test (id).
> -> >
> -> >Но он не используется ни при каких запросах, всегда идёт полный скан
> -> >таблицы.
> -> >
> -> >Уже просто замучался...
> -> >
> -> >Как "сказать" планировщику что индека нужно использовать?
> -> >
> -> >
> -> >
> -> >С уважением.
> -> >
> ->
> -> Regards,
> -> Oleg
> -> _____________________________________________________________
> -> Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
> -> Sternberg Astronomical Institute, Moscow University (Russia)
> -> Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
> -> phone: +007(095)939-16-83, +007(095)939-23-83
>
>
>

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83
---559023410-1594243340-1115802954=:11640--


From: "Alexander M(dot) Pravking" <fduch(at)antar(dot)bryansk(dot)ru>
To: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 10:43:32
Message-ID: 20050511104332.GB717@dyatel.antar.bryansk.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

On Wed, May 11, 2005 at 11:52:02AM +0300, Denis A. Egorov wrote:
> Да! :)
>
> Вы оказались совешенно правы!
>
> Всё работает когда поставил приведение к типу.
>
> Теперь возникае другой вопрос: это что теперь нужно визде ставить
> привидение?

Скорее всего, везде, где идёт сравнение значения столбца с константой
или выражением, результатом которого является что-то отличное от bigint.
JOIN'ы по двум bigint-столбцам должны отрабатывать на ура.

Другой вариант (если 2G значений достаточно) - заменить bigserial на
serial.

Наконец, наилучший вариант, как уже посоветовал Олег, - обновиться до
8.02.

--
Fduch M. Pravking


From: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
To: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 14:21:10
Message-ID: 20050511142108.GI6159@virtonconsultants.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

Доброго времени суток!

Все огромное спасибо, за решение проблемы, ставлю 8-ку, буду
тетировать...

Но вот нашёл такую вот особенность, что если делать

SELECT ... ib='12121'

то приведение не нужно, а индекс используется...

А в доках про такое ни где не написано.

On Wed, May 11, 2005 at 11:09:30AM +0300, you wrote:

->
->
-> Вот есть проблема, может быть кто сталкивался и решал...
->
-> Есть база на mysql, я её прегнал в postgres(руками создал таблички, а
-> данные прегнал с помощью самописного скрипта при помощи copy). Всё
-> прошло успешно, все данные были прегнны в pg, но тут столкнулся с
-> проблемкой...
->
-> Есть одна большая таблица, порядка 3500000 записей, весит все это добро
-> около 2,3Gb.
->
->
-> В таблице есть поле:
->
-> id bigserial
->
-> по полю создан индекс:
->
-> CREATE UNIQUE INDEX test_id_index ON test (id).
->
-> Но он не используется ни при каких запросах, всегда идёт полный скан
-> таблицы.
->
-> Уже просто замучался...
->
-> Как "сказать" планировщику что индека нужно использовать?
->
->
->

С уважением.
--
Denis A. Egorov


From: "Alexander M(dot) Pravking" <fduch(at)antar(dot)bryansk(dot)ru>
To: "Denis A(dot) Egorov" <denis(dot)egorov(at)virtonconsultants(dot)com>
Cc: pgsql-ru-general list <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Не исп
Date: 2005-05-11 16:00:17
Message-ID: 20050511160017.GG717@dyatel.antar.bryansk.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

On Wed, May 11, 2005 at 05:21:10PM +0300, Denis A. Egorov wrote:
> Но вот нашёл такую вот особенность, что если делать
>
> SELECT ... ib='12121'
>
> то приведение не нужно, а индекс используется...
>
> А в доках про такое ни где не написано.

В общем-то, закавыченные константы - это правильно :)

Насколько я знаю, закавыченная константа изначально имеет псевдотип
unknown и всегда приводится к типу того, с чем она сравнивается.
Константы вида 12.34 изначально numeric, вида 1234 - integer или bigint
в зависимости от того, влезает она в signed int4 или нет. И получалось,
что для сравнения в данном случае значения bigint-столбца с
int4-константой значение столбца неявно приводилось к int4, и индекс в
этом случае не мог быть использован. (Странно, но сейчас попробовал на
7.4.7 построить индекс по (id::integer), но он тоже не используется -
возможно, я неправ. Пусть меня поправят, если что.)

В восьмёрке же Tom похимичил над неявным приведением типов, и проблема
решилась. Кстати, была она не только с bigint.

> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend

Самый нужный tip ;)

--
Fduch M. Pravking