powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как ускорить?
25 сообщений из 43, страница 1 из 2
Как ускорить?
    #34306373
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть апдейт (это расчет рыночной стоимости)
update tr_bill_in_portfolio
set rate = convert(decimal(30,10),(select sum(isnull(#rate_by_day.rate,0)*tmp_bill_in_qty_by_day.qty)
from tmp_bill_in_qty_by_day,
#rate_by_day
where tmp_bill_in_qty_by_day.sub_id=tr_bill_in_portfolio.subacc_id
and tmp_bill_in_qty_by_day.stock_id=tr_bill_in_portfolio.stock_id
and #rate_by_day.stock_id=tmp_bill_in_qty_by_day.stock_id
and #rate_by_day.day=tmp_bill_in_qty_by_day.day

)/ @days)
where id=@id
and tr_bill_in_portfolio.place_id=@tmp_com_id

Наблюдаются страшнейшие тормоза...конечно тут играет роль большой объем таблиц ,например tmp_bill_in_qty_by_day около 900000 записей,#rate_by_day около 200000... В частости дико тормозит не только выборка данных, но и конвертация в децимал.
Может можно что-то сделать с этим?
...
Рейтинг: 0 / 0
Как ускорить?
    #34306459
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть вот такие индексы
id subacc_id stock_id place_id id,place_id,act_acc_id id, place_id, subacc_id, stock_id
...
Рейтинг: 0 / 0
Как ускорить?
    #34306717
лень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че индексы... ты план запроса покажи...
set showplan on
set noexec on
и прогони свой запрос...

И покажи DDL этих таблиц и индексов...
...
Рейтинг: 0 / 0
Как ускорить?
    #34306796
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fantasmo пишет:

> Наблюдаются страшнейшие тормоза...конечно тут играет роль большой объем
> таблиц ,например tmp_bill_in_qty_by_day около 900000
> записей,#rate_by_day около 200000... В частости дико тормозит не только
> выборка данных, но и конвертация в децимал.

Конвертация в децимал вас не должна волновать вообще. Вас должен
волновать план запроса. Конвертация в децимал будет в любом случае
занимать много меньше времени чем обработка одной записи.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34306824
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create table #accounts (
id numeric,
bill_sum decimal(30,10),
bill_price decimal(30,10) null
)

create table #days (day datetime)

create table #qty_by_day (
stock_id numeric,
sub_id numeric,
day datetime,
qty decimal(30,10)
)

create table #rate_by_day
(
day datetime,
stock_id numeric,
rate decimal(30,10) null,
max_day datetime null,
min_day datetime null
)

create table #tmp_days(day datetime)
--------------------------------------------------------
print 'tr_bill_in_portfolio'
SETUSER 'dbo'
go

create table dbo.tr_bill_in_portfolio (
id numeric(18, 0) not null,
subacc_id numeric(18, 0) not null,
stock_id numeric(18, 0) not null,
qty decimal(30, 10) not null,
rate decimal(30, 10) null,
bill_sum decimal(30, 10) null,
place_id numeric(18, 0) null,
act_acc_id numeric(18, 0) null
)
lock datapages
on 'default'
go

print 'tr_bill_in_portfolio_01'
create nonclustered index tr_bill_in_portfolio_01
on dbo.tr_bill_in_portfolio (id)
on 'default'
go

print 'tr_bill_in_portfolio_02'
create nonclustered index tr_bill_in_portfolio_02
on dbo.tr_bill_in_portfolio (subacc_id)
on 'default'
go

print 'tr_bill_in_portfolio_03'
create nonclustered index tr_bill_in_portfolio_03
on dbo.tr_bill_in_portfolio (stock_id)
on 'default'
go

print 'tr_bill_in_portfolio_04'
create nonclustered index tr_bill_in_portfolio_04
on dbo.tr_bill_in_portfolio (place_id)
on 'default'
go

print 'tr_bill_in_portfolio_05'
create nonclustered index tr_bill_in_portfolio_05
on dbo.tr_bill_in_portfolio (id, place_id, act_acc_id)
on 'default'
go

print 'tr_bill_in_portfolio_06'
create nonclustered index tr_bill_in_portfolio_06
on dbo.tr_bill_in_portfolio (id, place_id, subacc_id, stock_id)
on 'default'
go

