Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MSFT SQL Server - Очень долгое выполнение хранимой процедуры. Sql Server 2008

Ответить
Настройки темы
MSFT SQL Server - Очень долгое выполнение хранимой процедуры. Sql Server 2008

В Поисках Истины


Сообщения: 802
Благодарности: 135


Конфигурация

Профиль | Отправить PM | Цитировать


Доброе утро, уважаемые.

Появилась проблема. Есть хранимая процедура, которая используется в работе с MapInfo(MapBasic).
Ее код выглядит следующим образом:
читать дальше »

Код: Выделить весь код
ALTER PROCEDURE mipGet2gWeekDifference 
	@starttime date,
	@colNumber int
AS

BEGIN

	IF OBJECT_ID('dbo.mi2gDATA','U') IS NOT NULL
		DROP TABLE dbo.mi2gDATA
		
	SELECT CellId = this_t.CellId, CellName = this_t.Cell_Name, Data = this_t.this - prev_t.prev,
	PriValues = this_t.this, SlValues = prev_t.prev 
	INTO mi2gDATA
	FROM 
		(SELECT data.starttime, info.CellId, info.Cell_Name,
			this = CASE @colNumber
			WHEN 1 THEN AVG(data.SDCCH_traffic_ave)
			WHEN 2 THEN AVG(data.SDCCH_congest_time)
			WHEN 3 THEN AVG(CAST(data.SDCCH_real_blocking AS Real) / 100)
			WHEN 4 THEN AVG((100 - CAST(data.Total_HO_success As REAL) / 100))
			WHEN 5 THEN AVG(CAST(data.Total_HO_success As REAL) / 100)
			WHEN 6 THEN AVG(CAST(data.TCH_drop_call AS Real) / 100)
			WHEN 7 THEN AVG(CAST(data.TCH_call_block AS REAL) / 100)
			WHEN 8 THEN AVG(data.Total_FTCH_seizure_time)
			WHEN 9 THEN AVG(data.Total_HTCH_seizure_time)
			WHEN 10 THEN AVG(CAST(data.CSSR_voice As Real) / 100)
			WHEN 11 THEN AVG(data.TCH_traffic_sum)
			WHEN 12 THEN AVG(data.UL_gprs_RLC)
			WHEN 13 THEN AVG(data.DL_gprs_RLC)
			WHEN 14 THEN AVG(data.UL_egprs_RLC)
			WHEN 15 THEN AVG(data.DL_egprs_RLC)
			WHEN 16 THEN AVG(CAST(data.Drop_Call_Cell As Real) / 100)
			WHEN 17 THEN AVG(data.Drop_Call_Bss)
			WHEN 18 THEN AVG(data.Drop_Call_Plmn)
			END
		FROM Data2GEvD data, t2gCells info
		WHERE data.starttime = @starttime AND info.id = data.cell_Id
		GROUP BY data.starttime, info.CellId, info.Cell_Name) this_t
	LEFT JOIN
		(SELECT data.starttime, info.CellId, 
			prev = CASE @colNumber
			WHEN 1 THEN AVG(data.SDCCH_traffic_ave)
			WHEN 2 THEN AVG(data.SDCCH_congest_time)
			WHEN 3 THEN AVG(CAST(data.SDCCH_real_blocking AS Real) / 100)
			WHEN 4 THEN AVG((100 - CAST(data.Total_HO_success As REAL) / 100))
			WHEN 5 THEN AVG(CAST(data.Total_HO_success As REAL) / 100)
			WHEN 6 THEN AVG(CAST(data.TCH_drop_call AS Real) / 100)
			WHEN 7 THEN AVG(CAST(data.TCH_call_block AS REAL) / 100)
			WHEN 8 THEN AVG(data.Total_FTCH_seizure_time)
			WHEN 9 THEN AVG(data.Total_HTCH_seizure_time)
			WHEN 10 THEN AVG(CAST(data.CSSR_voice As Real) / 100)
			WHEN 11 THEN AVG(data.TCH_traffic_sum)
			WHEN 12 THEN AVG(data.UL_gprs_RLC)
			WHEN 13 THEN AVG(data.DL_gprs_RLC)
			WHEN 14 THEN AVG(data.UL_egprs_RLC)
			WHEN 15 THEN AVG(data.DL_egprs_RLC)
			WHEN 16 THEN AVG(CAST(data.Drop_Call_Cell As Real) / 100)
			WHEN 17 THEN AVG(data.Drop_Call_Bss)
			WHEN 18 THEN AVG(data.Drop_Call_Plmn)
			END
		FROM Data2GEvD data, t2gCells info
		WHERE data.starttime = DATEADD(day,-7,@starttime) AND info.id = data.cell_Id
		GROUP BY data.starttime, info.CellId) prev_t
	ON prev_t.CellId = this_t.CellId
END

Структура таблицы откуда берутся данные:

читать дальше »

Код: Выделить весь код
CREATE TABLE dbo.Data2GEvD
	(
	id                      INT IDENTITY NOT NULL,
	cell_Id                 INT NOT NULL,
	starttime               DATE NOT NULL,
	SDCCH_traffic_ave       REAL,
	SDCCH_congest_time      REAL,
	SDCCH_real_blocking     SMALLINT,
	Total_HO_success        SMALLINT,
	TCH_drop_call           SMALLINT,
	TCH_call_block          SMALLINT,
	Total_FTCH_seizure_time REAL,
	Total_HTCH_seizure_time REAL,
	CSSR_voice              SMALLINT,
	TCH_traffic_sum         REAL,
	UL_gprs_RLC             REAL,
	DL_gprs_RLC             REAL,
	UL_egprs_RLC            REAL,
	DL_egprs_RLC            REAL,
	Drop_Call_Cell          SMALLINT,
	Drop_Call_Bss           REAL,
	Drop_Call_Plmn          REAL,
	CONSTRAINT PK_Data2GEvD PRIMARY KEY (id)
	)
GO

CREATE INDEX idateevd
	ON dbo.Data2GEvD (starttime)
GO


В таблице записей, на данный момент, порядка 2 миллионов. Представленная выше процедура выполняется около 15 минут. И это очень очень много. При выполнении обычного запроса:
читать дальше »

Код: Выделить весь код
DECLARE @starttime date
DECLARE @colNumber int

SET @starttime = '2013-01-28'
SET @colNumber = 16

IF OBJECT_ID('dbo.mi2gDATA','U') IS NOT NULL
	DROP TABLE dbo.mi2gDATA

SELECT CellId = this_t.CellId, CellName = this_t.Cell_Name, Data = this_t.this - prev_t.prev,
	PriValues = this_t.this, SlValues = prev_t.prev  
