Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Нужна помощь в оптимизации запроса на 1sqlite (число прочтений - 4967 )
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #15 - 11. Апреля 2012 :: 12:22
Печать  
тексты запросов то покажи, для начала
  
Наверх
 
IP записан
 
k_petrovich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 01. Марта 2012
Пол: Мужской
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #16 - 11. Апреля 2012 :: 12:34
Печать  
1SQLITE
Если НачКвартала(Док.ДатаДок) = НачМесяца(Док.ДатаДок) Тогда
//первый месяц квартала  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3)))";
ИначеЕсли ДобавитьМесяц(НачКвартала(Док.ДатаДок), 1) = НачМесяца(Док.ДатаДок) Тогда    
//второй  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3))))";
ИначеЕсли ДобавитьМесяц(НачКвартала(Док.ДатаДок), 2) = НачМесяца(Док.ДатаДок) Тогда
//третий  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))+(CAST(Остатки.OBDT2 as NUMERIC(15,3))-CAST(Остатки.OBKT2 as NUMERIC(15,3))))";
КонецЕсли;
                         
ТекстЗапроса="
|SELECT
| substr(Остатки.SC2, 1, 9) as [Партия_вид:Справочник.Партии],
| "+СтрСальдо+" as КолвоОстаток,
| SUM(0) as КолвоДебет,
| SUM(0) as КолвоКредит
|FROM
| _1SBKTTL AS Остатки
|WHERE
| (Остатки.DATE = @ДатаПроводкиНач) AND (Остатки.SP4373 = @НашаФирма) AND (Остатки.KIND = '3') AND
| (Остатки.ACCID = @Счет) AND (Остатки.SC0 = @Склад) AND (Остатки.SC1 = @ТМЦ)
|GROUP BY
| Остатки.SC2
|      
|UNION ALL
|      
|SELECT      
|  substr(Проводки.KTSC2,1,9) as [Партия_вид:Справочник.Партии],      
|  SUM(0) as КолвоОстаток,
|  SUM(0) as КолвоДебет,
|  SUM(CAST(Проводки.AMOUNT as NUMERIC(15,3))) as КолвоКредит
| FROM
|  _1SENTRY as Проводки
| WHERE
|  (Проводки.ACCKTID = @Счет) AND (Проводки.KTSC0 = @Склад) AND (Проводки.KTSC1 = @ТМЦ) AND  
|  (Проводки.idx_DATE_TIME_DOCID_NUMBER_CORNO BETWEEN @ДатаПроводкиНач AND @ДатаПроводкиКон)
| GROUP BY
|  Проводки.KTSC2
|
| UNION ALL    
|
| SELECT                            
|  substr(Проводки.DTSC2,1,9) as [Партия_вид:Справочник.Партии],
|  (0) as КолвоОстаток,
|  (CAST(Проводки.AMOUNT as NUMERIC(15,3))) as КолвоДебет,
|  (0) as КолвоКредит
| FROM
|  _1SENTRY as Проводки
| WHERE            
|  (Проводки.ACCDTID = @Счет) and (Проводки.DTSC0 = @Склад) and (Проводки.DTSC1 = @ТМЦ) and
|  (Проводки.idx_DATE_TIME_DOCID_NUMBER_CORNO BETWEEN @ДатаПроводкиНач AND @ДатаПроводкиКон)
| GROUP BY
|  Проводки.DTSC2
|";

OLEDB
Если НачКвартала(Док.ДатаДок) = НачМесяца(Док.ДатаДок) Тогда
//первый месяц квартала  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3)))";
ИначеЕсли ДобавитьМесяц(НачКвартала(Док.ДатаДок), 1) = НачМесяца(Док.ДатаДок) Тогда    
//второй  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3))))";
ИначеЕсли ДобавитьМесяц(НачКвартала(Док.ДатаДок), 2) = НачМесяца(Док.ДатаДок) Тогда
//третий  
СтрСальдо = "SUM(CAST(Остатки.SD as NUMERIC(15,3))+(CAST(Остатки.OBDT1 as NUMERIC(15,3))-CAST(Остатки.OBKT1 as NUMERIC(15,3)))+(CAST(Остатки.OBDT2 as NUMERIC(15,3))-CAST(Остатки.OBKT2 as NUMERIC(15,3))))";
КонецЕсли;
                 
ТекстЗапроса = "SELECT
| Остатки.SC2 as [Партия $Справочник.Партии],                  
| "+СтрСальдо+" as [КолвоОстаток $Число],
| SUM(0) as [КолвоДебет $Число],
| SUM(0) as [КолвоКредит $Число]
|FROM
| 1SBKTTL AS Остатки
|WHERE
| тки.SC1+Остатки.SC2+Остатки.CURRID LIKE
| _______'+'_________'))
|GROUP BY
| Остатки.SC2
|
| UNION ALL
|
|SELECT            
|  Проводки.KTSC2 as [Партия $Справочник.Партии]                  
|  , SUM(0) as [КолвоОстаток $Число]
|  , SUM(0) as [КолвоДебет $Число]
|  , SUM(Проводки.AMOUNT) as [КолвоКредит $Число]
|FROM  
|  1SENTRY as Проводки    
|Where
|  (Проводки.ACCKTID = :Счет) and (Проводки.KTSC0 = :Склад) and (Проводки.KTSC1 = :ТМЦ) and
| оводки.CORNO,5)
| BETWEEN (DTOS(:ДатаПроводкиНач~~)+'      '+'         '+'     '+'     ') AND (:ДатаПроводкиКон~+'ZZZZZ'+'ZZZZZ'))
| GROUP BY
|  Проводки.KTSC2
|
| UNION ALL
|
|SELECT            
|  Проводки.DTSC2 as [Партия $Справочник.Партии]                  
|  , SUM(0) as [КолвоОстаток $Число]
|  , SUM(Проводки.AMOUNT) as [КолвоДебет $Число]
|  , SUM(0) as [КолвоКредит $Число]
|FROM  
|  1SENTRY as Проводки    
|Where
|  (Проводки.ACCDTID = :Счет) and (Проводки.DTSC0 = :Склад) and (Проводки.DTSC1 = :ТМЦ) and
| оводки.CORNO,5)
| BETWEEN (DTOS(:ДатаПроводкиНач~~)+'      '+'         '+'     '+'     ') AND (:ДатаПроводкиКон~+'ZZZZZ'+'ZZZZZ'))
| GROUP BY
|  Проводки.DTSC2
|";
  
Наверх
 
IP записан
 
k_petrovich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 01. Марта 2012
Пол: Мужской
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #17 - 12. Апреля 2012 :: 06:44
Печать  
неужели никому не интересно?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #18 - 12. Апреля 2012 :: 07:20
Печать  
неа..

С виду всё правильно.

Разве что не используешь табличку отбора по счетам
+ в одном запросе отрезаешь часть строки через субстринг, а в другом и так типизируешь..
  
Наверх
 
IP записан
 
k_petrovich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 17
Зарегистрирован: 01. Марта 2012
Пол: Мужской
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #19 - 12. Апреля 2012 :: 08:22
Печать  
1SACCSEL пуста
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #20 - 12. Апреля 2012 :: 09:24
Печать  
k_petrovich писал(а) 12. Апреля 2012 :: 08:22:
1SACCSEL пуста


ааа..значит снят отбор со счетов
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Нужна помощь в оптимизации запроса на 1sqlite
Ответ #21 - 12. Апреля 2012 :: 13:50
Печать  
Что могу посоветовать:
1) Типизацию оставь только в первом запросе, остальные, подтянувшись через UNION, сами подтянуться
2) Если возможно, то вообще убери типизацию, лучше (например, для получения наименования) присоединить справочник "Номенклатура" к запросу и вытащить оттуда "Descr"
3) БухИтоги в 1С-ке вылизаны очень прилично, народ тестировал - существенного повышения производительности не получил (ну ты и сам видишь, глядя на OLEDB)
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать