|
|
|
Запрос с подзапросом
|
|||
|---|---|---|---|
|
#18+
Привет от Ораклистов. Понадобилось в 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2004, 19:40 |
|
||
|
Запрос с подзапросом
|
|||
|---|---|---|---|
|
#18+
пробуй 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2004, 13:27 |
|
||
|
Запрос с подзапросом
|
|||
|---|---|---|---|
|
#18+
У меня версия такая 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 а там чего то нет команды с такими параметрами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 12:37 |
|
||
|
Запрос с подзапросом
|
|||
|---|---|---|---|
|
#18+
Что-то типа такого: 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 исполнить при необходимости по своему вкусу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 21:17 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32487620&tid=2014522]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
157ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 259ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...