Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Запрос с подзапросом / 4 сообщений из 4, страница 1 из 1
09.04.2004, 19:40
    #32476170
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с подзапросом
Привет от Ораклистов. Понадобилось в sybase запрограммировать следующее:
Есть таблица котировок, так могут быть котировки которые дублируют друг друга. Надо удалить все котировки которые имеют дубли. Для этого использую DML
1> delete nik_it_quotes where convert(char(20),secid)+convert(char(20),tradeid)+convert(char(10),secquotedate) in (select convert(char(20),a.secid)+convert(char(20),a.tradeid)+convert(char(10),a.secquotedate) from nik_it_quotes a group by a.secid, a.tradeid, a.secquotedate having count(*)>1)
-- Вот его Explain Plan
2>

QUERY PLAN FOR STATEMENT 1 (at line 1).


STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped COUNT AGGREGATE.

FROM TABLE
nik_it_quotes
a
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.

STEP 2
The type of query is DELETE.
The update mode is direct.

FROM TABLE
nik_it_quotes
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.

FROM TABLE
Worktable1.
EXISTS TABLE : nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
TO TABLE
nik_it_quotes

(106 rows affected)
Execution Time (ms.): 1310000 Clock Time (ms.): 1310000
/* Судя по нему (смотрел и доки) сначал исполняется подзапрос, а потом идет сравнение каждой строки с результатами подзапроса. Однако это все работает 20 Минут (75000 строк в таблице), даже если я индекс создам для tradeid, secid, secquotedate
Я конечно вышел из положения создал промежуточную временную таблицу и получил такой код (работает 40 секунд)
create table #nik_tmp_it_quotes (compkey char(50))
insert into #nik_tmp_it_quotes (compkey) select convert(char(20),a.secid)+convert(char(20),a.tradeid)+convert(char(10),a.secquotedate) as mykey from nik_it_quotes a group by a.secid, a.tradeid, a.secquotedate having count(*)>1
delete nik_it_quotes where convert(char(20),secid)+convert(char(20),tradeid)+convert(char(10),secquotedate) in (select a.compkey from #nik_tmp_it_quotes a)
drop table #nik_tmp_it_quotes
Но мне это надо запихнуть в триггер, а Sybase говорит что нельзя create table и drop table использовать в коде триггера */
Вопрос: Неужели Sybase не может оптимизировать подзапросы например
конструкция select * from tab1 a where a.fiel in (select b.fiel from tab1 b group by b.fiel having count(*)=1) должна исполняться так
сначала подзапрос а потом для каждой строки таблицы проводится проверка на результаты подзапроса.
А тут получается 20 минут это значит для каждой строки выполняется заново подзапрос.
Как заставить оптимизатор работать? (Sybase версии 12)

P S Не считайте наездом, но в Oracle такой же запрос исполняется за 30 секунд без всяких индексов и ухищрениях на тех же данных. При этом базы это тестовые, не загружены, тачка Oracle даже хуже чем у Sybase
select * from tst_quotes a where to_char(a.secid)||to_char(a.tradeid)||to_char(a.secquotedate,'DD.MM.YYYY') in (select to_char(b.secid)||to_char(b.tradeid)||to_char(b.secquotedate,'DD.MM.YYYY') from tst_quotes b group by b.secid, b.tradeid, b.secquotedate having count(*)>1)
...
Рейтинг: 0 / 0
10.04.2004, 13:27
    #32476414
L0cat0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с подзапросом
пробуй

delete from .. from

DELETE [ FIRST | TOP n ]
[ FROM ] [ owner.]table-name
[ FROM table-list ]
[ WHERE search-condition ]

Supported by Adaptive Server Enterprise, including the vendor extension.
...
Рейтинг: 0 / 0
20.04.2004, 12:37
    #32487620
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с подзапросом
У меня версия такая Adaptive Server Enterprise/12.0.0.8/P/EBF 11535 IR/Sun_svr4/OS 5.7/2039
/64bit/FBO/Fri Nov 21 09:17:52 2003
а там чего то нет команды с такими параметрами
...
Рейтинг: 0 / 0
20.04.2004, 21:17
    #32488693
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с подзапросом
Что-то типа такого:

delete nik_it_quotes
from nik_it_quotes d, nik_it_quotes
where nik_it_quotes.secid = d.secid
and nik_it_quotes.tradeid = d.tradeid
and nik_it_quotes.secquotedate = d.secquotedate
and nik_it_quotes.syb_identity < d.syb_identity

convert и замену syb_identity исполнить при необходимости по своему вкусу.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Запрос с подзапросом / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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