powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / join in ASE 12.5.1
15 сообщений из 15, страница 1 из 1
join in ASE 12.5.1
    #36230954
_vita_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла следующая ситуация:
Джойнятся 2 временные таблицы, результат сохраняется в 3-ей временной таблице.
В каждой таблице примерно по 30000 записей и по 60 полей.
Объединение идет по полю, которое в одной таблице является примари кеем, а в другой кластерным индексом.
Проблема в том, что эта операция выполняется около полутора часов!
В чем может быть проблема и как её устранить?

Вот примерный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
CREATE TABLE #Table1(
    IdKey            numeric( 9 , 0 )        identity,
    F1Code1       tinyint             DEFAULT  0  NULL,
    F1Code2       tinyint             DEFAULT  0  NULL,
    F1            money               DEFAULT  0  NULL,
    F2Code1       tinyint             DEFAULT  0  NULL,
    F2Code2       tinyint             DEFAULT  0  NULL,
    F2            money               DEFAULT  0  NULL,
    F3Code1       tinyint             DEFAULT  0  NULL,
    F3Code2       tinyint             DEFAULT  0  NULL,
    F3            money               DEFAULT  0  NULL,
    F4Code1       tinyint             DEFAULT  0  NULL,
    F4Code2       tinyint             DEFAULT  0  NULL,
    F4            money               DEFAULT  0  NULL,
    F5Code1       tinyint             DEFAULT  0  NULL,
    F5Code2       tinyint             DEFAULT  0  NULL,
    F5            money               DEFAULT  0  NULL,
    F6Code1       tinyint             DEFAULT  0  NULL,
    F6Code2       tinyint             DEFAULT  0  NULL,
    F6            money               DEFAULT  0  NULL,
    ......
    CONSTRAINT PrimaryKey PRIMARY KEY NONCLUSTERED (PLANAR_ID)
)

create table #Table2
(
    idkey           numeric( 10 , 0 ) identity,
    Table1_Ref       int         NOT NULL,
    F1          char( 16 )    NULL, 
    F2             datetime    NULL, 
    F3            tinyint     NULL,
    F4           tinyint     NULL,
    F5      int         NULL,
    ......
)

create clustered index #idx_Table2 on #Table2(Table1_Ref)

create table #Table3
(
    F1Code1       tinyint             DEFAULT  0  NULL,
    F1Code2       tinyint             DEFAULT  0  NULL,
    F1            money               DEFAULT  0  NULL,
    F2Code1       tinyint             DEFAULT  0  NULL,
    F2Code2       tinyint             DEFAULT  0  NULL,
    F2            money               DEFAULT  0  NULL,
    F3Code1       tinyint             DEFAULT  0  NULL,
    F3Code2       tinyint             DEFAULT  0  NULL,
    F3            money               DEFAULT  0  NULL,
    F4Code1       tinyint             DEFAULT  0  NULL,
    F4Code2       tinyint             DEFAULT  0  NULL,
    F4            money               DEFAULT  0  NULL,
    F5Code1       tinyint             DEFAULT  0  NULL,
    F5Code2       tinyint             DEFAULT  0  NULL,
    F5            money               DEFAULT  0  NULL,
    F6Code1       tinyint             DEFAULT  0  NULL,
    F6Code2       tinyint             DEFAULT  0  NULL,
    F6            money               DEFAULT  0  NULL,
    .....
)

insert into #Table3 (F1Code1,F1Code2,...)
select F1Code1,F1Code2,...
from #Table1 join #Table2 (index #idx_Table2) on #Table1.IdKey = #Table2.Table1_Ref

-- На #Table1 и #Table2 еще 2-3 индекса висят
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36231469
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_vita_#Table1.IdKey = #Table2.Table1_Ref
Возможно, проблема из-за того, что эти поля разных типов.
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36231716
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще, лучше увидеть план, и статьстику по I/O.
Код: plaintext
1.
2.
3.
set showplan on
go 
set statistics io on
--потом запрос

да и "insert into" лучше заминить на "select into".
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36231988
_vita_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim2000_vita_#Table1.IdKey = #Table2.Table1_Ref
Возможно, проблема из-за того, что эти поля разных типов.
Не думаю, что приведение типа numeric в int так долго работает

cherrex_Denвообще, лучше увидеть план, и статьстику по I/O.
Код: plaintext
1.
2.
3.
set showplan on
go 
set statistics io on
--потом запрос

да и "insert into" лучше заминить на "select into".

insert into заменить на select into не получится, поскольку все происходит внутри транзакции. И ASE не позволяет создавать в транзакции таблицы.

Статистику io получить пока не получилось, так как данные формируются динамически и вручную набрать 30000 строк проблематично.

Вот план запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
QUERY PLAN FOR STATEMENT 3 (at line 13).       	
                                               	
                                               	
    STEP 1                                     	
        The type of query is INSERT.           	
        The update mode is direct.             	
                                               	
        FROM TABLE                             	
            #Table1                            	
        Nested iteration.                      	
        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.	
                                                            	
        FROM TABLE                                          	
            #Table2                                     	
        Nested iteration.                                   	
        Using Clustered Index.                              	
        Index : #idx_Table2                   	
        Forward scan.                                       	
        Positioning at start of table.                      	
        Using I/O Size 2 Kbytes for data pages.             	
        With LRU Buffer Replacement Strategy for data pages.	
        TO TABLE                                            	
            #Table3                                          	
        Using I/O Size 2 Kbytes for data pages.   
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36232003
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторFROM TABLE
#Table2
Nested iteration.
Using Clustered Index.
Index : #idx_Table2
Forward scan.
Positioning at start of table .

похоже из-за приведения типов в джойне у выс сканируется весь индекс, а так как он кластерный то это равносильно "Table Scan".
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36232037
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не "кажется сканируется таблица", а именно так и есть.
В общем, JOIN идёт без использования индекса.

> CREATE TABLE #Table1(
> IdKey numeric(*9*,*0*) identity,

> create table #Table2
> (
> Table1_Ref int NOT NULL,

Сделайте эти поля одинаковыми по типу данных (numeric(9,0) ).
Вам всё равно, а серверу работать легче.

> insert into #Table3 (F1Code1,F1Code2,...)
> select F1Code1,F1Code2,...
> from #Table1 join #Table2 (index #idx_Table2) on #Table1.IdKey = #Table2.Table1_Ref

Ну и, если первое не поможет, уберите хинт (index #idx_Table2)

И, если будут проблемы, запросы сюда, обязательно вместе с планами.

И не выкидывайте куски из запросов, как вы сделали в первом посте.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36232310
_vita_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже что проблема действительно была в типе.
После замены типа на numeric(9,0) план вывелся такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    STEP 1                                     	
        The type of query is INSERT.           	
        The update mode is direct.             	
                                               	
        FROM TABLE                             	
            #Table1                            	
        Nested iteration.                      	
        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.	
                                                            	
        FROM TABLE                                          	
            #Table2                                     	
        Nested iteration.                                   	
        Using Clustered Index.                              	
        Index : #idx_Table2                   	
        Forward scan.                                       	
        Positioning by key.                                 	
        Keys are:                                           	
            Table1_Ref  ASC                                  	
        Using I/O Size 2 Kbytes for data pages.             	
        With LRU Buffer Replacement Strategy for data pages.	
        TO TABLE                                            	
            #Table3                                          	
        Using I/O Size 2 Kbytes for data pages.  

Интересно, что если убрать хинт (index #idx_Table2), то автоматически он не подставляется и используется Table Scan.
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36232319
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_vita_ пишет:

> Интересно, что если убрать хинт (index #idx_Table2), то автоматически он
> не подставляется и используется Table Scan.

Ну так попробуй !
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36232408
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно попробывать(не меняя структуру таблиц) так:

from #Table1 join #Table2 (index #idx_Table2) on convert(int, #Table1.IdKey) = #Table2.Table1_Ref
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233221
_vita_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Провел тест на среднем объеме данных. 1800 записей обработалось за 14 минут.
Результат не впечатляет.
Может что-то еще в плане не так?
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233290
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_vita_Провел тест на среднем объеме данных. 1800 записей обработалось за 14 минут.
Результат не впечатляет.
Может что-то еще в плане не так?

в плане - сканы
Index Scan (#Table2, idx_Table2) - не плохо, но и не отлично
table scan (#Table1) - плохо


протестируйте скорость работы вашей tempdb - в цикле залейте несколько раз сопоставимое кол-во записей во временную таблицу, посмотрите время

sp_helpdb tempdb
что выдает ?
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233352
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_vita_ пишет:

> Может что-то еще в плане не так?

Так где планы -то ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233464
_vita_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот результат sp_helpdb tempdb:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
name  	db_size      	owner	dbid	created     	status                                                                           
------	-------------	-----	----	------------	---------------------------------------------------------------------------------
tempdb	    1989.5 MB	sa   	2   	Oct 05, 2009	select into/bulkcopy/pllsort, trunc log on chkpt, ddl in tran, mixed log and data	

device_fragments	size         	usage       	created            	free kbytes     
----------------	-------------	------------	-------------------	----------------
master          	       3.0 MB	data and log	May 19 2008  9:08AM	              42	
master          	     986.5 MB	data and log	May 19 2008 10:47AM	         1005490	
master          	    1000.0 MB	data and log	Dec 16 2008  4:59PM	         1020000

Копирование в tempdb 30000 записей в цикле происходит за меньше секунды.

Повторяю план:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    STEP 1                                     	
        The type of query is INSERT.           	
        The update mode is direct.             	
                                               	
        FROM TABLE                             	
            #Table1                            	
        Nested iteration.                      	
        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.	
                                                            	
        FROM TABLE                                          	
            #Table2                                     	
        Nested iteration.                                   	
        Using Clustered Index.                              	
        Index : #idx_Table2                   	
        Forward scan.                                       	
        Positioning by key.                                 	
        Keys are:                                           	
            Table1_Ref  ASC                                  	
        Using I/O Size 2 Kbytes for data pages.             	
        With LRU Buffer Replacement Strategy for data pages.	
        TO TABLE                                            	
            #Table3                                          	
        Using I/O Size 2 Kbytes for data pages.  
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233518
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прикольный у вас такой master.dat
если не секрет, то покажите

Код: plaintext
exec sp_helpdevice master

далее, в таблице #table1 нет индекса на IdKey
постройте и покажите план

+ вместе с планом покажите статистику работы запроса, т.е. добавьте к запросу следующие директивы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
set statistics io on
set statistics time on

.... запрос ....


set statistics io off
set statistics time off



_vita_Вот результат sp_helpdb tempdb:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
name  	db_size      	owner	dbid	created     	status                                                                           
------	-------------	-----	----	------------	---------------------------------------------------------------------------------
tempdb	    1989.5 MB	sa   	2   	Oct 05, 2009	select into/bulkcopy/pllsort, trunc log on chkpt, ddl in tran, mixed log and data	

device_fragments	size         	usage       	created            	free kbytes     
----------------	-------------	------------	-------------------	----------------
master          	       3.0 MB	data and log	May 19 2008  9:08AM	              42	
master          	     986.5 MB	data and log	May 19 2008 10:47AM	         1005490	
master          	    1000.0 MB	data and log	Dec 16 2008  4:59PM	         1020000
...
Рейтинг: 0 / 0
join in ASE 12.5.1
    #36233745
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_vita_ пишет:

> Вот результат sp_helpdb tempdb:
> name db_size owner dbid created status
> ------ ------------- ----- ---- ------------ ---------------------------------------------------------------------------------
> tempdb 1989.5 MB sa 2 Oct 05, 2009 select into/bulkcopy/pllsort, trunc log on chkpt, ddl in tran, mixed log and data
> Копирование в tempdb 30000 записей в цикле происходит за меньше секунды.

tempdb только на мастере ? Прикольно. Очень странно, что у вас вообще что-то
работает.
Это значит, у вас девственный, нетронутый рукой админа после установки
сервер.

Надо конфигурировать tempdb однако.

> Index : #idx_Table2
> Forward scan.
> Positioning by key.
> Keys are:
> Table1_Ref ASC


Хороший план, правильный. Должен быть быстрым.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / join in ASE 12.5.1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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