powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Оптимизация запроса с LEFT JOIN
7 сообщений из 32, страница 2 из 2
Оптимизация запроса с LEFT JOIN
    #35024666
up
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
up wrote:

> Попробуйте разобраться с разницей между разными базовыми типами джойнов
> - Nested Loop Join, Sort-Merge Join, Hash Join. Как они работают и

Разве у нас уже есть Hash Join ? С какой версии ?

> сколько сканирований каких таблиц делается в каждом типе джойна. Потом
> уже можно будет посмотреть а какие типы поддерживаются в 12.5.3 и что

Там есть только Loop Join, Sort-Merge Join
Posted via ActualForum NNTP Server 1.4

В 12.5.3 Да, только 2 базовых. В 15 - 3 базовых (с хешем) + вариации от базовых.
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024671
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad KruКажется странным, что ни один из индексов не используется.

это фича ;)
надо создавать объекты в отдельных батчах - мухи отдельно, котлеты отдельно

Не всегда.
Вот пример когда в одном батче все не создашь:

Часто практикуется такой подход когда в одной процедуре создаётся временная таблица , потом вызывается другая процедура которая её наполняет. Если создавать индекс (нужный для будущего запроса) вместе с созданием таблицы, то наполняющая процедура будет работать гораздо медленнее т.к. индекс будет тормозить процесс добавления записей. Поэтому индекс уже создаётся после.
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024706
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таких случаях делаю так
Код: plaintext
1.
2.
3.
4.
5.
6.
create procedure proc_name as
create table #table_name ()
exec proc_fill_temp_table
create index ...
exec proc_data_processing with recompile
go
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024828
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryo авторКажется странным, что ни один из индексов не используется
ничего странного, план процедуры строится при компиляции процедуры, а на этот момент индексов еще нет, поэтому и план получается такой. Навидался я такого кода, поэтому и спросил.

Я бы не мудрил с хинтами, а вынес бы создание индексов во внешнюю процедуру и из нее бы уже вызывал эту процедуру с запросом и наверное лучше сделать эту процедуру с параметром WITH RECOMPILE. После этого все у вас будет хорошо.

Да и на будущее если процедура долго выполняется смотрите реальный план всей процедуры а не отдельных запросов. Удачи.

На самом деле выносить создание объектов совершенно необязательно. Нужно просто по другому план посмотреть: Процедуру нужно хотябы один раз выполнить.

Я предлагаю добавить set showplan on в тело процедцры перед запросом.

При её вызове будет выводиться реальный план.

Ниже привожу пример. Временные таблицы создаются в процедуре, там же наполняются, потом строятся индексы и наконец выполняется запрос.

create procedure dbo.test_idx_inside
@i1 int
, @i2 int
as
create table #t1 (id int, i int)
create table #t2 (id int, j int)

declare @i int
select @i = 0
while @i < 1000
begin
insert into #t1 values (@i + 1, @i+1)
insert into #t2 values (@i + 2, @i+2)
select @i = @i+1
end

create index idx_1 on #t1(id)
create index idx_2 on #t2(id)

set showplan on
select #t1.i, #t2.j
from #t1 inner join #t2
on #t1.id = #t2.id
where #t1.id between @i1 and @i2
go


execute dbo.test_idx_inside 30, 70
go
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024852
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
salt wrote:

> Если план строится при компиляции, то можно ли на него посмотреть сразу
> после компиляции?

Нет. Только при выполнении. План не при компиляции кстати строится,
а при первом выполнении.

> И как в таком случае поможет создание индексов во внешней процедуре -
> ведь для внутренней процедуры план уже построен при компиляции ?
> А, понял. WITH RECOMPILE заставляет перекомпилировать вложенную процедуру.
>

WITH RECOMPILE вам не нужен.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024858
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryo wrote:
> WITH RECOMPILE дает команду перекомпилить процедуру перед выполнением
> когда уже индексы созданы а также поможет также оптимизатору

Чушь собачья. WITH RECOMPILE заставляет процедуру перекомпилироваться
КАЖДЫЙ РАЗ перед выполнением. Т.е. после выполнения она выбрасывается
из процедурного кэша. При этом когда в след. раз процедура выполняется,
она должна строит свой план. При этом построение плана ничем не
отличается от случая ее первого выполнения без WITH RECOMPILE.
Временных таблиц нет, индексов нет.

> сориентироваться на реальных данных во временных таблицах на момент
> выполнения процедуры. В одной ситуации у вас там может быть примерно
> одинаковое количество записей, в другой - в соотношении 1:1000:1000000.
> тогда при любом соотношении будет выбран оптимальный план.

Этому with recompile не поможет.

> У человека индексы создаются в той же процедуре что и выполняется
> запрос. У меня ASE 12.5.3 не использует такие индексы в запросах в той
> же процедуре

Это еще не значит, что он (оптимизатор) их не видит. Вы можете съесть
лимон целиком ? Можете. Но не едите. Но из факта, что вы его не едите,
не следует, что вы не можете этого сделать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация запроса с LEFT JOIN
    #35024885
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
rcryo wrote:
> У человека индексы создаются в той же процедуре что и выполняется
> запрос. У меня ASE 12.5.3 не использует такие индексы в запросах в той
> же процедуре

Это еще не значит, что он (оптимизатор) их не видит. Вы можете съесть
лимон целиком ? Можете. Но не едите. Но из факта, что вы его не едите,
не следует, что вы не можете этого сделать.
Posted via ActualForum NNTP Server 1.4

Оптимизатор "видит" индексы созданные в той же процедуре где и запрос.
У меня ASE 12.5.3 не использует такие индексы в запросах в той
> же процедуре
Попробуйте set showplan on в теле процедуры поставить и потом её выполнить.
Если индексы будут нужны для запроса они будут в плане. См мой пример выше.
Если посмотреть план, то будет видно, что индексы используются, хотя создаются они в той же процедуре где и запрос.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Оптимизация запроса с LEFT JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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