powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос?
3 сообщений из 3, страница 1 из 1
Как оптимизировать запрос?
    #32707515
Саня Павлов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый. Много думаю, но решения не вижу. Есть таблица А(id, dt), где id - уникальный номер, dt - дата закачивания информации. Таблица В(id, id_a, sernm, par1, par2), где id - уникальный номер, id_a - связь с таблицей А, sernm - серийный номер, par1, par2 - другие параметры продукта.
Таблица А
1,01.01.2004
2,02.01.2004
3,03.01.2004
4,04.01.2004
Таблица В
1,1,001,0,0
2,1,002,0,1
3,2,001,0,1
4,2,002,0,1
5,2,003,0,0
6,2,004,1,1
7,3,001,0,1
8,3,002,0,1
9,3,003,0,1
10,3,004,0,1
11,4,001,0,1
12,4,002,0,1
13,4,003,1,1
14,4,004,1,1
15,4,005,1,0

Мне нужно вывести продукты, которые появились в таблице в первый раз, т.е. следующую таблицу
1,1,001,0,0
2,1,002,0,1
5,2,003,0,0
6,2,004,1,1
15,4,005,1,0

Запрос следующего вида:
select * from a join b on (a.id = b.id_a) where (select count(bb.id) from b bb where bb.sernm = b.sernm and bb.id_a < b.id_a)=0
даст верный результат. Но на таблице В > 2 млн. записей он выполняется очень, очень долго. Индексы по полям id, id_a, sernm есть. Как мне изменить запрос, чтобы он выполнился за разумный период?
Sybase Adaptive Server Anywhere 7.0.4.3498
...
Рейтинг: 0 / 0
Как оптимизировать запрос?
    #32707651
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саня Павлов
Мне нужно вывести продукты, которые появились в таблице в первый раз, т.е. следующую таблицу
1,1,001,0,0
2,1,002,0,1
5,2,003,0,0
6,2,004,1,1
15,4,005,1,0

Запрос следующего вида:
select * from a join b on (a.id = b.id_a) where (select count(bb.id) from b bb where bb.sernm = b.sernm and bb.id_a < b.id_a)=0
даст верный результат.

вообще-то данный запрос, с желаемым резалтсэтом и с его описанием не имеет ничего общего. Можно уточнить что желается в итоге получить?

Первое появление sernum в таблице B если ее отсортировать по полю id_a? Тогда запрос очень простой:
select * from b b1 where id_a=(select min(id_a) from b b2 where b1.sernm=b2.sernm);


А по поводу запроса
Код: plaintext
select * from a join b on (a.id = b.id_a) where (select count(bb.id) from b bb where bb.sernm = b.sernm and bb.id_a < b.id_a)= 0  
Хочу указать на пару грубых ошибок: во первых если интересуют данные только по таблице B, не нужно делать ее соединения с A. Даже не смотря на то что A является родительской таблицей для B. Во вторых, аггрегат count() требует полного сканирования таблицы, индексы там использоваться не будут.
...
Рейтинг: 0 / 0
Как оптимизировать запрос?
    #32710953
Саня Павлов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое. White Owl.
Вы меня поняли правильно и у меня все получилось с Вашей помощью.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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