|
|
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Имеем 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. Как временный выход можно преобразовать отдельные ОР"ы в диапазоны (реально быстрее), но в общем случае набор параметров не упорядочен. Что можете подсказать, исходя из опыта и практики. ЗЫ. Прошу не предлагать модификацию сервака (что если ОР"ов будет миллион). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 11:26 |
|
||
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Привет! Эта проблема связана с тем, что в серверах меньше чем 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 11:39 |
|
||
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
хех, я бы по неопытности своей сделал бы (а в своей задаче примерно так и сделал) хп, где в качестве параметра передавал бы айди в строку с разделителями, и в цыкле отделал бы следующий айди и делал бы select where currentid=:currentid; suspend; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 11:42 |
|
||
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Можно попробовать сделать промежуточную таблицу с ограниченым количеством записей. Новые данные залетают в нее, самые старые в ней при этом улетают в основную (накопительную). Работа с маленькой таблицей всяко производительнее. И все таки IN ИМХО в твоем случае предпочтительнее. Или попробовать эти параметры записать в отдельную таблицу и при запросе выбирать из нее подзапросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 11:45 |
|
||
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Спасибо, Алексей. :) Буду пробовать. Интересное решение, как получится - сразу сообщу. Сразу еще вопрос возник - значит ли фраза, про " ...в серверах меньше чем 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 12:01 |
|
||
|
Помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Прошу прощения за недостаточно поставленный вопрос - по PObject нет индексов вообще. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2003, 13:03 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32217945&tid=1580200]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 479ms |

| 0 / 0 |
