
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
27.07.2009, 10:41
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Ситуация стандартна до безобразия. Имеется некая таблица с ~100000 записей (TABLE). В таблице есть некий параметр (PARAM_REF) по которому необходимо сделать выборку. Дык вот запрос с Where Select count(*) from TABLE Where PARAM_REF = @PARAM_REF работает на порядок быстрее (т.е. порядка в 9-10 раз), чем запрос с джойном временной таблицы, в которой всего одно поле (PARAM_REF) и одно значение в таблице (=@PARAM_REF) Select count(*) from TABLE T join #TMP Tmp on T.PARAM_REF = Tmp.PARAM_REF Замеры быстродействия производились только на результирующих запросах (т.е. бех учета создания временной таблицы, ее заполнения и т.п.)... Приэтом. Полностью аналогичная структура на микрософтовском серваке таких разниц в работе не дает... Вопрос: где собака зарыта? Куда копать? Есть необходимость делать темповую таблицу (так как в преспективе может быть выборка не по одному значению) но нет желания так терять производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 11:28
|
|||
|---|---|---|---|
|
|||
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Mikle83, А если так: SET FORCEPLAN ON Select count(*) from #TMP Tmp join TABLE T on T.PARAM_REF = Tmp.PARAM_REF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 11:34
|
|||
|---|---|---|---|
|
|||
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Тут нужно план обоих запросов смотреть А во временной таблицы записей много? Может надо индекс построить по этому полю во временной таблицы, или явно(forceplan) ее первой поставить! Но без плана это только дагадки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 12:09
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
remedium пишет: > SET FORCEPLAN ON > Select count(*) from #TMP Tmp > join TABLE T on T.PARAM_REF = Tmp.PARAM_REF +1. Надо форсить план процентов на 80. И надо до этого планы посмотреть. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 12:12
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Mikle83 пишет: > Приэтом. Полностью аналогичная структура на микрософтовском серваке > таких разниц в работе не дает... MS -- другой сервер, там всё по-другому. Тут результат ожидаем. > > Вопрос: где собака зарыта? Куда копать? Есть необходимость делать Планы давай. Запроса с параметром можно не давать, а запроса со временной таблицей надо. > темповую таблицу (так как в преспективе может быть выборка не по одному > значению) но нет желания так терять производительность. Будут другие запросы - будут другие проблемы и решения. Разные запросы - разные подходы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:19
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
cherrex_DenА во временной таблицы записей много? Может надо индекс построить по этому полю во временной таблицы, или явно(forceplan) ее первой поставить! Но без плана это только дагадки! Еще раз повторюсь - записей в таблице всего ОДНА. И она равна значению переменной. Force Plan дал увеличение производительности но не сильно ощутимое (порядка 3-5%) ПЛАН ЗАПРОСА БЕЗ ВРЕМЕННОЙ ТАБЛИЦЫ |ROOT:EMIT Operator | | |SCALAR AGGREGATE Operator | | Evaluate Ungrouped COUNT AGGREGATE. | | | | |SCAN Operator | | | FROM TABLE | | | Card_Order | | | CO | | | Using Clustered Index. | | | Index : Card_Type | | | Forward Scan. | | | Positioning by key. | | | Keys are: | | | Card_Type_ID ASC | | | Using I/O Size 2 Kbytes for data pages. | | | With LRU Buffer Replacement Strategy for data pages. ПЛАН ЗАПРОСА С ВРЕМЕННОЙ ТАБЛИЦЕЙ: |ROOT:EMIT Operator | | |SCALAR AGGREGATE Operator | | Evaluate Ungrouped COUNT AGGREGATE. | | | | |MERGE JOIN Operator (Join Type: Inner Join) | | | Using Worktable2 for internal storage. | | | Key Count: 1 | | | Key Ordering: ASC | | | | | | |RESTRICT Operator | | | | | | | | |SCAN Operator | | | | | FROM TABLE | | | | | Card_Order | | | | | CO | | | | | 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. | | | | | | |SORT Operator | | | | Using Worktable1 for internal storage. | | | | | | | | |SCAN Operator | | | | | FROM TABLE | | | | | #Card_Type | | | | | CT | | | | | 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. P.S. выдергивал через эмбаркодеру, так как родной интеркатив скул послал нафиг сказав, что ему чего-то не хватает, а времени разбираться нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:28
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
У вас ошибочно MERGE JOIN используется для join. Как результат большая таблица в отсортированном порядке записывается во временную. Установите цель оптимизации равную allrows_oltp и все будет быстренько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:32
|
|||
|---|---|---|---|
|
|||
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Mikle83, Ну неудивительно, у вас Table Scan! индекс "Card_Type" по полю PARAM_REF сделан в таблице TABLE(Card_Order)? а если так: Select count(*) from TABLE T (index Card_Type) join #TMP Tmp on T.PARAM_REF = Tmp.PARAM_REF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:33
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
morisУ вас ошибочно MERGE JOIN используется для join. Как результат большая таблица в отсортированном порядке записывается во временную. Шаман однако! Спасибо помогло! Вопрос такой - получается Sybase по умолчанию цепанул Merge Join... Т.е. желательно все запросы просматривать по плану и если что явно корректировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:39
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
cherrex_DenMikle83, Ну неудивительно, у вас Table Scan! индекс "Card_Type" по полю PARAM_REF сделан в таблице TABLE(Card_Order)? Само собой индекс есть. cherrex_Den а если так: Select count(*) from TABLE T (index Card_Type) join #TMP Tmp on T.PARAM_REF = Tmp.PARAM_REF [/quot] А вот так не пракатывает - ругается на некорректный синтаксис. В принципе проблема решилась вариантом, предложенным moris... Только вот теперь с сомнением смотрю на все остальные запросы/процедуры :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:42
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
С синтаксимос разобрался - но работать стало даже чуть-чуть дольше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 13:43
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Mikle83morisУ вас ошибочно MERGE JOIN используется для join. Как результат большая таблица в отсортированном порядке записывается во временную. Шаман однако! Спасибо помогло! Вопрос такой - получается Sybase по умолчанию цепанул Merge Join... Т.е. желательно все запросы просматривать по плану и если что явно корректировать? До версии 15.0.2 ASE 15ой ветки очень "оптимистично" расценивал стоимость Merge Join, как результат совал его где только возможно, особенно в режиме по умолчанию - allrows_mix Если у вас ASE используется только как OLTP просто поставьте постоянно цель оптимизации allrows_oltp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.07.2009, 15:14
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
moris пишет: > До версии 15.0.2 ASE 15ой ветки очень "оптимистично" расценивал > стоимость Merge Join, как результат совал его где только возможно, > особенно в режиме по умолчанию - allrows_mix что интересно, не ASE один такой. В MSSQL тоже в своё время было то же самое -- переоценивался MERGE JOIN, (точнее недооценивался, переоценивались его возможности). И в других СУБД тоже. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
28.07.2009, 10:52
|
|||
|---|---|---|---|
Sybase ASE 15 и темповая таблица |
|||
|
#18+
Mikle83 Select count(*) from TABLE Where PARAM_REF = @PARAM_REF работает на порядок быстрее (т.е. порядка в 9-10 раз), чем запрос с джойном временной таблицы, в которой всего одно поле (PARAM_REF) и одно значение в таблице (=@PARAM_REF) Select count(*) from TABLE T join #TMP Tmp on T.PARAM_REF = Tmp.PARAM_REF Замеры быстродействия производились только на результирующих запросах (т.е. бех учета создания временной таблицы, ее заполнения и т.п.)... Такое же поведение запросто можно получить и на АСА в случае, когда не идентичные типы полей PARAM_REF в обоих таблицах. В этом случае идет неявное преобразование типов и отбрасывание индекса. Возможно, что мое предположение не подтвердится, но проверить стоит. Ведь ничего не бывает на этом свете просто так, раз АСЕ решил взять план такой, то что-то же его подтолкнуло на это... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&tablet=1&tid=2010959]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 149ms |

| 0 / 0 |

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