Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Добрый день!

В таблицу добавляются данные по ODBC, примерно 20 записей в секунду (вставка или обновление по первичному ключу).

Запрос с выборкой из этой таблицы занимает 60 секунд.
Если остановить добавление данных - запрос выполняется за 1 секунду.

Подскажите, плз, в каком направлении смотреть, чтоб сократить время выполнения запроса?
3 июн 17, 12:53    [20536781]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
aleks2
Guest
Arl
Добрый день!

В таблицу добавляются данные по ODBC, примерно 20 записей в секунду (вставка или обновление по первичному ключу).

Запрос с выборкой из этой таблицы занимает 60 секунд.
Если остановить добавление данных - запрос выполняется за 1 секунду.

Подскажите, плз, в каком направлении смотреть, чтоб сократить время выполнения запроса?


В направлении кластерного индекса и прочих индексов.

1. Кластерный - шоб вставка была в конец или начало.
2. Прочие - шоб числом поменее. Или яко кластерный - шоб вставка была в конец или начало.
3. 1 секунда - это ОЧЕНЬ долго. Запрос написан коряво и бездарно.
3 июн 17, 13:01    [20536786]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30821
Arl
Запрос с выборкой из этой таблицы занимает 60 секунд.
А какой запрос, со сложным нечётким поиском с ранжированием результата, или получение записи по ПК?
3 июн 17, 13:10    [20536795]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Запрос и правда сложный, с двумя left join, но меня смущает разница времени выполнения.
Один и тот же запрос во время добавления данных 60 сек, без добавления - 1 с..
3 июн 17, 13:12    [20536797]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
alexeyvg
Arl
Запрос с выборкой из этой таблицы занимает 60 секунд.
А какой запрос, со сложным нечётким поиском с ранжированием результата, или получение записи по ПК?

Выборка по первичному ключу из двух таблиц, с left join, group by и сортировкой результата.
3 июн 17, 13:14    [20536798]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Вот схема запроса.
Картинка с другого сайта.
3 июн 17, 13:26    [20536811]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Может быть, это как-то связано с блокировкой БД во время запроса и вставкой новых данных по ODBC..?

И еще, во время получения данных по ODBC, при выполнении выборки в схеме запроса выводится предупреждение "используется tempdb для сортировки"..
3 июн 17, 13:52    [20536833]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Arl,

у вас там скан в TV_SEC в неё идёт вставка?
3 июн 17, 14:27    [20536859]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Да причины разные могут быть, вплоть до того что данные с tablock'ом вставляете.
Посмотрите в whoisactive для начала.
3 июн 17, 14:28    [20536860]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
TaPaK
Arl,

у вас там скан в TV_SEC в неё идёт вставка?

Да, верно. INSERT по первичному ключу, если такая запись есть - то UPDATE
3 июн 17, 14:30    [20536863]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Arl,

ну так и разберитесь, почему scan а не seek. Как вариант попробуйте WITH (FORCESEEK) на неё с OPTION (RECOMPILE) и смотрите в план... По картинке без гадать трудно, да и запрос где?
3 июн 17, 14:33    [20536869]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Remind
Да причины разные могут быть, вплоть до того что данные с tablock'ом вставляете.
Посмотрите в whoisactive для начала.

Вставка и обновление данных происходит при срабатывании триггера в другой таблице.
tablock не использовал.
3 июн 17, 14:34    [20536870]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Arl,

посмотрите что какие блокировки ваша вставка накладывает
3 июн 17, 14:34    [20536871]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
TaPaK
Arl,

ну так и разберитесь, почему scan а не seek. Как вариант попробуйте WITH (FORCESEEK) на неё с OPTION (RECOMPILE) и смотрите в план... По картинке без гадать трудно, да и запрос где?


SELECT  
	DTM.Datime1min as Datime  , 

	sum(DATABYE.всегоСделокПокупка) as КупВсегоСделок  , 
	sum(DATABYE.всегоРублейПокупка) as КупВсегоРублей , 
	min(DATABYE.минЦенаПокупка) as КупМинЦена  , 
	max(DATABYE.максЦенаПокупка) as КупМаксЦена  , 

	sum(DATASELL.всегоСделокПродажа) as ПродВсегоСделок , 
	sum(DATASELL.всегоРублейПродажа) as ПродВсегоРублей , 
	min(DATASELL.минЦенаПродажа) as ПродМинЦена  , 
	max(DATASELL.максЦенаПродажа) as ПродМаксЦена  

FROM  
	(select  
	 [Datime1sec] as d1s 
	,[Datime1min] 
	from [TVS_HIST_SQL].[dbo].[TBL_DATIME_SEC]  where [Datime1sec] between '29.05.2017 09:00:00' and '29.05.2017 18:00:00')  
	DTM 

LEFT JOIN  	
	(select
	 [Datime1sec]  
	,[Всего_сделок] as всегоСделокПокупка 
	,[Всего_рублей] as всегоРублейПокупка 
	,[Мин_цена] as минЦенаПокупка 
	,[Макс_цена] as максЦенаПокупка 
	from [TVS_HIST_SQL].[dbo].[TVS_SEC]  
	where 
	([Datime1sec] between '29.05.2017 09:00:00' and '29.05.2017 18:00:00')  and Операция = 1  )  
	DATABYE 

ON DTM.d1s = DATABYE.Datime1sec 

LEFT JOIN 
	(select  
	 [Datime1sec] 
	,[Всего_сделок] as всегоСделокПродажа 
	,[Всего_рублей] as всегоРублейПродажа 
	,[Мин_цена] as минЦенаПродажа  
	,[Макс_цена] as максЦенаПродажа 
	from [TVS_HIST_SQL].[dbo].[TVS_SEC] 
	where ([Datime1sec] between '29.05.2017 09:00:00' and '29.05.2017 18:00:00')  and Операция = 0  )  
	DATASELL  

ON DTM.d1s = DATASELL.Datime1sec 
GROUP BY DTM.Datime1min 
ORDER BY DTM.Datime1min ASC
3 июн 17, 14:47    [20536887]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
TaPaK
Arl,

посмотрите что какие блокировки ваша вставка накладывает

Подскажите, где это можно посмотреть?
И как заставить сервер использовать seek вместо scan?
3 июн 17, 14:49    [20536891]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Arl
TaPaK
Arl,

посмотрите что какие блокировки ваша вставка накладывает

Подскажите, где это можно посмотреть?
И как заставить сервер использовать seek вместо scan?

прочитал внимательней, WITH (FORCESEEK), пробую.
3 июн 17, 14:56    [20536900]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Сделать из простейшего запроса такую стену с 3 вложенными - это нужно было постараться :)
3 июн 17, 15:08    [20536912]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Remind
Сделать из простейшего запроса такую стену с 3 вложенными - это нужно было постараться :)

:) Я старался.
Посоветуете, как оптимизировать?
3 июн 17, 15:13    [20536922]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
Arl
Посоветуете, как оптимизировать?
Это надо переписывать, а не оптимизировать.
Тем более, что запрос неверен - подумайте какой результат получится, если для одной [Datime1sec] будет, например, две строки с Операция = 1 и одна с Операция = 0.
3 июн 17, 15:29    [20536947]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Arl, ну как минимум:
SELECT  
  DTM.Datime1min as Datime, 

  sum(case when DATA.[Операция] = 1 then DATA.[Всего_сделок] end) as КупВсегоСделок, 
  sum(case when DATA.[Операция] = 1 then DATA.[Всего_рублей] end) as КупВсегоРублей, 
  min(case when DATA.[Операция] = 1 then DATA.[Мин_цена] end) as КупМинЦена, 
  max(case when DATA.[Операция] = 1 then DATA.[Макс_цена] end) as КупМаксЦена, 

  sum(case when DATA.[Операция] = 0 then DATA.[Всего_сделок] end) as ПродВсегоСделок, 
  sum(case when DATA.[Операция] = 0 then DATA.[Всего_рублей] end) as ПродВсегоРублей, 
  min(case when DATA.[Операция] = 0 then DATA.[Мин_цена] end) as ПродМинЦена, 
  max(case when DATA.[Операция] = 0 then DATA.[Макс_цена] end) as ПродМаксЦена

FROM [TVS_HIST_SQL].[dbo].[TBL_DATIME_SEC] DTM 
LEFT JOIN [TVS_HIST_SQL].[dbo].[TVS_SEC] DATA  
  ON DATA.[Datime1sec] between '29.05.2017 09:00:00' and '29.05.2017 18:00:00'
  AND DATA.[Datime1sec] = DTM.[Datime1sec] 
WHERE DTM.[Datime1sec] between '29.05.2017 09:00:00' and '29.05.2017 18:00:00'
GROUP BY DTM.Datime1min 
ORDER BY DTM.Datime1min ASC
3 июн 17, 15:31    [20536953]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
invm
Arl
Посоветуете, как оптимизировать?
Это надо переписывать, а не оптимизировать.
Тем более, что запрос неверен - подумайте какой результат получится, если для одной [Datime1sec] будет, например, две строки с Операция = 1 и одна с Операция = 0.

Сейчас результат запроса именно тот, который нужен.
Две строи быть не может, так как [Datime1sec] и [Операция] входят в первичный ключ.
3 июн 17, 15:33    [20536960]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Remind
Arl, ну как минимум:
SELECT  

Спасибо, сейчас буду разбираться и тестировать.
3 июн 17, 15:36    [20536963]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Arl,

автор
Запрос и правда сложный, с двумя left join,
тут и не поспоришь... надо больше джоинов с одними и теми же условиями
3 июн 17, 15:36    [20536964]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Arl, вашу проблему это не решит, смотрите в сторону блокировок как уже сказали.
3 июн 17, 15:38    [20536968]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения запроса  [new]
Arl
Member

Откуда:
Сообщений: 90
Arl
Remind
Arl, ну как минимум:
SELECT  

Спасибо, сейчас буду разбираться и тестировать.

Да, время выполнения Вашего запроса меньше.
3 июн 17, 15:38    [20536970]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить