Страница 1 из 1

Чем заменит MAX в запросе?

Добавлено: 17 май 2006, 10:22
avenger
Привет всем!

Подскажите пожалуйста, чем можно заменит MAX в данном запросе?

Код: Выделить всё

$sql = "SELECT MAX(MESSAGEID) FROM MESSAGES WHERE CHANNELFK = $sessv[channelid]";

CREATE TABLE Messages (
    MessageID INTEGER NOT NULL,
    ChannelFK INTEGER NOT NULL,
    CONSTRAINT PK_Messages PRIMARY KEY (MessageID)
);
Когда в базе значение ключа доростает до 50000, то этот запрос очень долго выполняется (порядка 7 сек), а в моем случае это недопустимо.

С уважением, Иван.

Добавлено: 17 май 2006, 10:28
kdv
смотря зачем ты используешь max.

Добавлено: 17 май 2006, 10:30
avenger
kdv писал(а):смотря зачем ты используешь max.
У меня работает чат в реальнов времени и раз в 3-и секунды идет такой запрос к базе. Далее везде условие

Код: Выделить всё

AND MESSAGEID > $maxmessageID
Если в базе держать архив сообщений скажем 5000 строк, то все ок, а если архив 100000 - то этот запрос подводит...

А в плане индекс по MESSAGEID вообще не используется.

Код: Выделить всё

План
PLAN (MESSAGES INDEX (CHANNELS_MESSAGES_FK_CHANNELFK))

Адаптированный план
PLAN (MESSAGES INDEX (CHANNELS_MESSAGES_FK_CHANNELFK))

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 1 061 612
Max memory = 1 196 528
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 6
Fetches from cache = 571

Добавлено: 17 май 2006, 12:10
kdv
а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
А в плане индекс по MESSAGEID вообще не используется.
и не должен

Добавлено: 17 май 2006, 12:38
avenger
kdv писал(а):а чем ты messageid генерируешь? если генератором, то тогда зачем max, если максимальный номер сообщения у тебя уже есть?
ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?

Добавлено: 17 май 2006, 13:02
kdv
Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
www.ibase.ru/devinfo/generator.htm

p.s. как ты генераторы используешь, если о них ничего не знаешь???

Добавлено: 17 май 2006, 13:48
Ivan_Pisarevsky
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.

Добавлено: 17 май 2006, 14:41
avenger
kdv писал(а): p.s. как ты генераторы используешь, если о них ничего не знаешь???

Код: Выделить всё

SELECT GEN_ID(NEWCLIENT, 0) FROM RDB$DATABASE 
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
Индексы в ФБ "односторонние", нужен индекс по убыванию, тогда оптимизатор его подхватит, на что КДВ выше тебе и намекал.
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?

Добавлено: 17 май 2006, 15:04
kdv
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.
что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
"SELECT GEN_ID(NEWID, 1) FROM RDB$DATABASE

rdb$database здесь используется как таблица, содержащая только одну запись. В результате этим запросом также будет выдана 1 запись со значением генератора, увеличенным на 1."
IB Expert не дает изменить индекс на ключевое поле (MessageID). Как его поменять?
никак не поменять.

Добавлено: 18 май 2006, 11:00
Ivan_Pisarevsky
>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?

Добавлено: 18 май 2006, 16:10
avenger
Ivan_Pisarevsky писал(а):>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?
А как этот индекс повлияет на операцию выборки и добавления в данную таблицу? Не будет ли "лишнего индекса"?

Добавлено: 18 май 2006, 16:15
avenger
kdv писал(а): что-что? ты это о чем, вообще? зачем в данном случае надо помнить имена системных таблиц?
ты статью-то читал?
Что такое генератор я прекрасно себе представляю. Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.

А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.

Добавлено: 18 май 2006, 16:24
kdv
Вы значение вытаскиваете из системной таблицы RDB$DATABASE, которую мне не так уж и часто приходится использовать.
разумеется. вместо этой таблицы можно использовать вообще любую таблицу. только когда нужна всего одна запись, берется таблица
а) которая всегда есть в БД, даже в пустой
б) в которой всегда есть только одна запись

обоим условиям удовлетворяет rdb$database.

в этом контексте была странной фраза
Как видно из приведенного кода запрос идет к системной таблице, а всех системных таблиц не упомнищь.

Добавлено: 18 май 2006, 16:30
avenger
kdv писал(а):в этом контексте была странной фраза
Я имел ввиду имя системной таблицы RDB$DATABASE, о которой я наслышен, но использовать не приходилось.

Добавлено: 18 май 2006, 17:31
kdv
avenger писал(а):ID генерируется генератором. Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
avenger писал(а):Что такое генератор я прекрасно себе представляю
avenger писал(а):А что приведенный запрос вернет одну запись с новым значением генератора и так понятно.
в общем, тему можно закрыть.

Добавлено: 20 май 2006, 15:11
avenger
kdv писал(а):rdb$database здесь используется как таблица, содержащая только одну запись
Не правильно "прочитал" твою мысль. Теперь понял твою идею. Спасибо за то, что исправляещь наш "лепет" :D ...

Всем спасибо!

Отдельное спасибо Ivan_Pisarevsky!

Код: Выделить всё

CREATE UNIQUE DESC INDEX IDX_Messages_MessageID_Desc ON Messages (MessageID);
очень помог! :D