SETUSER
go
-----------------------------------------------

update tr_bill_in_portfolio
set rate = convert(decimal(30,10),(select sum(isnull(#rate_by_day.rate,0)*#qty_by_day.qty)
from #qty_by_day,
#rate_by_day
where #qty_by_day.sub_id=tr_bill_in_portfolio.subacc_id
and #qty_by_day.stock_id=tr_bill_in_portfolio.stock_id
and #rate_by_day.day=#qty_by_day.day
and #rate_by_day.stock_id=#qty_by_day.stock_id

)/ @days)
where id=@id
and tr_bill_in_portfolio.place_id=@tmp_com_id
...
Рейтинг: 0 / 0
Как ускорить?
    #34306982
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
План
---------------------
QUERY PLAN FOR STATEMENT 245 (at line 1035).




STEP 1
The type of query is UPDATE.
The update mode is direct.


FROM TABLE
tr_bill_in_portfolio
Nested iteration.
Index : tr_bill_in_portfolio_05
Forward scan.
Positioning by key.
Keys are:
id ASC
place_id ASC


Run subquery 1 (at nesting level 1).
Using I/O Size 4 Kbytes for index leaf pages.
With LRU Buffer Replacement Strategy for index leaf pages.
Using I/O Size 4 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
TO TABLE
tr_bill_in_portfolio


NESTING LEVEL 1 SUBQUERIES FOR STATEMENT 245.


QUERY PLAN FOR SUBQUERY 1 (at nesting level 1 and at line 1036).


Correlated Subquery.
Subquery under an EXPRESSION predicate.




STEP 1
The type of query is SELECT.
Evaluate Ungrouped SUM OR AVERAGE AGGREGATE.


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


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


END OF QUERY PLAN FOR SUBQUERY 1.
...
Рейтинг: 0 / 0
Как ускорить?
    #34307037
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В начале поста запрос немного другой.
Смотреть на этот;)

update tr_bill_in_portfolio
set rate = convert(decimal(30,10),(select sum(isnull(#rate_by_day.rate,0)*#qty_by_day.qty)
from #qty_by_day,
#rate_by_day
where #qty_by_day.sub_id=tr_bill_in_portfolio.subacc_id
and #qty_by_day.stock_id=tr_bill_in_portfolio.stock_id
and #rate_by_day.day=#qty_by_day.day
and #rate_by_day.stock_id=#qty_by_day.stock_id

)/ @days)
where id=@id
and tr_bill_in_portfolio.place_id=@tmp_com_id
...
Рейтинг: 0 / 0
Как ускорить?
    #34307054
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fantasmo пишет:

> FROM TABLE
> #qty_by_day
> Nested iteration.
> Table Scan.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Forward scan.
> Positioning at start of table.
> Using I/O Size 4 Kbytes for data pages.
> With LRU Buffer Replacement Strategy for data pages.
>
>
> FROM TABLE
> #rate_by_day
> Nested iteration.
> Table Scan.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Forward scan.
> Positioning at start of table.
> Using I/O Size 4 Kbytes for data pages.
> With LRU Buffer Replacement Strategy for data pages.

Вот если от этих table scan-ов избавитесь, то будет вам счастье
процентов на 95. Избавляться надо путем добавления индексов (если нет еще)
на условия JOIN-ов и корреляции и проставления в запрос хинтов
INDEX с ними.

Запрос после этого надо тщательно тестировать с проверкой плана и IO.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34307067
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Вот если от этих table scan-ов избавитесь, то будет вам счастье
процентов на 95. Избавляться надо путем добавления индексов (если нет еще)
на условия JOIN-ов и корреляции и проставления в запрос хинтов
INDEX с ними.


это зависит от размера временных таблиц...
вполне возможно, что при малом количестве записей в них индексы счастья не принесут :)

MasterZiv
Запрос после этого надо тщательно тестировать с проверкой плана и IO.

это да, без этого никуда.
...
Рейтинг: 0 / 0
Как ускорить?
    #34307167
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицы здоровенные
...
Рейтинг: 0 / 0
Как ускорить?
    #34307231
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FantasmoТаблицы здоровенные
ну тогда MasterZiv прав

надо избавляться от table scan
замерьте сколько по времени у вас будут рисоваться необходимые индексы по этим #-таблицам
если этот overhead вас устроит, то рисуйте индексы после заполнения этих таблиц
иначе - переписывать/модифицировать логику запроса/процедуры...
...
Рейтинг: 0 / 0
Как ускорить?
    #34307266
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad пишет:

> это зависит от размера временных таблиц...
> вполне возможно, что при малом количестве записей в них индексы счастья
> не принесут :)

Согласен на все 100%. Однако аффтар уже написал что по крайней мере
одна таблица имеет около 1M строк.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34307277
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad пишет:
> если этот overhead вас устроит, то рисуйте индексы после заполнения этих
> таблиц

Кстати если так делать, то индексы могут подхватиться оптимизатором
и без хинтов. Одна из техник работы с индексами на временных
таблицах заключается в создании индексов ПОСЛЕ заполнения временной таблицы.
Тогда оптимизатор будет уже знать статистику по полям индекса и будет
ее учитывать. Но это не на всех версиях ASE.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34307301
лень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем почти наверняка придется фиксировать хинтами индексы на временные таблицы, или еще лучше сначала залить данные во временные таблицы, потом создать индексы, а в другом батче или процедуре уже использовать это богатство, дабы облегчить жизнь оптимизатору...
...
Рейтинг: 0 / 0
Как ускорить?
    #34307357
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASE 12.0
...
Рейтинг: 0 / 0
Как ускорить?
    #34307625
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть только одна проблема. Вроде бы ASE 12.0 не будет использовать индексы в процедуре на временные таблицы.
т.е в таком случае индекс на временную таблицу просто лишняя трата времени
...
Рейтинг: 0 / 0
Как ускорить?
    #34307629
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А делать не временные как-то не очень хочется...
...
Рейтинг: 0 / 0
Как ускорить?
    #34308575
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал таблицы не временными... теперь переполняется лог при инсерте...
...
Рейтинг: 0 / 0
Как ускорить?
    #34308676
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FantasmoСделал таблицы не временными... теперь переполняется лог при инсерте...
вставлять батчами, по нескольку десятков тысяч, а не "одним селектом всё"
...
Рейтинг: 0 / 0
Как ускорить?
    #34308681
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad FantasmoСделал таблицы не временными... теперь переполняется лог при инсерте...
вставлять батчами, по нескольку десятков тысяч, а не "одним селектом всё"
где созданы "невременные" таблицы? в боевой базе или tempdb ?
...
Рейтинг: 0 / 0
Как ускорить?
    #34308718
Fantasmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в боевой
а как батчами?
как ограничить выборку?
...
Рейтинг: 0 / 0
Как ускорить?
    #34308746
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fantasmoв боевой
а как батчами?
как ограничить выборку?
1) попробуй в tempdb
2 и 3) используя set rowcount N (отключается: set rowcount 0 ) или в цикле, опираясь на уникальные идентификаторы вносимых записей
...
Рейтинг: 0 / 0
Как ускорить?
    #34309806
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fantasmo пишет:
> Есть только одна проблема. Вроде бы ASE 12.0 не будет использовать
> индексы в процедуре на временные таблицы.
> т.е в таком случае индекс на временную таблицу просто лишняя трата времени

Я думаю что это голословное заявление. Вообще про оптимизатор не стоит
говорить чего-то определенного. Хотя фраза "Вроде бы" немного исправляет дело...

Короче, в 11.9 замечательно в процедурах использовались индексы на временные
таблицы. Почему бы им не быть использоваными в 12.0 ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34309809
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fantasmo пишет:
> Сделал таблицы не временными... теперь переполняется лог при инсерте...

Э ... Я что-то пропустил ? А зачем это ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как ускорить?
    #34310062
лень
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Я думаю что это голословное заявление. Вообще про оптимизатор не стоит
говорить чего-то определенного. Хотя фраза "Вроде бы" немного исправляет дело...


Видимо имелось ввиду утверждение, что если имеется последовательность действий - создаются временные таблицы, создаются индексы, заливаются данные и тут же начинается с ними работа, то оптимизатор не учитывает реальное состояние дел с временными таблицами.
Поэтому Sybase рекомендует следующую последовательность действий
- создаются временные таблицы
- заливаются данные
- создаются индексы
- зовется внутренняя ХП, которая уже и обрабатывает эти данные...

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


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