Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / запрос оптимизировать / 12 сообщений из 12, страница 1 из 1
19.10.2005, 13:53
    #33333069
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
День добрый.

Вот есть некоторые запросы к БД (1: и 2:( двумя запросами) ), есть статистика ( может она конечно несколько и не корректна из за того что некоторые данные в кеше осели ), но... чего то я не опредлюсь каким пользоваться... По цифрам вроде видно что двумя ( 2.a и 2.b ) запрсами данные выбираются быстрее только не понятно почему. В частности вот видно что в 2.a и в 2.b индексы разные пользуются - 2.a - не кластерный а в 2.b кластерный. И по чему первый запрос так долго работает.

1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select
        Moment          = datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        InSize          = sum(case when direction =  0  then DataSize else  0  end),
        OutSize         = sum(case when direction =  1  then DataSize else  0  end),
        InCost          = sum(case when direction =  0  then DestCost else  0  end),
        OutCost         = sum(case when direction =  1  then SourceCost else  0  end),
        TariffZoneID    = ( case when direction =  1  then DestTariffZoneID else SourceTariffZoneID end )
from
        Traffic
where
        Moment between '10.1.2005 00:01' and '10.19.2005' and
        ( case when direction =  1  then SourceAccID else DestAccID end ) =  907645 
group by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        ( case when direction =  1  then DestTariffZoneID else SourceTariffZoneID end )
order by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        ( case when direction =  1  then DestTariffZoneID else SourceTariffZoneID end )


QUERY PLAN FOR STATEMENT 1 (at line 1).


STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.

FROM TABLE
Traffic
Nested iteration.
Index : TrafficFKMoment
Forward scan.
Positioning by key.
Keys are:
Moment ASC
Using I/O Size 16 Kbytes for index leaf pages.
With MRU Buffer Replacement Strategy for index leaf pages.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.

STEP 2
The type of query is SELECT.

FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

Parse and Compile Time 0.
SQL Server cpu time: 0 ms.
....
Table: Traffic scan count 1, logical reads: (regular=185895 apf=0 total=185895), physical reads: (regular=15 apf=24736 total=24751), apf IOs used=24694
Table: Worktable1 scan count 1, logical reads: (regular=2099 apf=0 total=2099), physical reads: (regular=0 apf=0 total=0), apf IOs used=0
Total writes for this command: 0

Execution Time 159.
SQL Server cpu time: 15900 ms. SQL Server elapsed time: 39320 ms.

(517 rows affected)


2.a:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
        Moment          = datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        InSize          = sum(DataSize),
        InCost          = sum(DestCost),
        TariffZoneID    = SourceTariffZoneID
from
        Traffic
where
        Moment between '10.1.2005 00:01' and '10.19.2005' and
        DestAccID =  907645  and
        Direction =  0 
group by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        SourceTariffZoneID
order by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        SourceTariffZoneID

STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.

FROM TABLE
Traffic
Nested iteration.
Index : TrafficFKMoment
Forward scan.
Positioning by key.
Keys are:
Moment ASC
Using I/O Size 16 Kbytes for index leaf pages.
With MRU Buffer Replacement Strategy for index leaf pages.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.

STEP 2
The type of query is SELECT.

FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

Parse and Compile Time 0.
SQL Server cpu time: 0 ms.
...
Table: Traffic scan count 1, logical reads: (regular=185895 apf=0 total=185895), physical reads: (regular=402 apf=27537 total=27939), apf IOs used=27536
Table: Worktable1 scan count 1, logical reads: (regular=1013 apf=0 total=1013), physical reads: (regular=0 apf=0 total=0), apf IOs used=0
Total writes for this command: 0

Execution Time 66.
SQL Server cpu time: 6600 ms. SQL Server elapsed time: 105080 ms.


-- выбираем второю половину данных...
2.b:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
        Moment          = datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        OutSize          = sum(DataSize),
        OutCost          = sum(SourceCost),
        TariffZoneID    = DestTariffZoneID
from
        Traffic
where
        Moment between '10.1.2005 00:01' and '10.19.2005' and
        SourceAccID =  907645  and
        Direction =  1 
group by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        DestTariffZoneID
order by
        datediff(minute,'10.1.2005 00:01',Moment)/ 360 ,
        DestTariffZoneID

STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.

FROM TABLE
Traffic
Nested iteration.
Index : XIF764Traffic
Forward scan.
Positioning by key.
Keys are:
SourceAccID ASC
Using I/O Size 16 Kbytes for index leaf pages.
With MRU Buffer Replacement Strategy for index leaf pages.
Using I/O Size 4 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.

STEP 2
The type of query is SELECT.

FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

Parse and Compile Time 0.
SQL Server cpu time: 0 ms.
...
Table: Traffic scan count 1, logical reads: (regular=42179 apf=0 total=42179), physical reads: (regular=25841 apf=789 total=26630), apf IOs used=697
Table: Worktable1 scan count 1, logical reads: (regular=13778 apf=0 total=13778), physical reads: (regular=0 apf=0 total=0), apf IOs used=0
Total writes for this command: 0

Execution Time 11.
SQL Server cpu time: 1100 ms. SQL Server elapsed time: 159583 ms.
...
Рейтинг: 0 / 0
19.10.2005, 13:59
    #33333080
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
P.S.

ASE 12.5.1
...
Рейтинг: 0 / 0
19.10.2005, 22:10
    #33334047
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
В первом запросе вот это странно :

Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

MRU может и хорошо, но вот 16K IO для data pages странновато
выглядит. Потому как ваш индекс не кластерный, и N (==4 у вас) подряд идущих страниц могут не быть последовательными по полю Moment.
Т.е. читается первая полезная страница и с ней еще 3. А используется только
первая, а поскольку MRU, то они тут же затираются и потом все равно будут читаться снова. Итог -- IO в четыре раза (на самом деле немного меньше) больше, чем надо.

Я бы попробовал заставить его на уровне таблицы читать по минимуму (4К же у вас страницы ?? ).

А на счет что быстрее -- ну смотрите сами, у вас 1 и 2a абсолютно идентичные запросы. А во втором случае вы к нему добавляете еще один, 2b. как это может быть быстрее ? Никак.
...
Рейтинг: 0 / 0
19.10.2005, 23:36
    #33334087
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
MasterZivВ первом запросе вот это странно :

Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

MRU может и хорошо, но вот 16K IO для data pages странновато
выглядит. Потому как ваш индекс не кластерный, и N (==4 у вас) подряд идущих страниц могут не быть последовательными по полю Moment.
Т.е. читается первая полезная страница и с ней еще 3. А используется только
первая, а поскольку MRU, то они тут же затираются и потом все равно будут читаться снова. Итог -- IO в четыре раза (на самом деле немного меньше) больше, чем надо.

Я бы попробовал заставить его на уровне таблицы читать по минимуму (4К же у вас страницы ?? ).


Да, страницы 4 k. Это вообще ( iosize для таблицы ) куда смотреть ?



А на счет что быстрее -- ну смотрите сами, у вас 1 и 2a абсолютно идентичные запросы. А во втором случае вы к нему добавляете еще один, 2b. как это может быть быстрее ? Никак.

Я вот просто 'Execution Time' у всех запросов посчитал, и сумма 2.a и 2.b меньше чем у первого запроса.... Хотя если верить 'Table: Traffic scan count 1, logical reads: (regular=185895 apf=0 total=185895' и 1 и 2.a действительно читают одинаковое количество данных, при том что к 2.a добавляетися и 2.b....

Еще вот интересно не из за этих ли:
Код: plaintext
1.
        ( case when direction =  1  then DestTariffZoneID else SourceTariffZoneID end )
конструкций у первого запроса время на выполнение больше получилось ?

про использование кластерного индекса в 2.b я прогнал....
...
Рейтинг: 0 / 0
20.10.2005, 11:14
    #33334597
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
[quot g613]
Это вообще ( iosize для таблицы ) куда смотреть ?
[quot ]

Ну хинт поставить в запросе.

[quot g613]
Я вот просто 'Execution Time' у всех запросов посчитал, и сумма 2.a и 2.b меньше чем у первого запроса....
Хотя если верить 'Table: Traffic scan count 1, logical reads: (regular=185895 apf=0 total=185895' и 1 и 2.a действительно читают одинаковое количество данных, при том что к 2.a добавляетися и 2.b....
[quot ]

Не может быть слагаемое больше суммы. Сами же все написали. Значит не так меряли время. Я , кстати, до сих пор так и не понял, что там этот elapsed time показывает и никогда им не пользуюсь. Вообще, время выполнения запроса -- это не показатель скорости его работы. IO -- показатель. А так -- ну локнули зпрос на немного - время прыгнуло. Загрузка машины скакнула -- время прыгнуло. Ничего вообще не говорит.

[quot g613]
Еще вот интересно не из за этих ли:
Код: plaintext
1.
        ( case when direction =  1  then DestTariffZoneID else SourceTariffZoneID end )
конструкций у первого запроса время на выполнение больше получилось ?
[quot ]

Нет.
IO важнее CPU на порядки. IO -милисекунды, CPU - наносекунды.
...
Рейтинг: 0 / 0
20.10.2005, 11:19
    #33334611
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
Код: plaintext
1.
2.
3.
4.
...
from
        Traffic (prefetch  4 )
...

Так кажется.
...
Рейтинг: 0 / 0
20.10.2005, 13:15
    #33334941
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
MasterZiv
Код: plaintext
1.
2.
3.
4.
...
from
        Traffic (prefetch  4 )
...
Так кажется.


STEP 1
The type of query is SELECT (into Worktable1).
GROUP BY
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.
Evaluate Grouped SUM OR AVERAGE AGGREGATE.

FROM TABLE
Traffic
Nested iteration.
Index : TrafficFKMoment
Forward scan.
Positioning by key.
Keys are:
Moment ASC
Using I/O Size 4 Kbytes for index leaf pages.
With MRU Buffer Replacement Strategy for index leaf pages.
Using I/O Size 4 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.
TO TABLE
Worktable1.

STEP 2
The type of query is SELECT.

FROM TABLE
Worktable1.
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 16 Kbytes for data pages.
With MRU Buffer Replacement Strategy for data pages.

....
Table: Traffic scan count 1, logical reads: (regular=185895 apf=0 total=185895), physical reads: (regular=59243 apf=19631 total=78874), apf IOs used=19631
Table: Worktable1 scan count 1, logical reads: (regular=3270 apf=0 total=3270), physical reads: (regular=0 apf=0 total=0), apf IOs used=0
Total writes for this command: 0

Execution Time 194.
SQL Server cpu time: 19400 ms. SQL Server elapsed time: 76616 ms.


в добавок к prefetch'у пришлось еще и индекс к такому запросу гвоздями прибивать,
если явно не указать index TrafficFKMoment, но указать prefeth 4, пользовался вообще какой то левый индекс.


physical reads: (regular=59243 apf=19631 total=78874)

Вот у этих данных размерность в блоках в которых ведется чтение ?

тоесть `78874 * 4` vs `24751 * 16` сравнивать ?
...
Рейтинг: 0 / 0
20.10.2005, 13:36
    #33335029
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
g613Вот у этих данных размерность в блоках в которых ведется чтение ?

тоесть `78874 * 4` vs `24751 * 16` сравнивать ?

Да нет вроде. А время уменьшилось ?
...
Рейтинг: 0 / 0
20.10.2005, 13:58
    #33335122
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
MasterZiv g613Вот у этих данных размерность в блоках в которых ведется чтение ?

тоесть `78874 * 4` vs `24751 * 16` сравнивать ?

Да нет вроде. А время уменьшилось ?

Ну если на глаз то они примерно одинаково выполняются, а по цифрам с iosize 16k вроде быстрее...
...
Рейтинг: 0 / 0
20.10.2005, 20:02
    #33336106
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
Ну значит может быть я был не прав про 16K IO.
...
Рейтинг: 0 / 0
20.10.2005, 22:20
    #33336223
g613
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
В общем остановился на первом варианте. Только пришлось пересмотреть политику, до этого предполагалось, что та статистика будет отдаваться через веб интерфейс в онлайне... Теперь в онлайне только запрос на получение статистики, а обработка этого запроса по мере разгрузки сервера...

Вообще в начальном запросе больше интересовало влияние конструкций
Код: plaintext
1.
case when direction =  0  then DataSize else  0  end
на производительность, ну если говорите не стоит внимания на это обращать тады, оставлю как есть. Сенькс.
...
Рейтинг: 0 / 0
20.10.2005, 22:47
    #33336252
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос оптимизировать
ты можешь делать запрос по шедулеру раз в N минут и выкладывать подготовленную HTML на сервер ХТТП.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / запрос оптимизировать / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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