powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL v8.2 beta1
25 сообщений из 26, страница 1 из 2
PostgreSQL v8.2 beta1
    #34012766
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
( http://developer.postgresql.org/pgdocs/postgres/release-8-2.html
PS. count(*) так и не научили индексы использовать :(
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34013161
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexPS. count(*) так и не научили индексы использовать :(
А я никогда count(*) на всю (большую) таблицу и не использовал. А если указываешь вменяемые условия, индексы все равно задействуются.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34013418
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот мне интересно - как можно заставить выдавать count - по таблице используя только индексы? В условиях архитектуры MVCC? Вот парни- те кому это кровь из носа как надо - распишите по простому -КАК? При этом учтите , что информация о версии записи в индексе не храниться. Т.е. узел индекса может ссылаться на уже удаленную запись - и узнать что она удалена можно только если сходить и посмотреть непосредственно на запись. В этом случае, если считать count по колличеству ключей в индексе- легко получить неправильный результат.
Кстати по слухам SQL2005 - тоже теперь использует архитектуру MVCC(в простонаречии версионная архитектура). И по моему там count - также теперь считается перебором. ( Поправьте если я не прав...)
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34013699
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexPS. count(*) так и не научили индексы использовать :(
А как ты будешь count(*) по индексам делать? Перебирать весь индекс и считать количество элементов?
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34014142
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое Warm standby server enhancements?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34014342
Andrew Sagulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гoлдун
А что такое Warm standby server enhancements?


Насколько я понял, это бэкап-сервер, который получает wal-сегменты от боевого сервера и накатывает их у себя.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34015714
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domanixА вот мне интересно - как можно заставить выдавать count - по таблице используя только индексы? В условиях архитектуры MVCC?
Я не спорю, что всегда можно использовать первичный индекс, но когда нет других активных транзакций, может можно из первичного индекса получить кол-во елементов? Не бейте сильно, если заблуждаюсь.
Кстати по слухам SQL2005 - тоже теперь использует архитектуру MVCC(в простонаречии версионная архитектура). И по моему там count - также теперь считается перебором. ( Поправьте если я не прав...)
Нет там первичный индекс используется, как и в Oracle.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34015960
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманА как ты будешь count(*) по индексам делать? Перебирать весь индекс и считать количество элементов?

Еще год назад были следующие идеи :


I think our TODO has a good summary of the issues:

---------------------------------------------------------------------------

* Speed up COUNT(*)

We could use a fixed row count and a +/- count to follow MVCC
visibility rules, or a single cached value could be used and
invalidated if anyone modifies the table. Another idea is to
get a count directly from a unique index, but for this to be
faster than a sequential scan it must avoid access to the heap
to obtain tuple visibility information.

* Add estimated_count(*) to return an estimate of COUNT(*)

This would use the planner ANALYZE statistics to return an estimated
count.

* Allow data to be pulled directly from indexes

Currently indexes do not have enough tuple visibility information
to allow data to be pulled from the index without also accessing
the heap. One way to allow this is to set a bit on index tuples
to indicate if a tuple is currently visible to all transactions
when the first valid heap lookup happens. This bit would have to
be cleared when a heap tuple is expired.

Another idea is to maintain a bitmap of heap pages where all rows
are visible to all backends, and allow index lookups to reference
that bitmap to avoid heap lookups, perhaps the same bitmap we might
add someday to determine which heap pages need vacuuming. Frequently
accessed bitmaps would have to be stored in shared memory. One 8k
page of bitmaps could track 512MB of heap pages.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34015978
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domanixКстати по слухам SQL2005 - тоже теперь использует архитектуру MVCC(в простонаречии версионная архитектура). И по моему там count - также теперь считается перебором. ( Поправьте если я не прав...)

Вот план запроса

select count(*) from emails

MSSQL 2005 Express Edition c количеством записей 5 млн.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34016047
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexВот план запроса
select count(*) from emails
MSSQL 2005 Express Edition c количеством записей 5 млн.Налицо реализация пункта "Allow data to be pulled directly from indexes". Так же имхо работает и оракл. А вот mysql, снова имхо, действует по пункту "Speed up COUNT(*)".
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34016872
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domanixА вот мне интересно - как можно заставить выдавать count - по таблице используя только индексы? В условиях архитектуры MVCC? Вот парни- те кому это кровь из носа как надо - распишите по простому -КАК? При этом учтите , что информация о версии записи в индексе не храниться. Т.е. узел индекса может ссылаться на уже удаленную запись - и узнать что она удалена можно только если сходить и посмотреть непосредственно на запись. В этом случае, если считать count по колличеству ключей в индексе- легко получить неправильный результат.

А каким образом стали работать MIN() и MAX() используя первичный индекс в условиях архитектуры MVCC???? Чем принципиально MIN() и MAX() отличаются от COUNT() по алгоритму прохода всех записей?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
test=# explain analyze select max(id) from emails;
                                                                      QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
 Result  (cost= 0 . 39 .. 0 . 40  rows= 1  width= 0 ) (actual time= 0 . 143 .. 0 . 144  rows= 1  loops= 1 )
   InitPlan
     ->  Limit  (cost= 0 . 00 .. 0 . 39  rows= 1  width= 4 ) (actual time= 0 . 138 .. 0 . 138  rows= 1  loops= 1 )
           ->  Index Scan Backward using emails_pkey on emails  (cost= 0 . 00 .. 1975243 . 81  rows= 5056374  width= 4 ) (actual time= 0 . 127 .. 0 . 127  rows= 1  loops= 1 )
                 Filter: (id IS NOT NULL)
 Total runtime:  0 . 276  ms
( 6  rows)
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34017039
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master Alex domanixА вот мне интересно - как можно заставить выдавать count - по таблице используя только индексы? В условиях архитектуры MVCC? Вот парни- те кому это кровь из носа как надо - распишите по простому -КАК? При этом учтите , что информация о версии записи в индексе не храниться. Т.е. узел индекса может ссылаться на уже удаленную запись - и узнать что она удалена можно только если сходить и посмотреть непосредственно на запись. В этом случае, если считать count по колличеству ключей в индексе- легко получить неправильный результат.

А каким образом стали работать MIN() и MAX() используя первичный индекс в условиях архитектуры MVCC???? Чем принципиально MIN() и MAX() отличаются от COUNT() по алгоритму прохода всех записей?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
test=# explain analyze select max(id) from emails;
                                                                      QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
 Result  (cost= 0 . 39 .. 0 . 40  rows= 1  width= 0 ) (actual time= 0 . 143 .. 0 . 144  rows= 1  loops= 1 )
   InitPlan
     ->  Limit  (cost= 0 . 00 .. 0 . 39  rows= 1  width= 4 ) (actual time= 0 . 138 .. 0 . 138  rows= 1  loops= 1 )
           ->  Index Scan Backward using emails_pkey on emails  (cost= 0 . 00 .. 1975243 . 81  rows= 5056374  width= 4 ) (actual time= 0 . 127 .. 0 . 127  rows= 1  loops= 1 )
                 Filter: (id IS NOT NULL)
 Total runtime:  0 . 276  ms
( 6  rows)


Принципиально - ты по BTree-индексу можешь пойти направо и уткнуться в максимальный элемент. Пойдешь налево - и уткнешься в минимальный элемент.
А вот количество листьев в BTree-дереве никакой алгоритм, кроме перебора, посчитать не сможет.

А MSSQL - блочник, и следовательно, умеет правильно отслеживать количество элементов. Кстати, хинт: попробуйте в том же MSSQL получить COUNT во время выполнения какого-нибудь большого изменения количества записей. Мне почему-то кажется, что до завершения инсертов-делитов у вас не будет никаких результатов. А PG выдаст число на момент начала транзакции, в которой выполняется count(*)
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34017578
Andrew Sagulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман
А MSSQL - блочник, и следовательно, умеет правильно отслеживать количество элементов.

MSSQL 2005 ни разу не блочник, а самый что ни на есть версионник. Другое дело, что никто не мешает хранить номер версии (грубо говоря) в индексе и определять видимость записи ключа не обращаясь к строке таблицы, но это ведёт к заметному распуханию индекса. Честно говоря, не знаю, каким образом эту задачу решил MS.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34017850
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexА каким образом стали работать MIN() и MAX() используя первичный индекс в условиях архитектуры MVCC????Не стали. Пункт "Index Scan Backward using emails_pkey on emails" вовсе не означает, что делается выборка только по индексу. Для каждой найденной в индексе строки постгрес заглядывает в таблицу.

Master AlexЧем принципиально MIN() и MAX() отличаются от COUNT() по алгоритму прохода всех записей?Для вычисления min или max не нужно проходить все записи, а надо найти одну крайнюю. Для вычисления count нужно проходить все записи.

Кувалдин РоманА MSSQL - блочник, и следовательно, умеет правильно отслеживать количество элементов.Что значит "отслеживать количество элементов"? Судя по плану, который привел Master Alex в этом сообщении , MSSQL пробежал по индексу все 5 миллионов строк для вычисления count.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34017972
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew Sagulin MSSQL 2005 ни разу не блочник, а самый что ни на есть версионник. Другое дело, что никто не мешает хранить номер версии (грубо говоря) в индексе и определять видимость записи ключа не обращаясь к строке таблицы, но это ведёт к заметному распуханию индекса. Честно говоря, не знаю, каким образом эту задачу решил MS.
Ошибаешься - он версионник "по запросу", т.е. ты должен стартовать транзакцию с указанием, что она будет работать со SNAPSHOT-ом (и только тогда версионность начинается). По-умолчанию же транзакции работают как в чистом блокировочнике.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34018070
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. план выполнения в MSSQL показанный выше - это план выполнения запроса блокировочником?
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34018859
Andrew Sagulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon
Ошибаешься - он версионник "по запросу", т.е. ты должен стартовать транзакцию с указанием, что она будет работать со SNAPSHOT-ом (и только тогда версионность начинается). По-умолчанию же транзакции работают как в чистом блокировочнике.

Посыпаю голову пеплом ...
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34021116
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew Sagulin
Посыпаю голову пеплом...
Спасибо за линк. Прочитал и понял, что я тоже не совсем прав - я думал, что версионность это свойство запроса в MSSQL2005, а не базы... У меня снова появился к нему интерес :-)
Впрочем версия грядущая версия PostgreSQL 8.2 мне очень нравится - уже скачал, уже потихоньку тестю.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34024047
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatСудя по плану, который привел Master Alex в этом сообщении , MSSQL пробежал по индексу все 5 миллионов строк для вычисления count.

... что возвращает нас к вопросу, а не быстрее ли было пробежаться по самой таблице?
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34024418
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин Роман
... что возвращает нас к вопросу, а не быстрее ли было пробежаться по самой таблице?

Объемы разные: таблица 700МБ, индекс - 70MB - разница есть?
Это в PostgreSQL при проходе по индексу нужно еще и таблицу проходить - а имеем ли мы право видеть эту строчку?
В блокировочнике проще - все строчки в таблице ты имеешь право видеть, ибо существуют они в одной версии и блок стоит,
а значит - одна строка в индексе соответствует одной строке в таблице.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34025400
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_Falcon Кувалдин Роман
... что возвращает нас к вопросу, а не быстрее ли было пробежаться по самой таблице?

Объемы разные: таблица 700МБ, индекс - 70MB - разница есть?
Это в PostgreSQL при проходе по индексу нужно еще и таблицу проходить - а имеем ли мы право видеть эту строчку?
В блокировочнике проще - все строчки в таблице ты имеешь право видеть, ибо существуют они в одной версии и блок стоит,
а значит - одна строка в индексе соответствует одной строке в таблице.
Интересно, а почему в Оракле, который как известно версионник, известно, что если данные запроса можно получить из индекса (т.е. все нужные поля присутствуют в индексе), то в таблицу он (оракл) не полезет...
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34025899
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirИнтересно, а почему в Оракле, который как известно версионник, известно, что если данные запроса можно получить из индекса (т.е. все нужные поля присутствуют в индексе), то в таблицу он (оракл) не полезет...

Откуда известно? Оракл - это не пойми что.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34026291
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин Роман pamirИнтересно, а почему в Оракле, который как известно версионник, известно, что если данные запроса можно получить из индекса (т.е. все нужные поля присутствуют в индексе), то в таблицу он (оракл) не полезет...

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

Что значит - оракл это не пойми что? Оракл как раз самый обычный версионник..
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34026298
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamir Кувалдин Роман pamirИнтересно, а почему в Оракле, который как известно версионник, известно, что если данные запроса можно получить из индекса (т.е. все нужные поля присутствуют в индексе), то в таблицу он (оракл) не полезет...

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

Что значит - оракл это не пойми что? Оракл как раз самый обычный версионник..
Извиняюсь, вопрос был про "откуда известно, что версионник", а не "откуда известно, что он не полезет в таблицу", я же ответил на второе...
Ну давайте сходим в оракловый форум. Только предварительно дадим определение понятию "версионник", чтобы потом не спорить о разном понимании этого термина.
...
Рейтинг: 0 / 0
PostgreSQL v8.2 beta1
    #34026345
4321ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман pamirИнтересно, а почему в Оракле, который как известно версионник, известно, что если данные запроса можно получить из индекса (т.е. все нужные поля присутствуют в индексе), то в таблицу он (оракл) не полезет...

Откуда известно? Оракл - это не пойми что.
ну, не знаю, пойми он что, или не пойми, но как я неправильно /;0) понял из заявлений ораклоидов на местном ссайте (с год тому взад), оракл хранит не "номер версии в индексе" (и записях), а версии (измененных) страниц (точнее, для оракла -"блоков") индекса. Т.е. сам по себе "индекс не распухает" - в него не добавляется инфа о версии "в каждое значение", но структура хранения (всего и индексов в т.ч.) версифицируется поблочно (постранично). Таким образом, индекс каждой версии - актуален для нее. Мех-зм же получения актуальных версий одинаков для записей и индексов.

прошу сильно не бить (темен, типо), но допросить ораклоидов. /;O)
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL v8.2 beta1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]