Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странно работают коррелированные запросы в ASA 9.0.2 / 12 сообщений из 12, страница 1 из 1
01.09.2005, 19:38
    #33247107
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
Имеем ASA 9.0.2.3044

Есть 2 таблицы – операций и проводок со связью 1 ко многим :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create table OPS
(OPS_ID integer not null default autoincrement,
DAT       date                           not null,
CST_ID  integer,
       .
       .
       .
primary key (OPS_ID));

create table COR (
    cor_id    integer  not null default autoincrement,
    OPS_ID  integer,
    DB        char( 5 )             not null,
    CR        char( 5 )             not null,
    S_P       numeric( 12 , 2 )    not null default  0 . 0 ,
       .
       .
       .
    primary key (cor_id)
);

alter tableCOR
   add constraint foreign key (OPS_ID)
      references OPS (OPS_ID)
      on update cascade
      on delete cascade;
Для построения отчета выбираются операции определенного контрагента за период по заданному счету в проводках. Запрос примерно такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT OPS.DAT,
	   (select sum(s_p) from cor c 
           		where c.ops_id=ops.ops_id and c.db ='3611' ) as SUM_DB,
	   (select sum(s_p) from cor c 
		where c.ops_id=ops.ops_id and c.cr ='3611' ) as SUM_CR,
	(select name from cst where cst_id= 350 ),
   .
   .
   .
from ops
 where  OPS.DAT between dbeg and dend ) and OPS.CST =  350 
    and (SUM_DB<> 0  OR SUM_CR<> 0 )

Поскольку за период могут быть операции этого контрагента не затрагивающие интересующий нас счет их и отсекли условием :
and (SUM_DB<>0 OR SUM_CR<>0)

Я понимаю, что решение идеологически неправильное, но В ASA 7.xx и A8.xx все прекрасно работало. Под 9 такой запрос тормозит в сотни раз :(

Стоило заменить последнее условие на
Код: plaintext
1.
exists(select  1  from cor where  cor.ops_id=ops.ops_id AND (cr ='3611' or db ='3611'))

как запрос стал летать. Вместо 15…20 минут выполняется за 2..5 секунд.

В первой таблице около 50 000 строк, во второй около 160 000. В выборку попадает от 2 до 15 строк из первой таблицы и 20…30 строк из второй .

Что это – глюк оптимизатора ? План запроса никаких дырок не показывает. Все таблицы сканируются по индексам (с приличной селективностью)

Реальный запрос более сложный и есть необходимость строить его именно по таблице операций.

И я знаю примерно 5 вариантов, как правильно его переписать :-)).

Напрягает, что это уже не первая проблема с подзапросами при переходе на 9 версию :(.

Что-то они все-таки намудрили с оптимизацией аггрегирующих функций :(
...
Рейтинг: 0 / 0
01.09.2005, 20:05
    #33247125
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
Ну дык новая версия, другой принцип работы. Запросы сделаные под один оптимизатор не обязаны идеально ложиться под другой :)
А вообще мне оптимизатор девятки показалась намного более умным.
...
Рейтинг: 0 / 0
01.09.2005, 22:33
    #33247205
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
9 версия гораздо эффективнее работает с запросами по большИм объемам данных, да и не по большим тоже.!
Если у вас есть проблемы с выборками на предыдущих версиях, так, что даже грамотное проектирование не помогает - то советую обратить пристальное внимание на 9-ку. Пожалеть не должны...
...
Рейтинг: 0 / 0
02.09.2005, 09:51
    #33247568
michael_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
А я тоже заметил несколько странностей оптимизатора при переходе на 9-ку.

Мои впечатления - в целом стало все побыстрее, но вот некоторрые весьма однозначные запросы тормозят. Приходится их перестраивать извращенным образом. Причем при смене EBF ситуация в корне менялась, одни запросы стали выполняться как и на прошлых версиях быстро, зато другие тормознули.

В целом не смертельно, но неприятно.

Скорее всего, как всегда, будет работать правило 3-го релиза. Надо дождаться 9.0.3, в 6-ке и 8-ке так и было :)
...
Рейтинг: 0 / 0
02.09.2005, 11:17
    #33247814
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
White Owl
А вообще мне оптимизатор девятки показалась намного более умным.

То-то и оно :(. Я смотрел план запроса, крутил его и так и этак - никакой крамолы нету. Все таблтцы поднимаются по индексам, никакого fullscan. И такие тормоза в конце.
...
Рейтинг: 0 / 0
08.09.2005, 12:31
    #33258404
double_axe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
вместо

SELECT OPS.DAT,
(select sum(s_p) from cor c
where c.ops_id=ops.ops_id and c.db ='3611' ) as SUM_DB,
(select sum(s_p) from cor c
where c.ops_id=ops.ops_id and c.cr ='3611' ) as SUM_CR,
(select name from cst where cst_id=350),
.
.
.
from ops
where OPS.DAT between dbeg and dend ) and OPS.CST = 350
and (SUM_DB<>0 OR SUM_CR<>0)

попробуй

SELECT OPS.DAT, t1.SUM_DB , t2.SUM_CR, (select name from cst where cst_id=350),
.
.
.
from ops,
Lateral (select sum(s_p) SUM_DB from cor c
where c.ops_id=ops.ops_id and c.db ='3611' ) as t1,
Lateral( select sum(s_p) SUM_CR from cor c
where c.ops_id=ops.ops_id and c.cr ='3611' ) as t2

where OPS.DAT between dbeg and dend ) and OPS.CST = 350
and (SUM_DB<>0 OR SUM_CR<>0)
...
Рейтинг: 0 / 0
09.09.2005, 23:54
    #33262346
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
double_axe
попробуй
SELECT OPS.DAT, t1.SUM_DB , t2.SUM_CR, (select name from cst where cst_id=350),
.
.
.
from ops,
Lateral (select sum(s_p) SUM_DB from cor c
where c.ops_id=ops.ops_id and c.db ='3611' ) as t1,
Lateral( select sum(s_p) SUM_CR from cor c
where c.ops_id=ops.ops_id and c.cr ='3611' ) as t2

where OPS.DAT between dbeg and dend ) and OPS.CST = 350
and (SUM_DB<>0 OR SUM_CR<>0)

С Lateral() работает. Но возникает неприятное чувство, что с вынесением вычисления агрегатных функций в отдельный блок "с целью оптимизации и ускорения" оптимизатор сильно поглупел. :(

А особенно противно, что с каждой новой версиеий сервера приходится переписывать десятка по 2 запроса и ХП, т.к. обязательно что-то начинает тормозить со страшной скоростью !

Я уже не говорю о случае, когда в ASA8 для функций Months(), Days(), Seconds() и т.п. поменяли умалчиваемую начальную дату, а сообщить об этом в документации забыли. То-то весело было :(
...
Рейтинг: 0 / 0
10.09.2005, 00:49
    #33262357
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
Графический план запроса пожалуйста сохраните в ISQL и выложите сюда присоединенным файлом.

P.S. ASA 9 не любит SELECT в SELECT. Лучше писать подзапросы в FROM. И подумайте насчет:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT OPS.DAT, 
  sum(IF c.db = '3611' THEN c.s_p ELSE  0  ENDIF) AS SUM_DB,
  sum(IF c.cr = '3611' THEN c.s_p ELSE  0  ENDIF) AS SUM_CR
from ops
  inner join cor c ON c.ops_id=ops.ops_id AND (c.db = '3611' OR c.cr = '3611')
where  (OPS.DAT between dbeg and dend) 
  and OPS.CST =  350 
Вполне может оказаться, что оптимизатору будет легче соединить "ops" с "cor" по "ops_id" и на одном проходе таблицы по индексу сразу посчитать одновременно сумму дебита и кредита, чем сканить ее дважды, да еще подзапросами. Условие (SUM_DB<>0 OR SUM_CR<>0) будет не нужно, так как по INNER JOIN вытащится хоть одна запись по '3611'.
...
Рейтинг: 0 / 0
11.09.2005, 18:19
    #33263008
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
ASCRUSГрафический план запроса пожалуйста сохраните в ISQL и выложите сюда присоединенным файлом.

Завтра, если успею :(

ASCRUS
P.S. ASA 9 не любит SELECT в SELECT. Лучше писать подзапросы в FROM. И

Вот странно. До 9 версии любила, а теперь резко разлюбила :(.
Я смотрел план - все таблицы сканятся по индексам или ключам как при наличии (SUM_DB<>0 OR SUM_CR<>0), так и без него.

ASCRUS
подумайте насчет:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT OPS.DAT, 
  sum(IF c.db = '3611' THEN c.s_p ELSE  0  ENDIF) AS SUM_DB,
  sum(IF c.cr = '3611' THEN c.s_p ELSE  0  ENDIF) AS SUM_CR
from ops
  inner join cor c ON c.ops_id=ops.ops_id AND (c.db = '3611' OR c.cr = '3611')
where  (OPS.DAT between dbeg and dend) 
  and OPS.CST =  350 
Вполне может оказаться, что оптимизатору будет легче соединить "ops" с "cor" по "ops_id" и на одном проходе таблицы по индексу сразу посчитать одновременно сумму дебита и кредита, чем сканить ее дважды, да еще подзапросами. Условие (SUM_DB<>0 OR SUM_CR<>0) будет не нужно, так как по INNER JOIN вытащится хоть одна запись по '3611'.

Но тут не хватает group by. Реальный запрос сложнее - у операции есть еще масса атрибутов, которые нужно показывать в отчете :(
И я писал уже, что знаю еще много вариантов, как переписать этот запрос, чтобы он работал.

А вопрос состоял в том, что в ASA6,7,8 этот запрос и еще пара подобных работали без проблем. А теперь перестали.
...
Рейтинг: 0 / 0
12.09.2005, 19:34
    #33264981
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
авторИмеем ASA 9.0.2.3044и у меня были проблемы с некоторыми запросами на этом билде. После обновления до 3124 все стало нормально. И настроение у меня улучшилось... =)
...
Рейтинг: 0 / 0
13.09.2005, 19:12
    #33267370
dp_tnd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
rcryo авторИмеем ASA 9.0.2.3044и у меня были проблемы с некоторыми запросами на этом билде. После обновления до 3124 все стало нормально. И настроение у меня улучшилось... =)

Проблема решилась. Дело оказалось не в билде, а в том, что БД была свежеперегруженная. И статистика по таблицам построилась криво :(.

Первые сомнения у меня появились в тот момент, когда запросы вдруг пересстали тормозить! Я задумался и стал анализировать действия, но ничего, кроме выполнения разных вариантов запросов, правда в большом количестве я с БД не делал.

Взял БД в состоянии до начала экспериментов - опять тормоза. Тогда я сделал для основных таблиц, затрагиваемых в запросе, CREATE STATISTICS. И все заработало.

Правда и тут наблюдались странности : первые 2 запроса после создания статистики тормозили, а после этого стало работать нормально.

Что-то все-таки с созданием статистики работает не так, как я ее понимаю :(.
Основные данные в БД заливались через временные таблицы, т.е. выполнялись запросы типа
Код: plaintext
1.
2.
3.
4.
5.
 input into tmp_ops from ...
-- потом некоторая чистка и обработка
-- а следом заливка в рабочую таблицу
 insert into ops(ops_id,ops_date...)
 select ops_id,ops_date... from tmp_ops
 where ...
Значит статистика должна была постоится. А она получилась какая-то неправильная.

Возникает вопрос - что я делаю не так? :)
...
Рейтинг: 0 / 0
14.09.2005, 07:07
    #33267700
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странно работают коррелированные запросы в ASA 9.0.2
Вчера, когда 3182 качал, читал его readme - где то там как раз было указание на исправление бага с неправильным построением статистики. Почитайте поподробнее на sybase.com, может быть это как раз Ваша проблема.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странно работают коррелированные запросы в ASA 9.0.2 / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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