INTO  mi2gDATA
	FROM 
		(SELECT data.starttime, info.CellId, info.Cell_Name,
			this = CASE @colNumber
			WHEN 1 THEN AVG(data.SDCCH_traffic_ave)
			WHEN 2 THEN AVG(data.SDCCH_congest_time)
			WHEN 3 THEN AVG(CAST(data.SDCCH_real_blocking AS Real) / 100)
			WHEN 4 THEN AVG((100 - CAST(data.Total_HO_success As REAL) / 100))
			WHEN 5 THEN AVG(CAST(data.Total_HO_success As REAL) / 100)
			WHEN 6 THEN AVG(CAST(data.TCH_drop_call AS Real) / 100)
			WHEN 7 THEN AVG(CAST(data.TCH_call_block AS REAL) / 100)
			WHEN 8 THEN AVG(data.Total_FTCH_seizure_time)
			WHEN 9 THEN AVG(data.Total_HTCH_seizure_time)
			WHEN 10 THEN AVG(CAST(data.CSSR_voice As Real) / 100)
			WHEN 11 THEN AVG(data.TCH_traffic_sum)
			WHEN 12 THEN AVG(data.UL_gprs_RLC)
			WHEN 13 THEN AVG(data.DL_gprs_RLC)
			WHEN 14 THEN AVG(data.UL_egprs_RLC)
			WHEN 15 THEN AVG(data.DL_egprs_RLC)
			WHEN 16 THEN AVG(CAST(data.Drop_Call_Cell As Real) / 100)
			WHEN 17 THEN AVG(data.Drop_Call_Bss)
			WHEN 18 THEN AVG(data.Drop_Call_Plmn)
			END
		FROM Data2GEvD data, t2gCells info
		WHERE data.starttime = @starttime AND info.id = data.cell_Id
		GROUP BY data.starttime, info.CellId, info.Cell_Name) this_t
	LEFT JOIN
		(SELECT data.starttime, info.CellId, 
			prev = CASE @colNumber
			WHEN 1 THEN AVG(data.SDCCH_traffic_ave)
			WHEN 2 THEN AVG(data.SDCCH_congest_time)
			WHEN 3 THEN AVG(CAST(data.SDCCH_real_blocking AS Real) / 100)
			WHEN 4 THEN AVG((100 - CAST(data.Total_HO_success As REAL) / 100))
			WHEN 5 THEN AVG(CAST(data.Total_HO_success As REAL) / 100)
			WHEN 6 THEN AVG(CAST(data.TCH_drop_call AS Real) / 100)
			WHEN 7 THEN AVG(CAST(data.TCH_call_block AS REAL) / 100)
			WHEN 8 THEN AVG(data.Total_FTCH_seizure_time)
			WHEN 9 THEN AVG(data.Total_HTCH_seizure_time)
			WHEN 10 THEN AVG(CAST(data.CSSR_voice As Real) / 100)
			WHEN 11 THEN AVG(data.TCH_traffic_sum)
			WHEN 12 THEN AVG(data.UL_gprs_RLC)
			WHEN 13 THEN AVG(data.DL_gprs_RLC)
			WHEN 14 THEN AVG(data.UL_egprs_RLC)
			WHEN 15 THEN AVG(data.DL_egprs_RLC)
			WHEN 16 THEN AVG(CAST(data.Drop_Call_Cell As Real) / 100)
			WHEN 17 THEN AVG(data.Drop_Call_Bss)
			WHEN 18 THEN AVG(data.Drop_Call_Plmn)
			END
		FROM Data2GEvD data, t2gCells info
		WHERE data.starttime = DATEADD(day,-7,@starttime) AND info.id = data.cell_Id
		GROUP BY data.starttime, info.CellId) prev_t
	ON prev_t.CellId = this_t.CellId

выборка и вставка происходят моментально практически (максимум 2 секунды).
Как побороть эту проблему?
Спасибо.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 09:03, 30-01-2013

 

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Хм. То есть тот же самый запрос, только с объявлением переменных, выполняется мгновенно, а через вызов процедуры тормозит?
А если вызвать процедуру из Management Studio примерно так:
Код: Выделить весь код
SET @starttime = '2013-01-28'
SET @colNumber = 16
mipGet2gWeekDifference  @starttime,  @colNumber
Результат будет мгновенным или долгим? Если мгновенным, то процедура тут не при чем, проблема на клиенте. Если же долгим, то это будет мистикой. В этом случае запускаем монитор активности или сразу Profiler и начинаем мониторить запросы и смотреть время выполнения. Находим запрос нашей процедуры, пихаем ее код в новый запрос и просматриваем план выполнения. Как то так.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 15:27, 30-01-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Delirium:
а через вызов процедуры тормозит? »
Да именно, так.
Цитата Delirium:
Если же долгим, то это будет мистикой »
Для меня это уже мистика)

Цитата Delirium:
вызвать процедуру из Management Studio примерно так »
Это, к сожалению, проверить сегодня нет возможности уже.
Причина в этом "мистическая". В таблицу каждый день добавляются данные. Вчера туда было добавлено, с задержкой, около 150 тысяч записей. Сегодня, в поисках проблемы, полез в проектирование таблицы, пересохранил. И опа, процедура быстро выполняется. В дальнейшем, залил еще отчет (порядка 20к записей) в таблицу. И снова обработка очень долгая. После чего снова полез в проектирование таблицы, и все встало на свои места.
Пока что отчетов новых не появилось, проверить не могу. Но завтра обязательно.

Цитата Delirium:
монитор активности или сразу Profiler »
Их необходимо запускать со стороны сервера? К сожалению, никогда не пользовался данными средствами(

P.S. К серверу, отсутствует физический доступ.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 16:59, 30-01-2013 | #3


Старожил


Сообщения: 435
Благодарности: 63

Профиль | Отправить PM | Цитировать


1. Сравните план запросов в обоих случаях.
2. Если после пересохранения начинает работать быстро, то возможно проблема со статистикой индексов.
После массовой вставки данных их лучше перестраивать.

3. Если вы запрос всегда выполняете после процедуры, то он может быстро выполняться только потому, что данные уже в кеше.

-------
black-eric.livejournal.com


Отправлено: 17:27, 30-01-2013 | #4


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата BlackEric:
2. Если после пересохранения начинает работать быстро, то возможно проблема со статистикой индексов.
После массовой вставки данных их лучше перестраивать. »
А можно поподробнее, пожалуйста?

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 15:26, 31-01-2013 | #5


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Delirium:
Результат будет мгновенным или долгим? »
Если запускать через Management Studio выполнение длится также очень долго.

Цитата BlackEric:
их лучше перестраивать »
Цитата:
Постоянное перестроение индексов сильно нагружает подсистему ввода/вывода и процессора сервера SQL Server, переполняет журнал транзакций и может блокировать другие процессы.

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 13:53, 05-02-2013 | #6


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата LilLoco:
Их необходимо запускать со стороны сервера? »
Из оснастки MS SQL Management Studio.
Цитата BlackEric:
1. Сравните план запросов в обоих случаях. »
Вот это надо сделать обязательно и будет виден результат.

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 14:45, 06-02-2013 | #7


В Поисках Истины


Сообщения: 802
Благодарности: 135

Профиль | Отправить PM | Цитировать


Цитата Delirium:
Вот это надо сделать обязательно и будет виден результат. »
А вы не могли бы поподробнее. Я так "серьезно" еще не работал с Sql Server.
Что хотя бы нужно искать?

-------
foreach(short w in new short[] {73,3,79,83,90,79,78,69}){
Console.Write((char)w);
}


Отправлено: 15:37, 06-02-2013 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MSFT SQL Server - Очень долгое выполнение хранимой процедуры. Sql Server 2008

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MSFT SQL Server - [решено] не могу установить MS sql server 2008 на windows server 2008 r2... God-of-Chaos Программирование и базы данных 4 06-12-2013 17:58
MSFT SQL Server - [решено] Вопрос по созданию изменению/процедуры в SQL Server 2008 RC2 - не сохраняется проц-ра dark-------13 Программирование и базы данных 1 07-03-2012 12:52
2008 - windows server 2008 x64 sp2 + sql server 2008 + 1с 8.1 потребляет слишком много ОЗУ last-77 Windows Server 2008/2008 R2 8 02-01-2012 14:02
2008 R2 - Ошибка LCID:1033 при установке SQL 2008 Server (Win 2008 Server R2 x64) Тишина Windows Server 2008/2008 R2 1 25-10-2011 13:43
MSFT SQL Server - Какие символы нельзя использовать в имени хранимой процедуры? Cognolio Программирование и базы данных 3 09-07-2009 01:59




 
Переход