powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / И еще один глюк в АСА, теперь и в 9.02.3044
25 сообщений из 25, страница 1 из 1
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064246
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть я сейчас опишу известный факт, но для меня он стал открытием только в последние полгода. И его до сих пор не исправили.(Причем такая байда и во всех АСА6.0х)
ASA плохо работает с индексом по полю с типом данных date. Оптимизатор то и дело игнорирует индекс, и вообще выдает крайне не выгодные планы запросов по такому полю. (Может дело конечно в величине таблицы?!)
Пример:
Таблица branch_cash (12 млн)
Запрос1:
select branch_id,sum(costrozn*qty) as sum_rozn,sum(qty) as sum_qty
from branch_cash
where date_cash between '2005.05.08' and '2005.05.09'
group by branch_id;
План1:
( Plan [ Total Cost Estimate: 131.138582 ]
( WorkTable
( HashGroupBy
( TableScan branch_cash[ ( 2005-05-08 <= branch_cash.date_cash <= 2005-05-09 ) : .1812673785% Statistics ] )
)
)
)
НО!!!:
Запрос2:
select branch_id,sum(costrozn*qty) as sum_rozn,sum(qty) as sum_qty
from branch_cash
where date_cash between '2005.05.10' and '2005.05.13'
group by branch_id;
План2:
( Plan [ Total Cost Estimate: 60.62579409 ]
( WorkTable
( HashGroupBy
( IndexScan branch_cash index_date_cash )
)
)
)
Уверяю, что в выборке с 10 по 13 используется больше записей чем с 8 по 9, но АСА почему-то решила, что при выборке с 8 по 9 нужно сканить таблицу.
Сечас не могу повторить, но была еще такая ситуация: при выборке с "d between d1 and d2" индекс использовался, а в "d between d1 and d1" - нет, а использовалось сканирование таблицы(!!!!!).
При чем такое поведение сервера не наблюдалось при выборках по проиндексированым полям других типов.
Я конечно понимаю, что видимо в конкретном случае у сервера нет статистики по данному полю со значением ранее чем 10.09.05. Но странно то, что даже написав в первом запросе подсказку INDEX FORCE и он, выполнив запрос за миллисекунды, не запоминает, что такой путь короче!!! Т.е. стираем подсказку, и он опять нам выдает план со сканированием...
Запарили меня эти поля с датами. Буду переделывать все на integer, и буду считать дни от некой базы.
Может я не знаю какой-то общеизвестный факт??????????
P.S.:Если попробывать все-таки выполнить первый запрос (ну мало ли что в плане написано))), то я прождал полчаса, дальше не стал. И что поразительно, АСА не откорректировал свою статистику и упорно лезет в сканирование.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064287
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerP.S.:Если попробывать все-таки выполнить первый запрос (ну мало ли что в плане написано))), то я прождал полчаса, дальше не стал. И что поразительно, АСА не откорректировал свою статистику и упорно лезет в сканирование.
А пересоздать статистику (CREATE STATISTICS 'branch_cash') не пробовал?
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064382
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, помогло, но надолго ли?
Три дня назад запрос с 8 по 9 выполнялся, но не выполнялся за более ранние периоды. Где гарантия что это не повторится? Или мне надо всегда ее(create statistics) вызывать после заливки данных?
P.S.:А почему тогда с integer такого никогда не было?
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064448
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer пишет:
> Или мне надо всегда
> ее(create statistics) вызывать после заливки данных?

О, вот оно! Заливка данных. Это может очень сильно нарушить статистику
распределения. Факт действительно общеизвестный и описан в хелпе по
CREATE STATISTICS.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064459
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для тех баз, которые на АСА6? Там нет создания статистики.
P.S.: Статистика помогла, но не для всех запросов. Вот на такой запрос:
select *
from branch_cash
where date_cash between dateadd(day,-1,today()) and today() ;
Вот такой план:
( Plan [ Total Cost Estimate: 30.738638 ]
( TableScan branch_cash[ ( expr( branch_cash.date_cash ) >= expr( 3, -1 ) : 25% Guess ) AND ( branch_cash.date_cash <= expr() : 100% Statistics ) ] )
)
Так что увы и ах. С датами что-то не то...
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064494
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, пересоздал статистику, по таблице и по полю. С таблицей никто кроме меня не работает.
Смотрите:
Запрос1:
select *
from branch_cash
where date_cash in ( dateadd(day,-1,today()) ,today());

План1:
( Plan [ Total Cost Estimate: 30.738638 ]
( TableScan branch_cash[ ( expr( branch_cash.date_cash ) = expr( 3, -1 ) : .1953125% Column ) OR ( branch_cash.date_cash = expr() : .0001% Statistics ) : .1954125% Combined ] )
)
Запрос2:
select *
from branch_cash
where date_cash=dateadd(day,-1,today());

План2:
( Plan [ Total Cost Estimate: .0602513906 ]
( IndexScan branch_cash index_date_cash[ expr( branch_cash.date_cash ) = expr( 3, -1 ) : .1953125% Column ] )
)
Запрос3:
select *
from branch_cash
where date_cash=today();

План3:
( Plan [ Total Cost Estimate: .0002457386 ]
( IndexScan branch_cash index_date_cash )
)
P.S.: А вот в таком случае статистика вообще не причем, это чистая работа оптимизатора: делаем выборку "d between d1 and d2" - чтение таблицы, делаем "d in (d1,...,d2)" - как не удивительно, через индекс. Складывается впечатление, что дату, а точнее индекс по ней АСА хранит в каком-то "неюзабельном" виде.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064501
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer пишет:

> А для тех баз, которые на АСА6? Там нет создания статистики.

В ASA6 было кажется DROP OPTIMIZER STATISTIC. После этого статистика
автоматом накапливалась по мере выполнения разных запросов к таблице.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064527
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун
О, вот оно! Заливка данных.
Заливка Insert'ами, а не load'ом. Это я так выразился просто.

Ладно с АСА6, а тут-то как? Перестроил статистику, так ведь не помогло! (см.выше)
Что с этим-то делать?
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064603
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот одного не понимаю - Вы упорно подсовываете оптимизатору запросы с OR, IN и BETWEEN (< , >) и хотите чтобы на эти самые страшные операции ASA всегда использовала индексы. Причем ни разу самого индексе не привели - может он по составному полю сделан и тогда вообще другие правила в игру вступают.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064655
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между прочем, IN, BETWEEN, >=,<= - это не тоже самое, что OR, статью о предикатах я читал. А то, что оптимизатор решил перевести IN в OR - его проблемы.
Во всяком случае, на запрос
select *
from branch_cash
where date_cash >= dateadd(day,-1,today());

идет чтение таблицы. А если бы поле было числовым, то сервер схватил бы индекс.
А индекс составной, (date_cash desc,branch_id asc), а что в таком случае меняется? Ну пусть ход мыслей оптимизатора будет другой, меня-то это не должно трогать, главное чтобы план был нормальный. Ведь с подсказкой-то делает через индекс, зараза, и за доли секунды.
Хотя я пробовал и простой индекс делать и больше никаких индексов на тестовой таблице. И все равно теже проблемы.

P.S.:Я же писал про случай, когда в запросе были перечислены все даты диапазона через IN и АСА делал такой запрос через индекс . А когда тот же диапазон написал через between или >=, то использовал чтение таблицы.
Неужели ни у кого нет проблем выборок по дате?
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064679
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня честно говоря нет. Дат много, в составном PK бывает используются. За основное правило я держу, что дата в составном индексе должна идти последней. Очень редко, когда оптимизатор вдруг решает использовать Table Scan, в основном по причине низкой селективности индекса. В таких случаях и просто по другому делаю индекс. Мне кажется это Ваш случай (слишком много рыться по индексу). Может быть стоит сделать вычисляемое поле, например:
Код: plaintext
c_Month char( 7 ) COMPUTE(LEFT(date_cash,  7 ))
индекс на него и искать как
Код: plaintext
1.
2.
3.
select *
from branch_cash
where date_cash >= dateadd(day,- 1 ,today()) AND
         c_Month = LEFT(dateadd(day,- 1 ,today()));
Тогда ASA воспользуется индексом, быстро найдет месяц, по нему возьмет все записи и фильтром уже выберет нужные без всяких TABLE SCAN.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064727
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше заведу-ка я поле smallint, вычисляемое от даты, как i=date_cash - convert(date,'2000.01.01'). И по нему индекс.
Все-таки smallint по-лучше будет чем varchar. Попробую так.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33064750
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerЛучше заведу-ка я поле smallint, вычисляемое от даты, как i=date_cash - convert(date,'2000.01.01'). И по нему индекс.
Все-таки smallint по-лучше будет чем varchar. Попробую так.
Можно и так. Хозяин барин, главное это идея должна сработать :)
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065043
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, вот зараза!!!!!!! Остается только ругаться....
Сделал computed field day_id, с его участием составной индекс(day_id,branch_id)
И вот какие результаты:
Запрос1:
select *
from branch_cash
where day_id >= convert(date,'2005.05.14') - convert(date,'2000.01.01') - 10 ;

План1:
( Plan [ Total Cost Estimate: 30.738638 ]
( TableScan branch_cash[ expr( branch_cash.day_id ) >= expr( '2005.05.14', -1, '2000.01.01', -1, 10 ) : 25% Guess ] )
)
Запрос2:
select *
from branch_cash
where day_id >= 1950;

План2:
( Plan [ Total Cost Estimate: .919294 ]
( IndexScan branch_cash day_branch_key[ branch_cash.day_id >= 1950 : 2.98998009% Statistics ] )
)
Запросы-то одинаковые!!! Я так понял, по выделенному синим, оптимизатор считает что над полем совершается какая-то функция и ее результат используется для отбора, поэтому и индекс не использует. А на самом-то деле никакой функции нет.
Ладно хоть можно по константе отбирать с использованием индекса.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065108
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык я рекомендовал сделать индекс для того, чтобы искать по его равенству, а не затем, чтобы опять на него операции сравнения навешивать. Поэтому и порекомендовал сделать опять же char-овское поле, чтобы можно было по индексу выбрать спокойно нодами в индексе только нужные месяца, а уж потом сканить таблицу на предмет дат, какие подходят. То есть при моем поле запросы был бы такой:
Код: plaintext
1.
2.
select *
from branch_cash
where с_month >= left('2005.05.14',  7 ) and date_cash >= '2005.05.14';

P.S. Можно еще вместо стрингового поля сделать int поле, которое вычисляется как Year(date_cash) * 10000 + Month(date_cash).
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065113
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще одна сопутствующая проблема при выборках по дате:
Запрос1:
select *
from branch_cash
where branch_cash.date_cash>=dateadd(day,-60,convert(date,'2005.05.04')) and
branch_cash.date_cash<=current date;
План1:
( Plan [ Total Cost Estimate: 30.738638 ]
( TableScan branch_cash[ ( expr( branch_cash.date_cash ) >= expr( 3, -60, '2005.05.04', -1 ) : 25% Guess ) AND ( branch_cash.date_cash <= expr() : 100% Statistics ) ] )
)
Запрос2:
select *
from branch_cash
where branch_cash.date_cash>=dateadd(day,-60,convert(date,'2005.05.04')) and
branch_cash.date_cash<=convert(date,'2005.05.14');
План2:
( Plan [ Total Cost Estimate: 7.684873 ]
( IndexScan branch_cash index_date_cash[ expr( branch_cash.date_cash ) >= expr( 3, -60, '2005.05.04', -1 ) : 25% Guess ] )
)
Замена переменной на константу влияет на план?!
Может быть "convert(date,'2005.05.14')" и "current date" и не одно и тоже, но почему тогда нигде нет упоминания о таких различиях в использовании.?..(
Замучил я наверно тут всех своими датами. Но я долго не хотел признавать проблемы в работе оптимизатора АСА, пока не стал его сильно ковырять, ибо достала не постоянность его(оптимизатора) "взглядов" на запросы. И возможно тут дело не только в датах.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065114
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку - суть составного поля в том, чтобы одной нодой захватить группу записей, а не чтобы одна нода индекса равнялась одной записи в таблице. Толку от такого индекса то ... записи таблицы дублировать в холостую. Вот ASA и лезет на скан, кому охота сканить дважды большой индекс и потом записи таблицы, оптимизатор думает что это дополнительные накладные расходы.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065150
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSДык я рекомендовал сделать индекс для того, чтобы искать по его равенству, а не затем, чтобы опять на него операции сравнения навешивать.
Ну так вот
select *
from branch_cash
where day_id >= 1950;

так-то работает нормально. Значит дело не в виде индекса.
Вы предлагаете мне смоделировать работу составного индекса.
Но в этой ситуации какие различия? Кроме синтаксических - никаких. Значит надо править им оптимизатор.
А сделаю так, убью доп.поле(day_id), вообщем вернуть все обратно как было. Просто в запросе уберу все ссылки на today(). На клиента перенесу вычисление дат.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065262
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, завершающий аккорд(branch_day_rest 86 млн, PK - составной (day_rest,...)):
Запрос1:
select *
from branch_day_rest
where day_rest between '2005.03.14' and '2005.05.14';

План1:
( Plan [ Total Cost Estimate: 829.306464 ]
( TableScan branch_day_rest[ ( 2005-03-14 <= branch_day_rest.day_id <= 2005-05-14 ) : 54.07456114% Statistics ] )
)
Запрос2:
select *
from branch_day_rest
where day_rest between convert(date,'2005.03.14') and convert(date,'2005.05.14');

План2:
( Plan [ Total Cost Estimate: 220.810038 ]
( IndexScan branch_day_rest branch_day_rest )
)
Ну тут я вообще понял, что мне пора отдыхать...)
P.S.: Честное слово, больше писать не буду. Уважаемый ASCRUS, если Вы сочтете необходимым, то передайте привет разработчикам АСА, а то, я инглиша разговорного не знаю.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065277
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerИ, завершающий аккорд(branch_day_rest 86 млн, PK - составной (day_rest,...)):
Запрос1:
select *
from branch_day_rest
where day_rest between '2005.03.14' and '2005.05.14';

План1:
( Plan [ Total Cost Estimate: 829.306464 ]
( TableScan branch_day_rest[ ( 2005-03-14 <= branch_day_rest.day_id <= 2005-05-14 ) : 54.07456114% Statistics ] )
)
Запрос2:
select *
from branch_day_rest
where day_rest between convert(date,'2005.03.14') and convert(date,'2005.05.14');

План2:
( Plan [ Total Cost Estimate: 220.810038 ]
( IndexScan branch_day_rest branch_day_rest )
)
Ну тут я вообще понял, что мне пора отдыхать...)
P.S.: Честное слово, больше писать не буду. Уважаемый ASCRUS, если Вы сочтете необходимым, то передайте привет разработчикам АСА, а то, я инглиша разговорного не знаю.
Беда в том, что я тоже не знаю. Все равно - сделайте графические планы, сохраните их через ISQL и приложите к сообщению в архиве. Я посмотрю их, подумаю, что может быть, потом может в форум к ним выложу.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065434
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А-а-а, я понял. По крайней мере часть проблем можно объснить следующим: когда мы указываем в where выражение типа "date between '...' and '...' " или "date>= '...' ", то АСА(!!!!), никому ничего не сказав, конвертирует date в строку, т.е. ищет такие записи, для которых строка полученная из date удовлетворяет условию!!!! А не строки конвертируются в дату! Вот. Почему АСА так делает по умолчанию - видимо ему так видней. (Кстати когда пишем равенство, АСА сообржает что можно заюзать индекс, не смотря на конвертацию из даты в строку, т.к. функция дата<->строка обратима...!)
Но этим объясняется только часть проблем.
Мне, например, все равно остается непонятным, почему
where day_id >= convert(date,'2005.05.14') - convert(date,'2000.01.01') - 10 и where day_id >= 1950 не одно и тоже. А ведь это уже выборка по целочисленному полю. Видимо оптимизатор тут тоже хочет day_id во что-то конвертить.
А также, сохраняется неустойчивое поведение оптимизатора при использовании функций (даже с константными аргументами!!!) в условиях запросов, таких как today(),current date,dateadd().
Во всяком случае, все "завихи" оптимизатора поборол, в чем-то виноват он, в чем-то я. Но результат есть. Так что думаю, что разработчикам АСА это можно не показывать...
P.S.:Хотя тот факт, что он молча преобразует дату в строку, и ничего не говорит - напрягает. Хоть бы выругался о несоответствии типов....
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33065446
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему это напоминает гадание на кофейной гуще :) У меня ASA все нормально делает с датами, никуда никакие поля-даты к стрингам не приводит и константы и переменные нормально работают. Так что выводы абсолютно безосновательны и нельзя их делать только из за того, что ASA тогда то не использует индексы, а тогда то использует. Первую причину я уже назвал - это слишком большой индекс при слишком большой таблице.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33067338
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSБеда в том, что я тоже не знаю.
А там не разговорный, там письменный нужен :). Было бы что выкладывать, а выложить не проблема...


Кстати, мучил я тут на днях один запросец... На ASA8 выполняется 27 секунд, на ASA9 - 23 секунды. Прогресс? Возможно. Только вот на 5.5 этот же запрос выполняется за 11 секунд. Грустно...

Отмазка: время замерял на одном и том же (домашнем) компе. БД создана под 8.0.2, для 5.5 - специально перезакачивал. Размер кэша - одинаковый (-с 250М), новые сервера имели бонус в виде Dynamic cache sizing (5.5 этого не умеет). Планы выполнения запросов, похоже, одинаковые.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33067538
Vlad_5181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 iLLer
ИМХО, индекс используется при однозначном формате даты.
...
Рейтинг: 0 / 0
И еще один глюк в АСА, теперь и в 9.02.3044
    #33067965
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2iLLer:
Насчет преобразований дат - не знал, что есть такая заморочка.
Но я обычно все свои запросы оформляю как хп. Соответсвенно при передаче строкового значения даты в ХП, аргумент которой объявлен как datetime преобразование строка-дата происходит еще при передаче параметров в ХП. Соотвественно такая проблема как у вас не возникает.
Неожиданное итого: ХП ориентированный подход избавляет от редких капканов, даже от тех о которых и не подозреваешь....

все наши на www.corba.kubsu.ru
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / И еще один глюк в АСА, теперь и в 9.02.3044
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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