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


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 29. Июля 2008
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #15 - 27. Августа 2008 :: 11:45
Печать  
Все спасибо большое работает
поставил SET NOCOUNT ON
тестил тестил (База тестовая поэтому ТА 20.08.08)
интересная статистика получается
ну мой запрос по времени отдыхает
а вот новый запрос
в разные периоды дает разные результаты непропорционально периоду
интересно с чем это связано
пример
период 14 дней среднее время 50 сек
период 7 дней среднее время 3 сек
период 5 дней среднее время 8 сек
период 3 дней среднее время 4 сек
период 2 дней среднее время 5 сек

дальше решил сдвигать период 7 дней в пределах месяца
период 7 дней  с ТА 20.08.01 по 13.08.08 среднее время 2 сек
период 7 дней  с ТА 19.08.01 по 12.08.08 среднее время 3 сек
период 7 дней  с ТА 18.08.01 по 11.08.08 среднее время 2 сек
и тут резкий скачек
период 7 дней  с ТА 17.08.01 по 10.08.08 среднее время 11 сек
потом вроде все по прежнему
период 7 дней  с ТА 16.08.01 по 9.08.08 среднее время 2 сек
период 7 дней  с ТА 15.08.01 по 8.08.08 среднее время 3 сек
период 7 дней  с ТА 14.08.01 по 7.08.08 среднее время 2 сек
период 7 дней  с ТА 13.08.01 по 6.08.08 среднее время 3 сек
и тут снова резкий скачек
период 7 дней  с ТА 12.08.01 по 5.08.08 среднее время 15 сек
период 7 дней  с ТА 11.08.01 по 4.08.08 среднее время 15 сек
период 7 дней  с ТА 10.08.01 по 3.08.08 среднее время 11 сек
период 7 дней  с ТА 9.08.01 по 2.08.08 среднее время 11 сек
период 7 дней  с ТА 8.08.01 по 1.08.08 среднее время 14 сек
период 7 дней  с ТА 7.08.01 по 31.07.08 среднее время 9 сек
период 7 дней  с ТА 6.08.01 по 30.07.08 среднее время 8 сек
период 7 дней  с ТА 5.08.01 по 29.07.08 среднее время 9 сек
период 7 дней  с ТА 4.08.01 по 28.07.08 среднее время 8 сек
период 7 дней  с ТА 3.08.01 по 27.07.08 среднее время 8 сек
...

Ответье еще пожалуйста на вопрос конструкция

IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#TMP_TABLE'))
DROP TABLE #TMP_TABLE

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

Создает и удаляет локальную временную таблицу
насколько такие операции желательны или нежелательны
возможно ли возникновение проблемм с неудаленными таблицами в следствии форс-мажора (отключения света на клиентской машине и т.д.) ???
я попытался посмотреть наличие таблицы в БД tempdb
запустил EnterpriseManager открыл список таблиц БД tempdb
запустил запрос потом обновлял список таблиц но там только таблицы начинающиеся с sys и нет таблицы #TMP_TABLE почему?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос поработал дней 15 за 3-5 секунд и стал
Ответ #16 - 29. Августа 2008 :: 08:48
Печать  
Временные таблицы видни только из под текущего коннекта. Они сами удаляются когда коннект прерывается (или может когда происходит следующий коннект). В общем SQL Server сам следит за тем чтобы подчищать неудаленные временные таблицы при разных форс-мажорах.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать