Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть задача увеличить производительность (скорость) программы на базе 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) от поля даты - эффективна ли? или есть прием более быстрый? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 10:28 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Напиши весь запрос. Ибо оно не понятно, что там у тебя за логика в него заложена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 10:45 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 11:17 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
IMHO, Некоррелированный скалярный подзапрос во фразе WHERE выполняется один раз, а дальше результат его выполнения используется как константа для всего остального запроса. Поэтому "вынеся подзапрос вверх" делу не поможешь. А вообще, нужно на планы и статистику выполнения смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 12:04 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Бабичев Сергей Некоррелированный скалярный подзапрос во фразе WHERE выполняется один раз, а дальше результат его выполнения используется как константа для всего остального запроса. Поэтому "вынеся подзапрос вверх" делу не поможешь. Понял, спасибо. Хорошо, если так. >А вообще, нужно на планы и статистику выполнения смотреть Хм... Узнать бы хорошие средства? Пока использую только монитор DBArtisan и смотрю по: авторselect ... p.program_name, object_name(p.id,p.dbid) as procedure_name, p.linenum, -- строка запроса ... from master..sysprocesses p ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 12:42 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
DimaU, судя по названию таблицы эта программа есть продукт Диасофт ребята пишут в основном грамотный код, и я бы не советовал переписывать их запросы только потому, что что-то долго выполняется, тем более не имея понятия как смотреть планы запросов. рекомендую сначала с помощью того же Артизана перестроить индексы на базе и проапдейтить табличную статистику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 14:45 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
судя по названию таблицы эта программа есть продукт Диасофт ребята пишут в основном грамотный код солидарен с Вами! :) хотя error находились все равно... писали... разработчики исправляли... >перестроить индексы на базе и проапдейтить табличную статистику. это делается регулярно раз в неделю сисадмином! все-таки есть затыки и в коде sp-процедур, наверное? раз время выполнения некоторых процессов > неск. часов (без учета блокировок) тут и приходится искать "торможение"... PS Кстати, такая конструкция: select ... from tRate where ObjectID = '' and InstrumentID = '' group by Date_Time having Date_Time = max(DateTime) будет ли лучше вышеприведенной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 15:09 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
пришли пл следующее: sp_help tRate + результат выполнения этого запроса после выставления следующих сетов: set statistics io on set statistics time on + попробуй выполнить этот запрос еще и с этим: set forceplan on ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 19:02 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
komradпришли пл следующее: sp_help tRate + результат выполнения этого запроса после выставления следующих сетов: set statistics io on set statistics time on + попробуй выполнить этот запрос еще и с этим: set forceplan on + вот еще что (результат): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. перед выполнением выключить настройки : set statistics io off set statistics time off set forceplan off ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2006, 19:20 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Медленно работает, потому что дельфины забыли указать в 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) А с утверждением, что ребята пишут в основном грамотный код я бы поспорил :) С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 16:11 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
remedium А с утверждением, что ребята пишут в основном грамотный код я бы поспорил :) С уважением, Алексей. во, вижу знакомые индексы кстати, это отчет какой-нить или что? код основной нормальный, народ знающий, умеющий и могущий (не все, но в основном) вопросы возникают чаще всего при "оптимизации" на местах, "переосмыслении" индексов, навешивании доп. триггеров и прочая-прочая-прочая... как пример - славный банк псб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2006, 16:23 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
авторМедленно работает, потому что дельфины забыли указать в where одно поле RateType Тип курса (0-ЦБ, 1 - валюта, 2- ПИФ) Спасибо, remedium! наверное, точно. Попробую.... авторво, вижу знакомые индексы кстати, это отчет какой-нить или что? sp calccca от диаса придется, наверное, писать им и ждать исправленный диспатч :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 09:25 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Посмотри как счиатются остатки в последних версиях (лучше 3.6.1) Там идет подзапрос по tRest по дате. Но! там специально max ограничивается снизу датой последнего среза, ибо хоть и есть индекс, Sybase его упорно игнорирует, а вот если дата в подзапросе between - тогда пожалуйста :) Возможно и здесь удастся что-нибудь подобное изобразить... -- WBR, Alexandr ICQ 141027797 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 10:58 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
И еще как уже вроде здесь говорили set showplan on и выполни свой запрос... После этого план запроса в студию... ЗЫ: Странно, раньше помнится план запроса гвоздями приколачивали... А тут даже индексы не указаны... Куда катится этот мир :) -- WBR, Alexandr ICQ 141027797 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 11:03 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
У этой таблицы 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 ~ полмиллиона записей. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 13:04 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
авторИ еще как уже вроде здесь говорили 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 14:44 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
Как уже было сказано выше, без указания RateType будет такая фигня, ибо ни в один из индексов запрос не попадает... так что либо создайте правильный индекс, либо зажмитесь полем RateType, либо жалуйтесь в Диасфот :) -- WBR, Alexandr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 15:31 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
DimaU...данная конструкция повторяется десятки раз в разных sp...): Согласен на 100%. Есть подозрение, что когда-то давно поля RateType не было в этой таблице, а потом его добавили, индексы изменили, а про этот кусок кода забыли и с тех пор в основном грамотные ребята копируют его во все процедуры, где нужна оценка ЦБ. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2006, 17:07 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
remedium DimaU...данная конструкция повторяется десятки раз в разных sp...): Согласен на 100%. Есть подозрение, что когда-то давно поля RateType не было в этой таблице, а потом его добавили, индексы изменили, а про этот кусок кода забыли и с тех пор в основном грамотные ребята копируют его во все процедуры, где нужна оценка ЦБ. С уважением, Алексей Кстати, такая тема в Диасофте встречается не только касательно этой таблицы. И это нормально. Прогресс идет и апгрейды не успевают за ним...)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 12:34 |
|
||
|
Подзапрос и быстродействие, max(Date)
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2007, 08:32 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33999415&tid=2011839]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 339ms |

| 0 / 0 |
