Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / многопользовательская работа с очень большой таблицей / 7 сообщений из 7, страница 1 из 1
07.12.2006, 22:30
    #34184727
tier.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
Приветствую, господа. Вопрос по теории построения БД. И по практике :)
Postgresql 8.2. Сервер: 2 Xeon'а, 4 Гига памяти. RedHat AS 4.
Предыстория.
Было у нас куча (около 1000) таблиц, абсолютно одинаковых, содержащих сходные данные, но относящиестя к разным сущностям нашего программного комплекса. Общую статистику получить было почти невозможно - надо было проходить последовательно по всем таблицам и объединять результаты анализа каждой в единое целое. Более того - какие-то необходимые модификации, заставляли нас опять проходить по всем таблицам и модифицировать их по одной. Последней каплей стало возникшее требование добавлять в таблицу запись только если значение одного из полей ее не встречается ни в одной из остальных таблиц.
И я решил номализовать БД. Объединил все данные в одну таблицу с добавлением поля, указывающего, какой из сущностей принадлежит запись.
И тут все начало страшно тормозить. Сразу скажу, с индексами там все нормально - есть индексы по всем полям, которые упоминаются в запросах в WHERE. Опишу таблицу: она содержит 6 полей - счетчик - primary key, 2 int, 3 text. Размер сейчас - порядка 50 млн записей. БД настроена оптимально - я в этом разбираюсь.
С таблицей этой непрерывно и постоянно работают 10 клиентов - выбирают, добавляют, изменяют записи. Друг другу вроде не должны мешать, т.к. каждый работает только со своими записями. Тем не менее - торможение жуткое.
Что можно с этим сделать? Или я вообще зря нормализовал БД?
...
Рейтинг: 0 / 0
08.12.2006, 09:46
    #34185194
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
Думаю не зря, но индексы придется поднастроить под запросы (я думаю).

А тормоза с выборкой или изменением данных?
...
Рейтинг: 0 / 0
08.12.2006, 10:49
    #34185399
многопользовательская работа с очень большой таблицей
> Сервер: 2 Xeon'а, 4 Гига памяти. RedHat AS 4.

Дисковая?
ps auxr?
vmstat 3?
iostat?

> И тут все начало страшно тормозить.

Что именно "все"?
...
Рейтинг: 0 / 0
08.12.2006, 10:55
    #34185422
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
tier.ruСразу скажу, с индексами там все нормально - есть индексы по всем полям, которые упоминаются в запросах в WHERE.
Код: plaintext
1.
... where a='foo' and b between 'bar' and 'baz';
... where b='foo' and a between 'bar' and 'baz';
В выражениях where этих двух запросов упоминаются одни и те же поля a и b. А индексы надо строить разные - (a,b) либо (b,a) соответственно. tier.ruЧто можно с этим сделать?Смотреть explain analyze.
...
Рейтинг: 0 / 0
08.12.2006, 11:07
    #34185477
Serik.Akhmetov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
Структуру таблицы и тормозной запрос приведите.
...
Рейтинг: 0 / 0
08.12.2006, 12:31
    #34185815
tier.ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
пример тормозного запроса:
update our_big_table set field1 = 2, tdate = dafault where
id in (select id from our_big_table where field1 = 1 or
(field1 = 2 and (tdate + interval '1 day') < NOW())
ORDER BY tdate DESC LIMIT 2000)

Где:
id - serial, primary key
tdate - timestamp without time zone, default now()
field1 - integer
по двум последним есть индексы
...
Рейтинг: 0 / 0
08.12.2006, 12:59
    #34185945
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многопользовательская работа с очень большой таблицей
select count(*) from our_big_table;
select count(*) from our_big_table where field1 = 1;
select count(*) from our_big_table where field1 = 2;
select count(*) from our_big_table where field1 = 2 and tdate < now() - interval '1 day';
explain analyze тормозного запроса;
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / многопользовательская работа с очень большой таблицей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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