Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос поработал дней 15 за 3-5 секунд и стал ужас (число прочтений - 5757 )
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Запрос поработал дней 15 за 3-5 секунд и стал ужас
21. Августа 2008 :: 04:34
Печать  
Запрос поработал дней 15 за 3-5 секунд и стал ужасно виснуть

Здравствуйте!
Подскажите пожалуйста в чем причина и если можно исправить то как.
Периодичность сохранения остатков = 15 дней уже 4 года

Изначально я написал запрос он работал за 3-5 секунд
при этом период был 14 дней
через где-то полмесяца он как завис и все
при этом ничего в нем не изменялось до сегоднешнего дня
сегодня я внес в него изменения добавил (NOLOCK) и уменьшил период запроса до 3 дней
при этом время его работы 20 секунд по сравнению с 3-5 секундами очень существенно
не понимаю в чем причина
настала середина месяца открыли новый период и все существенных изменений не было
вроде количество данных примерно тоже
намного ниже указан новый запрос
Изначальный запрос период 14 дней (поработал дней 15 за 3-5 секунд):
Запрос = СоздатьОбъект("ODBCRecordSet");
//*******************************************
//*******************************************
ТекстЗапроса = "
|SELECT
|   Жур.IDDoc as [Док $Документ],
|   Жур.IDDocDef as Док_вид,
|      COALESCE($ДокР.Маршрут, $ДокП.Маршрут) as [Маршрут $Справочник.Маршруты],
|      $ДокР.Клиент as [Клиент $Справочник.Клиенты],
|      $ДокП.Субконто2 as [Субконто2 $Неопределенный]
|FROM
| _1SJourn as Жур
|LEFT JOIN
| $Документ.Расходная as ДокР ON ДокР.IDDoc = Жур.IDDoc AND $ДокР.Вывоз <> :ВыбСамовывоз
|LEFT JOIN
| $Документ.ПриходныйОрдерТБ as ДокП ON ДокП.IDDoc = Жур.IDDoc
|WHERE
| Жур.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~ AND
| (ДокР.$ОбщийРеквизит.Подразделение = :ВыбПодразделение OR

ДокП.$ОбщийРеквизит.Подразделение = :ВыбПодразделение) AND
| ((Жур.IDDocDef = $ВидДокумента.Расходная AND Жур.Closed & 1 = 1) OR (Жур.IDDocDef =

$ВидДокумента.ПриходныйОрдерТБ AND Жур.Closed & 1 = 0)) AND
|      Жур.IsMark = 0 AND
|      Жур.IDDoc NOT IN (
|      SELECT
|            RIGHT($ДокМЛСтроки.Документ,9)
|      FROM
|            $ДокументСтроки.МаршрутныйЛист as ДокМЛСтроки
|      INNER JOIN
|            $Документ.МаршрутныйЛист as ДокМЛ ON ДокМЛ.IDDoc = ДокМЛСтроки.IDDoc AND

ДокМЛ.$ОбщийРеквизит.Подразделение = :ВыбПодразделение
|      INNER JOIN
|            _1SJourn as ЖурДоп ON ЖурДоп.IDDoc = ДокМЛСтроки.IDDoc AND
|                          ЖурДоп.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~ AND
|                          ЖурДоп.IsMark = 0
|)
|";
//*******************************************
//*******************************************
ЛокНачДата = ТекущаяДата()-14;
ЛокКонДата = ТекущаяДата();

Запрос.УстановитьТекстовыйПараметр("ЛокНачДата", ЛокНачДата);
Запрос.УстановитьТекстовыйПараметр("ЛокКонДата", ЛокКонДата);
Запрос.УстановитьТекстовыйПараметр("ВыбПодразделение", Константа.ОснПодразделение);
Запрос.УстановитьТекстовыйПараметр("ВыбСамовывоз", Перечисление.ВидВывоза.Самовывоз);
//*******************************************
ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);



НОВЫЙ ЗАПРОС период 3 дня (за 20 секунд):

Запрос = СоздатьОбъект("ODBCRecordSet");
//*******************************************
//*******************************************
ТекстЗапроса = "
|SELECT
|   Жур.IDDoc as [Док $Документ],
|   Жур.IDDocDef as Док_вид,
|      COALESCE($ДокР.Маршрут, $ДокП.Маршрут) as [Маршрут $Справочник.Маршруты],
|      $ДокР.Клиент as [Клиент $Справочник.Клиенты],
|      $ДокП.Субконто2 as [Субконто2 $Неопределенный]
|FROM
| _1SJourn as Жур (NOLOCK)
|LEFT JOIN
| $Документ.Расходная as ДокР (NOLOCK) ON ДокР.IDDoc = Жур.IDDoc AND $ДокР.Вывоз <>

:ВыбСамовывоз
|LEFT JOIN
| $Документ.ПриходныйОрдерТБ as ДокП (NOLOCK) ON ДокП.IDDoc = Жур.IDDoc
|WHERE
| Жур.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~ AND
| (ДокР.$ОбщийРеквизит.Подразделение = :ВыбПодразделение OR

ДокП.$ОбщийРеквизит.Подразделение = :ВыбПодразделение) AND
| ((Жур.IDDocDef = $ВидДокумента.Расходная AND Жур.Closed & 1 = 1) OR (Жур.IDDocDef =

$ВидДокумента.ПриходныйОрдерТБ AND Жур.Closed & 1 = 0)) AND
|      Жур.IsMark = 0 AND
|      Жур.IDDoc NOT IN (
|      SELECT
|            RIGHT($ДокМЛСтроки.Документ,9)
|      FROM
|            $ДокументСтроки.МаршрутныйЛист as ДокМЛСтроки (NOLOCK)
|      INNER JOIN
|            $Документ.МаршрутныйЛист as ДокМЛ (NOLOCK) ON ДокМЛ.IDDoc =

ДокМЛСтроки.IDDoc AND ДокМЛ.$ОбщийРеквизит.Подразделение = :ВыбПодразделение
|      INNER JOIN
|            _1SJourn as ЖурДоп (NOLOCK) ON ЖурДоп.IDDoc = ДокМЛСтроки.IDDoc AND
|                          ЖурДоп.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~ AND
|                          ЖурДоп.IsMark = 0
|)
|";
//*******************************************
//*******************************************
ЛокНачДата = ТекущаяДата()-3;
ЛокКонДата = ТекущаяДата();

Запрос.УстановитьТекстовыйПараметр("ЛокНачДата", ЛокНачДата);
Запрос.УстановитьТекстовыйПараметр("ЛокКонДата", ЛокКонДата);
Запрос.УстановитьТекстовыйПараметр("ВыбПодразделение", Константа.ОснПодразделение);
Запрос.УстановитьТекстовыйПараметр("ВыбСамовывоз", Перечисление.ВидВывоза.Самовывоз);
//*******************************************
ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #1 - 21. Августа 2008 :: 04:41
Печать  
А можно план запроса посмотреть?
  
Наверх
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #2 - 21. Августа 2008 :: 05:06
Печать  
чуть позже
изучаю как делать план запроса
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #3 - 21. Августа 2008 :: 06:33
Печать  
Ну для начала, я бы поставил отбор на ОбщийРеквизит.Подразделение, тогда бы отпала необходимость в подзапросе джойнить с шапкой дока МаршрутныйЛист, и во втором запросе (nolock) по табличной части - лишнее, имхо.
  
Наверх
 
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #4 - 21. Августа 2008 :: 06:56
Печать  
после некоторых учений-мучений план во вложении
вроде то
обязательно для читабельности в блокноте убрать галочку Формат->Перенос по словам


поставить отбор на ОбщийРеквизит.Подразделение можно попробовать
во втором запросе (nolock) по табличной части - лишнее уберем
(если правильно понял FROM
     |            $ДокументСтроки.МаршрутныйЛист as ДокМЛСтроки (NOLOCK))

но само главное раньше то и без (NOLOCK) 3-5 секунд и не одинь день работал
  

Plan.txt ( 8 KB | Загрузки )
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #5 - 21. Августа 2008 :: 08:42
Печать  
сейчас обдумаем  Подмигивание
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #6 - 21. Августа 2008 :: 08:46
Печать  
А расскажи суть запроса на словах? Какая задача?
  
Наверх
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #7 - 21. Августа 2008 :: 09:12
Печать  
есть документы Расходная и ПКО
при отправке водителя то что он по факту забирает
вноситься в табличную часть Маршрутного листа

отчет выбирает те документы которые отсутствуют в табличной части
Маршрутного листа
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #8 - 22. Августа 2008 :: 07:43
Печать  
1c_DBReindex тебе поможет. Правда, если база большая, придется подождать.
У меня в базе (щас около 57гиг) джоб настроен в ночь на воскресенье запускает эту процедурину.
  
Наверх
 
IP записан
 
NFF
Junior Member
**
Отсутствует



Сообщений: 23
Зарегистрирован: 19. Июня 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #9 - 22. Августа 2008 :: 07:59
Печать  
У меня раньше тоже такая проблема была, пока в плане оптимизацию не сделал!
  
Наверх
 
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #10 - 22. Августа 2008 :: 10:48
Печать  
1c_DBReindex настроен один раз в месяц (сделаем  внеочередную) база чуть меньше 10 Гб
в плане оптимизацию не умею

можно вопрос
57гиг это типовая?
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #11 - 22. Августа 2008 :: 12:49
Печать  
vova64 писал(а) 22. Августа 2008 :: 10:48:
можно вопрос
57гиг это типовая?

не совсем. Когда-то очень давно ее отпочковали от типовой торговли и сильно переделали.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #12 - 22. Августа 2008 :: 19:55
Печать  
попробуйте так:
Код
Выбрать все
IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#TMP_TABLE'))
DROP TABLE #TMP_TABLE

SELECT
	DISTINCT $ДокМЛСтроки.Документ AS Док
INTO #TMP_TABLE

FROM
    $ДокументСтроки.МаршрутныйЛист as ДокМЛСтроки (NOLOCK)
	INNER JOIN $Документ.МаршрутныйЛист as ДокМЛ (NOLOCK)
		ON ДокМЛ.IDDoc =  ДокМЛСтроки.IDDoc
    INNER JOIN _1SJourn as ЖурДоп (NOLOCK) ON ЖурДоп.IDDoc = ДокМЛ.IDDoc
WHERE
	ДокМЛ.$ОбщийРеквизит.Подразделение = :ВыбПодразделение
	AND ЖурДоп.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~
	AND ЖурДоп.IsMark = 0

SELECT
	Жур.IDDoc as [Док $Документ],
	Жур.IDDocDef as Док_вид,
	$ДокР.Маршрут as [Маршрут $Справочник.Маршруты],
	$ДокР.Клиент as [Клиент $Справочник.Клиенты],
	'U			    ' as [Субконто2 $Неопределенный]
FROM
	$Документ.Расходная as ДокР (NOLOCK)
	INNER JOIN _1SJourn as Жур (NOLOCK) ON (ДокР.IDDoc = Жур.IDDoc )
WHERE
	AND (Жур.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~)
	AND (Жур.Closed & 1 = 1)
	AND (Жур.IsMark = 0)
	AND ($ДокР.Вывоз <> :ВыбСамовывоз)
	AND (ДокР.$ОбщийРеквизит.Подразделение = :ВыбПодразделение)
	AND ($ВидДокумента36.Расходная + Жур.IDDoc NOT IN (SELECT Док FROM #TMP_TABLE))
UNION ALL
SELECT
	Жур.IDDoc as [Док $Документ],
	Жур.IDDocDef as Док_вид,
	$ДокП.Маршрут as [Маршрут $Справочник.Маршруты],
	$ДокП.Клиент as [Клиент $Справочник.Клиенты],
	$ДокП.Субконто2 as [Субконто2 $Неопределенный]
FROM
	$Документ.ПриходныйОрдерТБ as ДокП (NOLOCK)
	INNER JOIN _1SJourn as Жур (NOLOCK) ON (ДокП.IDDoc = Жур.IDDoc )
WHERE
	AND (Жур.Date_Time_IDDoc BETWEEN :ЛокНачДата AND :ЛокКонДата~)
	AND (Жур.Closed & 1 = 1)
	AND (Жур.IsMark = 0)
	AND ($ДокП.$ОбщийРеквизит.Подразделение = :ВыбПодразделение)
	AND ($ВидДокумента36.ПриходныйОрдерТБ + Жур.IDDoc NOT IN (SELECT Док FROM #TMP_TABLE))
 

  
Наверх
IP записан
 
vova64
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #13 - 25. Августа 2008 :: 06:50
Печать  
Спасибо за ответ
Ваш запрос при том же периоде
выполняется в 10 раз быстрее
т.е.
Ваш запрос период 14 дней 59 секунд
Мой последний запрос период 14 дней 577 секунд
но я не смог извлеч данных из вашего запроса он возвращает числовое значение
ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Сообщить(ТипЗначенияСтр(ТабВрем));
Сообщить(ТабВрем);
дает
"Число"
"0"
видимо это результат команды "IF EXISTS"
подскажите как извлеч данные SELECT
может нужно разделить на два метода
ТекстЗапроса1 = "IF EXISTS..."
ТекстЗапроса2 = "SELECT..."
Запрос.ВыполнитьИнструкцию(ТекстЗапроса1);
Запрос.ВыполнитьИнструкцию(ТекстЗапроса2);
на текущий момент для работы уменьшили период до 3 дней
время выполнения примерно 20 сек
пока работаем так нормально
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #14 - 26. Августа 2008 :: 13:38
Печать  
vova64 писал(а) 25. Августа 2008 :: 06:50:
Спасибо за ответ
Ваш запрос при том же периоде
выполняется в 10 раз быстрее
т.е.
Ваш запрос период 14 дней 59 секунд
Мой последний запрос период 14 дней 577 секунд
но я не смог извлеч данных из вашего запроса он возвращает числовое значение
ТабВрем = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Сообщить(ТипЗначенияСтр(ТабВрем));
Сообщить(ТабВрем);
дает
"Число"
"0"
видимо это результат команды "IF EXISTS"
подскажите как извлеч данные SELECT
может нужно разделить на два метода
ТекстЗапроса1 = "IF EXISTS..."
ТекстЗапроса2 = "SELECT..."
Запрос.ВыполнитьИнструкцию(ТекстЗапроса1);
Запрос.ВыполнитьИнструкцию(ТекстЗапроса2);
на текущий момент для работы уменьшили период до 3 дней
время выполнения примерно 20 сек
пока работаем так нормально


В начале запроса "SET NOCOUNT ON" чтобы возвращал данные последнего запроса.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать