powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Подзапрос и быстродействие, max(Date)
21 сообщений из 21, страница 1 из 1
Подзапрос и быстродействие, max(Date)
    #33998715
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть задача увеличить производительность (скорость) программы на базе ASE 12.0.0.4. Встретил в коде store-процедур в нескольких местах конструкции типа:

select
...
from tRate R
where ...
and R.Date_Time = (select max(Date_Time) from tRate
where Date_Time <= @Date
and ... )

Таблица tRate ~ полмиллиона записей.
На этих строках по монитору запросов дольше всего стоит процесс.

Вопросы:

1. будет ли правильнее вынесни подзапрос вверх (остальные условия where не связаны с основным запросом) или по скорости это все равно?

2. функция max(Date_Time) от поля даты - эффективна ли? или есть прием более быстрый?
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #33998798
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши весь запрос.
Ибо оно не понятно, что там у тебя за логика в него заложена.
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #33998951
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select
@1MarketPrice = isnull(R.Course,0),
@1DateMP = isnull(R.Date_Time,'19000101') ,
@1FundID1 = isnull(R.FundID,0),
@1RateID1 = isnull(R.RateID,0)
from tRate R
where R.ObjectID = @1SecurityID
and R.InstitutionID = 10000000062
and R.Course <> 0
and R.Date_Time = (select max(Date_Time) from tRate
where Date_Time <= @Date
and ObjectID = @1SecurityID
and InstitutionID = 10000000062
and Course <> 0)
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #33999230
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, Некоррелированный скалярный подзапрос во фразе WHERE выполняется один раз, а дальше результат его выполнения используется как константа для всего остального запроса.
Поэтому "вынеся подзапрос вверх" делу не поможешь.

А вообще, нужно на планы и статистику выполнения смотреть.
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #33999415
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергей Некоррелированный скалярный подзапрос во фразе WHERE выполняется один раз, а дальше результат его выполнения используется как константа для всего остального запроса.
Поэтому "вынеся подзапрос вверх" делу не поможешь.

Понял, спасибо. Хорошо, если так.

>А вообще, нужно на планы и статистику выполнения смотреть

Хм... Узнать бы хорошие средства?
Пока использую только монитор DBArtisan и смотрю по:

авторselect
...
p.program_name,
object_name(p.id,p.dbid) as procedure_name,
p.linenum, -- строка запроса
...
from
master..sysprocesses p
...
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #33999983
k0mrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaU, судя по названию таблицы эта программа есть продукт Диасофт
ребята пишут в основном грамотный код, и я бы не советовал переписывать их запросы только потому, что что-то долго выполняется,
тем более не имея понятия как смотреть планы запросов.

рекомендую сначала с помощью того же Артизана перестроить индексы на базе и проапдейтить табличную статистику.
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34000118
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по названию таблицы эта программа есть продукт Диасофт
ребята пишут в основном грамотный код
солидарен с Вами! :)
хотя error находились все равно...
писали... разработчики исправляли...

>перестроить индексы на базе и проапдейтить табличную статистику.
это делается регулярно раз в неделю сисадмином!

все-таки есть затыки и в коде sp-процедур, наверное?
раз время выполнения некоторых процессов > неск. часов
(без учета блокировок) тут и приходится искать "торможение"...

PS
Кстати, такая конструкция:

select
...
from tRate
where
ObjectID = ''
and InstrumentID = ''
group by Date_Time
having Date_Time = max(DateTime)

будет ли лучше вышеприведенной?
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34001113
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пришли пл следующее:
sp_help tRate

+ результат выполнения этого запроса после выставления следующих сетов:
set statistics io on
set statistics time on

+ попробуй выполнить этот запрос еще и с этим:
set forceplan on
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34001157
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komradпришли пл следующее:
sp_help tRate

+ результат выполнения этого запроса после выставления следующих сетов:
set statistics io on
set statistics time on

+ попробуй выполнить этот запрос еще и с этим:
set forceplan on

+ вот еще что (результат):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
dbcc traceon( 3604 , 302 , 317 )
go

выполнить оригинальный запрос 
а потом:
dbcc traceoff( 3604 , 302 , 317 )
go
dbcc traceflags
go

перед выполнением выключить настройки :
set statistics io off
set statistics time off
set forceplan off
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34003798
remedium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Медленно работает, потому что дельфины забыли указать в where
одно поле RateType Тип курса (0-ЦБ, 1 - валюта, 2- ПИФ)

Попробуй так:
select
@1MarketPrice = isnull(R.Course,0),
@1DateMP = isnull(R.Date_Time,'19000101') ,
@1FundID1 = isnull(R.FundID,0),
@1RateID1 = isnull(R.RateID,0)
from tRate R (INDEX XAK1tRate)
where R.RateType = 0
and R.ObjectID = @1SecurityID
and R.InstitutionID = 10000000062
and R.Course <> 0
and R.Date_Time = (select max(Date_Time) from tRate (INDEX XAK1tRate)
where RateType = 0
and Date_Time <= @Date
and ObjectID = @1SecurityID
and InstitutionID = 10000000062
and Course <> 0)

А с утверждением, что
ребята пишут в основном грамотный код
я бы поспорил :)

С уважением, Алексей.
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34003858
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
remedium

А с утверждением, что
ребята пишут в основном грамотный код
я бы поспорил :)

С уважением, Алексей.

во, вижу знакомые индексы
кстати, это отчет какой-нить или что?

код основной нормальный, народ знающий, умеющий и могущий (не все, но в основном)

вопросы возникают чаще всего при "оптимизации" на местах, "переосмыслении" индексов, навешивании доп. триггеров и прочая-прочая-прочая...

как пример - славный банк псб
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34004962
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМедленно работает, потому что дельфины забыли указать в where
одно поле RateType Тип курса (0-ЦБ, 1 - валюта, 2- ПИФ)

Спасибо, remedium! наверное, точно. Попробую....

авторво, вижу знакомые индексы
кстати, это отчет какой-нить или что?

sp calccca от диаса
придется, наверное, писать им и ждать исправленный диспатч :)
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34005315
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри как счиатются остатки в последних версиях (лучше 3.6.1) Там идет подзапрос по tRest по дате. Но! там специально max ограничивается снизу датой последнего среза, ибо хоть и есть индекс, Sybase его упорно игнорирует, а вот если дата в подзапросе between - тогда пожалуйста :) Возможно и здесь удастся что-нибудь подобное изобразить...

--
WBR, Alexandr
ICQ 141027797
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34005350
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще как уже вроде здесь говорили

set showplan on

и выполни свой запрос...

После этого план запроса в студию...

ЗЫ: Странно, раньше помнится план запроса гвоздями приколачивали... А тут даже индексы не указаны... Куда катится этот мир :)

--
WBR, Alexandr
ICQ 141027797
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34005927
remedium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У этой таблицы 5 индексов:
XAK1tRate nonclustered, unique located on default RateType, InstitutionID, ObjectID, Date_Time
XIE1tRate nonclustered located on default RateType, InstitutionID, ObjectID, TypeLast
XIE2tRate nonclustered located on default FundID
XIE3tRate nonclustered located on default RateType, ObjectID, Date_Time
XPKtRate nonclustered, unique located on default RateID

XIE2tRate и XPKtRate в данном запросе не помогут, а в остальных первое поле RateType, поэтому без его использования в where будет Table scan, а
DimaU
Таблица tRate ~ полмиллиона записей.

С уважением, Алексей
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34006399
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ еще как уже вроде здесь говорили

set showplan on

и выполни свой запрос...

После этого план запроса в студию...

Если это имеется ввиду, то вот вариант (это не скалярный вариант подзапроса - из sp calccca, данная конструкция повторяется десятки раз в разных sp...):

авторset showplan on

select
*
from tRate R
where R.ObjectID = 10000000073
and R.InstitutionID = 10000000062
and R.Course <> 0
and R.Date_Time = (select max(Date_Time) from tRate
where Date_Time <= '20060919'
and ObjectID = 10000000073
and InstitutionID = 10000000062
and Course <> 0)

дал:

автор
STEP 1
The type of query is SET OPTION ON.


QUERY PLAN FOR STATEMENT 2 (at line 3).


STEP 1
The type of query is SELECT.
Evaluate Ungrouped MAXIMUM AGGREGATE.

FROM TABLE
tRate
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.

STEP 2
The type of query is SELECT.

FROM TABLE
tRate
R
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.
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34006602
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как уже было сказано выше, без указания RateType будет такая фигня, ибо ни в один из индексов запрос не попадает... так что либо создайте правильный индекс, либо зажмитесь полем RateType, либо жалуйтесь в Диасфот :)

--
WBR, Alexandr
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34006939
remedium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaU...данная конструкция повторяется десятки раз в разных sp...):

Согласен на 100%.
Есть подозрение, что когда-то давно поля RateType не было в этой таблице, а потом его добавили, индексы изменили, а про этот кусок кода забыли и с тех пор в основном грамотные ребята копируют его во все процедуры, где нужна оценка ЦБ.

С уважением, Алексей
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Подзапрос и быстродействие, max(Date)
    #34904258
Фотография vmaznheley
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
remedium DimaU...данная конструкция повторяется десятки раз в разных sp...):

Согласен на 100%.
Есть подозрение, что когда-то давно поля RateType не было в этой таблице, а потом его добавили, индексы изменили, а про этот кусок кода забыли и с тех пор в основном грамотные ребята копируют его во все процедуры, где нужна оценка ЦБ.

С уважением, Алексей

Кстати, такая тема в Диасофте встречается не только касательно этой таблицы. И это нормально. Прогресс идет и апгрейды не успевают за ним...))
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34906264
москит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
remediumУ этой таблицы 5 индексов:
XAK1tRate nonclustered, unique located on default RateType, InstitutionID, ObjectID, Date_Time
XIE1tRate nonclustered located on default RateType, InstitutionID, ObjectID, TypeLast
XIE2tRate nonclustered located on default FundID
XIE3tRate nonclustered located on default RateType, ObjectID, Date_Time
XPKtRate nonclustered, unique located on default RateID

XIE2tRate и XPKtRate в данном запросе не помогут, а в остальных первое поле RateType, поэтому без его использования в where будет Table scan, а
DimaU
Таблица tRate ~ полмиллиона записей.

С уважением, Алексей
+1
Без RateType ничего не получится. Он либо ноль, либо 1 в зависимости от того, курс это или котировка.


remedium
...
А с утверждением, что
ребята пишут в основном грамотный код
я бы поспорил :)

С уважением, Алексей.
Судя по именам переменных, этот запрос написан не в Диасе, а "собственными силами". :)


Alexandr KapustinПосмотри как счиатются остатки в последних версиях (лучше 3.6.1) Там идет подзапрос по tRest по дате. Но! там специально max ограничивается снизу датой последнего среза, ибо хоть и есть индекс, Sybase его упорно игнорирует, а вот если дата в подзапросе between - тогда пожалуйста :) Возможно и здесь удастся что-нибудь подобное изобразить...

--
WBR, Alexandr
ICQ 141027797
+1. Но эта "ошибка" исправлена в ASE 15.0.
В более младших версиях ASE, для случая когда у нас @InstitutionID, а не pInstitution это обходится так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @Date_Time datetime
set statistics io on

set rowcount  1 
select @Date_Time = Date_Time
from tRate (index XAK1tRate)
where RateType =  0  -- или 1
and Date_Time <= @Date
and ObjectID = @1SecurityID
and InstitutionID =  10000000062  
and Course <>  0 
order by RateType desc, InstitutionID desc, ObjectID desc, Date_Time desc
set rowcount  0 

select  isnull(R.Course, 0 ), 
isnull(R.Date_Time,'19000101') ,
isnull(R.FundID, 0 ),
isnull(R.RateID, 0 )
from tRate R  (index XAK1tRate)
where R.ObjectID = @1SecurityID
and R.InstitutionID =  10000000062  
and R.Course <>  0 
and R.Date_Time = @Date_Time
...
Рейтинг: 0 / 0
Подзапрос и быстродействие, max(Date)
    #34906273
москит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во втором запросе про RateType забыл.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Подзапрос и быстродействие, max(Date)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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