|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
Вот код тестовой процедуры: drop proc _tmp go set forceplan on go create proc _tmp as begin if object_id("#tmp") is not null drop table #tmp create table #tmp( tmp1 numeric(5,0) not null, tmp2 varchar(50) null, primary key (tmp1)) select * from #tmp (1) end go set forceplan off go Вот код запуска: set showplan on go exec _tmp go set showplan off go В первый раз получаем план исполнения: STEP 1 The type of query is SELECT. FROM TABLE #tmp Nested iteration. Using Clustered Index. Index : _tmp_13777325131 Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. (0 rows affected) (return status = 0) Запускаем еще раз: STEP 1 The type of query is SELECT. FROM TABLE #tmp Nested iteration. Using Clustered Index. Index name not found. Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. (0 rows affected) (return status = 0) Кто-нибудь может пояснить куда делся индекс? Отказ от set forceplan ничего не дает, если использовать именованный индекс и опцию (index имя_индекса) ситуация аналогичная. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 09:06 |
|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
Попробуй использовать указание индекса не по имени а по номеру, например (index 1). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 10:32 |
|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
Аналогично. Это нормальное поведение сервера или какой-то баг и надо ставить ebf ? У меня например Adaptive Server Enterprise/12.5.0.2/EBF 10580 IR/P/NT (IX86)/OS 4.0/rel12502/1850/32-bit/OPT/Fri Oct 18 19:51:23 2002. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 12:01 |
|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
Вообще-то я против использования индексов в tempdb по ряду причин и подчиненные мне программисты ими не пользуются. Но в Вашем случае,я думаю,имеет место быть баг SYBASE. Т.к.истинные имена в tempdb формируются динамически,а указание в create слов primary key-это команда на создание индекса,то,возможно,на создание индекса он прихватил другую таблицу из семейства #temp. Попробуйте сузить ему степень свободы:создайте индекс после заполнения таблицы и не кластерный-быстрей создается,может поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 12:03 |
|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
to KOLCHOZ_POSTEVENT >Вообще-то я против использования индексов в tempdb по ряду причин и >подчиненные мне программисты ими не пользуются. Логично, но программисты мне не подчиняются. >Попробуйте сузить ему степень свободы:создайте индекс после заполнения >таблицы и не кластерный-быстрей создается,может поможет. Изменил на : create table #tmp( tmp1 numeric(5,0) not null, tmp2 varchar(50) null) create index pk_tmp on #tmp (tmp1) select * from #tmp (index pk_tmp) Результат тот же, в первый раз индекс видит, потом нет. >Но в Вашем случае,я думаю,имеет место быть баг SYBASE. Возможно, если у вас есть тех. поддержка нельзя ли спросить у представителей? Вобще у остальных тот же эффект, или это у меня что-то с сервером? Если все это делать не в хранимой, т.е. create table #tmp( tmp1 numeric(5,0) not null, tmp2 varchar(50) null, primary key (tmp1)) set showplan on go select * from #tmp (index 1) go set showplan off go то все хорошо, индекс видится всегда STEP 1 The type of query is SELECT. FROM TABLE #tmp Nested iteration. Using Clustered Index. Index : _tmp_10038978291 Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. (0 rows affected) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 14:51 |
|
Использование индексов для временных таблиц
|
|||
---|---|---|---|
#18+
Вопрос перешел в раздел теоретических, как решение можно использовать создание временной таблицы до вызова хранимой процедуры, причем не важно создается она скриптом или в другой хранимой процедуре, т.е. следующий код работает if object_id("#tmp") is not null drop table #tmp go create table #tmp( tmp1 numeric(5,0) not null, tmp2 varchar(50) null, primary key (tmp1)) go drop proc _tmp go set forceplan on go create proc _tmp as begin select * from #tmp (1) end go drop proc _tmp1 go create proc _tmp1 as begin if object_id("#tmp") is not null drop table #tmp create table #tmp( tmp1 numeric(5,0) not null, tmp2 varchar(50) null, primary key (tmp1)) exec _tmp end go set forceplan off go При последующих вызовах set showplan on go exec _tmp1 go set showplan off go Выдается, причем Index : _tmp_21328064371 меняется (например _tmp_10128024471), т.е. индекс нормально создается и цепляется. STEP 1 The type of query is SELECT. FROM TABLE #tmp Nested iteration. Using Clustered Index. Index : _tmp_21328064371 Forward scan. Positioning at start of table. Using I/O Size 2 Kbytes for data pages. With LRU Buffer Replacement Strategy for data pages. (0 rows affected) (return status = 0) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2003, 15:33 |
|
|
start [/forum/topic.php?fid=55&msg=32255927&tid=2014849]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 273ms |
0 / 0 |