Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Есть апдейт (это расчет рыночной стоимости) 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... В частости дико тормозит не только выборка данных, но и конвертация в децимал. Может можно что-то сделать с этим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 13:52 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
есть вот такие индексы id subacc_id stock_id place_id id,place_id,act_acc_id id, place_id, subacc_id, stock_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 14:13 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Че индексы... ты план запроса покажи... set showplan on set noexec on и прогони свой запрос... И покажи DDL этих таблиц и индексов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 15:12 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Fantasmo пишет: > Наблюдаются страшнейшие тормоза...конечно тут играет роль большой объем > таблиц ,например tmp_bill_in_qty_by_day около 900000 > записей,#rate_by_day около 200000... В частости дико тормозит не только > выборка данных, но и конвертация в децимал. Конвертация в децимал вас не должна волновать вообще. Вас должен волновать план запроса. Конвертация в децимал будет в любом случае занимать много меньше времени чем обработка одной записи. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 15:27 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 15:35 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
План --------------------- 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 16:17 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
В начале поста запрос немного другой. Смотреть на этот;) 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 16:29 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 16:34 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Вот если от этих table scan-ов избавитесь, то будет вам счастье процентов на 95. Избавляться надо путем добавления индексов (если нет еще) на условия JOIN-ов и корреляции и проставления в запрос хинтов INDEX с ними. это зависит от размера временных таблиц... вполне возможно, что при малом количестве записей в них индексы счастья не принесут :) MasterZiv Запрос после этого надо тщательно тестировать с проверкой плана и IO. это да, без этого никуда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 16:38 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
FantasmoТаблицы здоровенные ну тогда MasterZiv прав надо избавляться от table scan замерьте сколько по времени у вас будут рисоваться необходимые индексы по этим #-таблицам если этот overhead вас устроит, то рисуйте индексы после заполнения этих таблиц иначе - переписывать/модифицировать логику запроса/процедуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:25 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
komrad пишет: > это зависит от размера временных таблиц... > вполне возможно, что при малом количестве записей в них индексы счастья > не принесут :) Согласен на все 100%. Однако аффтар уже написал что по крайней мере одна таблица имеет около 1M строк. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:36 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
komrad пишет: > если этот overhead вас устроит, то рисуйте индексы после заполнения этих > таблиц Кстати если так делать, то индексы могут подхватиться оптимизатором и без хинтов. Одна из техник работы с индексами на временных таблицах заключается в создании индексов ПОСЛЕ заполнения временной таблицы. Тогда оптимизатор будет уже знать статистику по полям индекса и будет ее учитывать. Но это не на всех версиях ASE. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:39 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Причем почти наверняка придется фиксировать хинтами индексы на временные таблицы, или еще лучше сначала залить данные во временные таблицы, потом создать индексы, а в другом батче или процедуре уже использовать это богатство, дабы облегчить жизнь оптимизатору... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:43 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Есть только одна проблема. Вроде бы ASE 12.0 не будет использовать индексы в процедуре на временные таблицы. т.е в таком случае индекс на временную таблицу просто лишняя трата времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 20:01 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
А делать не временные как-то не очень хочется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 20:03 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Сделал таблицы не временными... теперь переполняется лог при инсерте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 11:22 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
FantasmoСделал таблицы не временными... теперь переполняется лог при инсерте... вставлять батчами, по нескольку десятков тысяч, а не "одним селектом всё" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 11:48 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
komrad FantasmoСделал таблицы не временными... теперь переполняется лог при инсерте... вставлять батчами, по нескольку десятков тысяч, а не "одним селектом всё" где созданы "невременные" таблицы? в боевой базе или tempdb ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 11:49 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
в боевой а как батчами? как ограничить выборку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 11:57 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Fantasmoв боевой а как батчами? как ограничить выборку? 1) попробуй в tempdb 2 и 3) используя set rowcount N (отключается: set rowcount 0 ) или в цикле, опираясь на уникальные идентификаторы вносимых записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 12:03 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Fantasmo пишет: > Есть только одна проблема. Вроде бы ASE 12.0 не будет использовать > индексы в процедуре на временные таблицы. > т.е в таком случае индекс на временную таблицу просто лишняя трата времени Я думаю что это голословное заявление. Вообще про оптимизатор не стоит говорить чего-то определенного. Хотя фраза "Вроде бы" немного исправляет дело... Короче, в 11.9 замечательно в процедурах использовались индексы на временные таблицы. Почему бы им не быть использоваными в 12.0 ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 15:58 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
Fantasmo пишет: > Сделал таблицы не временными... теперь переполняется лог при инсерте... Э ... Я что-то пропустил ? А зачем это ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 15:59 |
|
||
|
Как ускорить?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Я думаю что это голословное заявление. Вообще про оптимизатор не стоит говорить чего-то определенного. Хотя фраза "Вроде бы" немного исправляет дело... Видимо имелось ввиду утверждение, что если имеется последовательность действий - создаются временные таблицы, создаются индексы, заливаются данные и тут же начинается с ними работа, то оптимизатор не учитывает реальное состояние дел с временными таблицами. Поэтому Sybase рекомендует следующую последовательность действий - создаются временные таблицы - заливаются данные - создаются индексы - зовется внутренняя ХП, которая уже и обрабатывает эти данные... Но всегда остается возможность выкрутить оптимизатору руки :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 17:10 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=69&tid=2012270]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 432ms |

| 0 / 0 |
