powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите разобраться
7 сообщений из 7, страница 1 из 1
Помогите разобраться
    #32217887
__Edward
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем
CREATE TABLE A (
ID integer,
/*куча еще других полей*/
POBJECT integer
);
ALTER TABLE A ADD PRIMARY KEY (ID);
CREATE UNIQUE DESCENDING INDEX DTS_DESC ON A (ID);

Также есть некое клиентское приложение "К1", которое постоянно закидывает в таблицу А данные,
в режиме 24х7. Неважно от того сколько данных и скорость поступления этих данных
(а также количество этих клиентов ) -
все работает прекрасно и быстро (к слову - у таблицы есть еще три объемных триггера).

Пойдем далее. Есть еще одно клиентское приложение "К2", которое при поступлении новых записей
в А, в онлайне и в dbgride показывает последние 100 записей. Но К2 не просто показывает все записи
select * from A (здесь и далее не буду ставить ордер бай айди, с этим все в порядке)
а по такому принципу
select * from A where ((pobject=12) or (pobject=193) ... этих OR"ов - штук 100-200))

причем у каждого пользователя "К2" свой набор параметров (те которые 12, 193 ...), то есть один
наблюдает за одними объектами, другой за другими и тд.
Один-три клиента не вешают ibserver, а вот 5 и более (3ГГц,512,не SCSI) - загрузка 100%
Я где-то читал, этому (вешалке) может способствовать большое количество OR'ов, равно как и конструкция IN.
Как временный выход можно преобразовать отдельные ОР"ы в диапазоны (реально быстрее),
но в общем случае набор параметров не упорядочен.
Что можете подсказать, исходя из опыта и практики.
ЗЫ. Прошу не предлагать модификацию сервака (что если ОР"ов будет миллион).
...
Рейтинг: 0 / 0
Помогите разобраться
    #32217926
Фотография Alexey Kovyazin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Эта проблема связана с тем, что в серверах меньше чем FB1.5 и Yaffil, на каждый OR в плане
подключается еще один проход по индексу (кстати, план, а также точный текст запроса желательно приводить при любых вопросах по оптимизации, чтобы было что анализировать).
Разумеется, при большом количестве условий все тормозит.


Универсаьное решение - преобразовать условия OR к объединению таблиц (JOIN).
Для этого заведи специальную таблицу OR_TABLE, в которой примерно такие поля:

ID_USER
CONDITION

далее все просто:
заносишь для пользователя с ID_USER=1 в эту таблицу условия
1 12
1 193
...

и объединяешь
явное объединение вот так будет выглядеть

A join OR_TABLE ON (A.pobject = OR_TABLE.CONDITION and OR_TABLE.ID_USER=?P_CURRENT_USER)


где P_CURENT_USER - идентификатор твоего пользователя.
Идентификаторы можно получать динамически, с помощью генератора, а можно и повторное использование прикрутить - как уж пожелаешь.

WBR,
Alexey
...
Рейтинг: 0 / 0
Помогите разобраться
    #32217934
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хех,
я бы по неопытности своей сделал бы (а в своей задаче примерно так и сделал) хп, где в качестве параметра передавал бы айди в строку с разделителями, и в цыкле отделал бы следующий айди и делал бы select where currentid=:currentid; suspend;
...
Рейтинг: 0 / 0
Помогите разобраться
    #32217945
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать сделать промежуточную таблицу с ограниченым количеством записей. Новые данные залетают в нее, самые старые в ней при этом улетают в основную (накопительную). Работа с маленькой таблицей всяко производительнее.
И все таки IN ИМХО в твоем случае предпочтительнее.
Или попробовать эти параметры записать в отдельную таблицу и при запросе выбирать из нее подзапросом.
...
Рейтинг: 0 / 0
Помогите разобраться
    #32217978
__Edward
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Алексей. :) Буду пробовать. Интересное решение, как получится - сразу сообщу.
Сразу еще вопрос возник - значит ли фраза, про " ...в серверах меньше чем FB1.5 и Yaffil ", этой проблемы (если все останется как и раньше) не будет.
А планы и запросы - на самом деле тривиальны:

select first 100 * from A
where (id>123213) and ((pobject=12) or (pobject=193) ... ))
order by id desc
PLAN (A ORDER DTS_DESC)
...
Рейтинг: 0 / 0
Помогите разобраться
    #32218102
__Edward
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения за недостаточно поставленный вопрос - по PObject нет индексов вообще. Как быть?
...
Рейтинг: 0 / 0
Помогите разобраться
    #32218110
Фотография Alexey Kovyazin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, сделай индекс :)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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