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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

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

Сообщение avenger » 17 май 2006, 10:22

Привет всем!

Подскажите пожалуйста, чем можно заменит 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 сек), а в моем случае это недопустимо.

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 май 2006, 10:28

смотря зачем ты используешь max.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 17 май 2006, 10:30

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 май 2006, 12:10

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 17 май 2006, 12:38

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 май 2006, 13:02

Т.е. достаточно вытащить текущее значение генератора. Если да, то подскажите как?
www.ibase.ru/devinfo/generator.htm

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

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 17 май 2006, 13:48

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 17 май 2006, 14:41

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

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 май 2006, 15:04

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

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

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 18 май 2006, 11:00

>Как его поменять?
Добавить еще один десендинг индекс совсем не судьба?

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 18 май 2006, 16:10

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 18 май 2006, 16:15

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 май 2006, 16:24

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

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

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 18 май 2006, 16:30

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 май 2006, 17:31

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 20 май 2006, 15:11

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

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

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

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

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

Ответить