Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
Всем, добрый день.

Излагаю ситуацию:

1) на
select @@version
имеем следующее:
Microsoft SQL Server 2005 - 9.00.3054.00 (Intel X86)   Mar 23 2007 16:28:52   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 
Сервак достаточно мощный - 16 ядер, Ксеоны, память 8 Гб, под SQL Server-ом = 7 Гб (фиксировано), AWE включено и реально сервак отъедает "свои" 7 гиг.

2) есть процедура, выглядит очень просто
create procedure [dbo].[usp_Deals_UI_History]
(
	@ID bigint,
	@locale nvarchar(20) = null,
	@Face_Accountant_ID bigint = null
)
as
-- =============================================
--	Вывод истории по ...
-- =============================================
begin
	set nocount on

	select 
		History_ID,
		History_Date_Upd,
		History_Date,
		History_Time,
		History_User_Name,
		History_Host_Name,
		History_Application_Name,
		ID,
		History
	from dbo.zudf_History_Deals_UI(@locale, @Face_Accountant_ID, @ID)	

	union all

	select 
		History_ID,
		History_Date_Upd,
		History_Date,
		History_Time,
		History_User_Name,
		History_Host_Name,
		History_Application_Name,
		Deal_ID,
		History
	from dbo.zudf_History_Deals_Contracts_By_Deal_UI(@locale, @Face_Accountant_ID, @ID)

	union all 

	+ тут следуют еще 10 аналогичных селектов с UNION ALL

end

3) табличная функция из 1-го селекта выглядит так:
ALTER FUNCTION [dbo].[zudf_History_Deals_UI]
(
	@locale nvarchar(20) = null,
	@Face_Accountant_ID bigint = null,
	@ID bigint
)
returns table
as
return (				
			select 
				H.ID as History_ID,
				H.Date_Upd as History_Date_Upd,
				H.Date as History_Date,
				H.Time as History_Time,
				H.User_Name as History_User_Name,
				H.Host_Name as History_Host_Name,
				H.Application_Name as History_Application_Name,
				isnull(I.ID, D.ID) as ID,
				case
					when H.Operation = 'I' then (case when @locale = 'en' then 'Inserted' else 'Запись добавлена' end)
					when H.Operation = 'D' then (case when @locale = 'en' then 'Deleted' else 'Запись удалена' end)
				end as History			
			from (select * from dbo.History_Deals where History_State = 'D' and ID = @ID) as D
				full outer join (select * from dbo.History_Deals where History_State = 'I' and ID = @ID) as I on I.History_ID = D.History_ID
				left outer join dbo.zudf_History_UI(@locale, @Face_Accountant_ID) as H on H.ID = isnull(I.History_ID, D.History_ID) and H.Table_Name = 'Deals'
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_FA_I on FK_Deals_Partners_FA_I.ID = I.Face_Accountant_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_FA_D on FK_Deals_Partners_FA_D.ID = D.Face_Accountant_ID				
				left outer join dbo.udf_Operations_Types_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Operations_Types_I on FK_Deals_Operations_Types_I.ID = I.Operation_Type_ID				
				left outer join dbo.udf_Operations_Types_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Operations_Types_D on FK_Deals_Operations_Types_D.ID = D.Operation_Type_ID				
				left outer join dbo.udf_Markets_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Markets_I on FK_Deals_Markets_I.ID = I.Market_ID				
				left outer join dbo.udf_Markets_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Markets_D on FK_Deals_Markets_D.ID = D.Market_ID				
				left outer join dbo.udf_Markets_Boards_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Markets_Boards_I on FK_Deals_Markets_Boards_I.ID = I.Market_Board_ID				
				left outer join dbo.udf_Markets_Boards_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Markets_Boards_D on FK_Deals_Markets_Boards_D.ID = D.Market_Board_ID				
				left outer join dbo.udf_Securities_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Securities_I on FK_Deals_Securities_I.ID = I.Security_ID
				left outer join dbo.udf_Securities_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Securities_D on FK_Deals_Securities_D.ID = D.Security_ID
				left outer join dbo.udf_Currencies_Rates_Bases_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_Rates_Bases_I on FK_Deals_Currencies_Rates_Bases_I.ID = I.Rate_Base_ID
				left outer join dbo.udf_Currencies_Rates_Bases_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_RateS_Bases_D on FK_Deals_Currencies_RateS_Bases_D.ID = D.Rate_Base_ID
				left outer join dbo.udf_Currencies_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_I on FK_Deals_Currencies_I.ID = I.Currency_ID
				left outer join dbo.udf_Currencies_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_D on FK_Deals_Currencies_D.ID = D.Currency_ID
				left outer join dbo.udf_Currencies_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_Payment_I on FK_Deals_Currencies_Payment_I.ID = I.Payment_Currency_ID
				left outer join dbo.udf_Currencies_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Currencies_Payment_D on FK_Deals_Currencies_Payment_D.ID = D.Payment_Currency_ID
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_Money_Client_I on FK_Deals_Partners_Money_Client_I.ID = I.Money_Client_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_Money_Client_D on FK_Deals_Partners_Money_Client_D.ID = D.Money_Client_ID				
				left outer join dbo.udf_Money_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Money_Accounts_Divisions_Inner_I on FK_Deals_Money_Accounts_Divisions_Inner_I.ID = I.Money_Inner_Account_Division_ID				
				left outer join dbo.udf_Money_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Money_Accounts_Divisions_Inner_D on FK_Deals_Money_Accounts_Divisions_Inner_D.ID = D.Money_Inner_Account_Division_ID				
				left outer join dbo.udf_Money_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Money_Accounts_Divisions_Outer_I on FK_Deals_Money_Accounts_Divisions_Outer_I.ID = I.Money_Outer_Account_Division_ID				
				left outer join dbo.udf_Money_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Money_Accounts_Divisions_Outer_D on FK_Deals_Money_Accounts_Divisions_Outer_D.ID = D.Money_Outer_Account_Division_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_Depo_Client_I on FK_Deals_Partners_Depo_Client_I.ID = I.Depo_Client_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_Depo_Client_D on FK_Deals_Partners_Depo_Client_D.ID = D.Depo_Client_ID				
				left outer join dbo.udf_Depo_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Depo_Accounts_Divisions_Inner_I on FK_Deals_Depo_Accounts_Divisions_Inner_I.ID = I.Depo_Inner_Account_Division_ID				
				left outer join dbo.udf_Depo_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Depo_Accounts_Divisions_Inner_D on FK_Deals_Depo_Accounts_Divisions_Inner_D.ID = D.Depo_Inner_Account_Division_ID				
				left outer join dbo.udf_Depo_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Depo_Accounts_Divisions_Outer_I on FK_Deals_Depo_Accounts_Divisions_Outer_I.ID = I.Depo_Outer_Account_Division_ID				
				left outer join dbo.udf_Depo_Accounts_Divisions_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Depo_Accounts_Divisions_Outer_D on FK_Deals_Depo_Accounts_Divisions_Outer_D.ID = D.Depo_Outer_Account_Division_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_I on FK_Deals_Partners_I.ID = I.Partner_ID				
				left outer join dbo.udf_Partners_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Partners_D on FK_Deals_Partners_D.ID = D.Partner_ID				
				left outer join dbo.udf_Portfolios_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Portfolios_I on FK_Deals_Portfolios_I.ID = I.Portfolio_ID				
				left outer join dbo.udf_Portfolios_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Portfolios_D on FK_Deals_Portfolios_D.ID = D.Portfolio_ID	
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Status_Type_I on FK_Deals_Enums_Values_Status_Type_I.ID = I.Status_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Status_Type_D on FK_Deals_Enums_Values_Status_Type_D.ID = D.Status_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Report_Status_Type_I on FK_Deals_Enums_Values_Report_Status_Type_I.ID = I.Report_Status_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Report_Status_Type_D on FK_Deals_Enums_Values_Report_Status_Type_D.ID = D.Report_Status_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Structural_Type_I on FK_Deals_Enums_Values_Structural_Type_I.ID = I.Structural_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Structural_Type_D on FK_Deals_Enums_Values_Structural_Type_D.ID = D.Structural_Type
				left outer join dbo.udf_Deals_Signatures_Groups_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Deals_Signatures_Groups_I on FK_Deals_Deals_Signatures_Groups_I.ID = I.Origin_Group_ID			
				left outer join dbo.udf_Deals_Signatures_Groups_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Deals_Signatures_Groups_D on FK_Deals_Deals_Signatures_Groups_D.ID = D.Origin_Group_ID							
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Service_Type_I on FK_Deals_Enums_Values_Service_Type_I.ID = I.Service_Type
				left outer join dbo.udf_Enums_Values_UI_Reference(@locale, @Face_Accountant_ID) as FK_Deals_Enums_Values_Service_Type_D on FK_Deals_Enums_Values_Service_Type_D.ID = D.Service_Type
		)
Это самая "большая" табличная функция, которая используется в процедуре [usp_Deals_UI_History], т.е. в ней больше всего JOIN-ов, во всех остальных поменьше.

А теперь главная проблема - вот именно в такой конструкции, процедура [usp_Deals_UI_History] даже не компилится, выпадает ошибка, указанная в сабжекте. Что делать?

P.S. На резервном сервере, который на порядок слабее (4 ядра, Ксеоны, но слабее чем у 1-го сервака, 4Гб памяти, под Сиквелом = 3 Гб) - все компилится и выполняется процедура без проблем.
28 май 08, 12:16    [5726050]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Временные таблицы вас спасут. Сервер понять можно : кому бы не снесло голову от юниона 100+ левых джоинов?
28 май 08, 12:19    [5726069]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
to Гавриленко Сергей Алексеевич

А какая проблема в джойнах?
Однако у слабого сервера голову не сносит от кол-ва джойнов. И потом, если есть ограничение по джойнам - пусть Майкрософт об этом напишет честно, чтобы знать...
28 май 08, 12:27    [5726129]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deniro

А какая проблема в джойнах?
Однако у слабого сервера голову не сносит от кол-ва джойнов. И потом, если есть ограничение по джойнам - пусть Майкрософт об этом напишет честно, чтобы знать...

Он и написал. В Maximum Capacity Specifications
28 май 08, 12:30    [5726154]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Deniro
to Гавриленко Сергей Алексеевич

А какая проблема в джойнах?
Однако у слабого сервера голову не сносит от кол-ва джойнов. И потом, если есть ограничение по джойнам - пусть Майкрософт об этом напишет честно, чтобы знать...
Вам шашечки или ехать? Вы конечно можете завести кейс (хотя сомнительно) в микрософте и может быть они даже признают это багом (что еще сомнительнее), потратить на ожидание всего этого дела энное количество дней и тогда они вам "честно напишут". Прокатит начальнику такой аргумент?
28 май 08, 12:35    [5726187]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
to Гавриленко Сергей Алексеевич

Да нам конечно ехать надо. Мы, в общем, уже и уехали - процедура давно уже переделана с темповыми таблицами. Просто не люблю "не понятных" ошибок, а это именно тот случай.
И еще раз повторюсь - на более слабом сервере все выполняется "со свистом", ну правда без нагрузки (этот сервер является копией боевого - причем практически на 100%, что касается SQL-ной части, кроме железа). Хотя и боевой сервер пока нагружен максимум на 10% пока...

to Glory

За ссылку спасибо - полезная, еще раз освежили в памяти ограничения Сиквела. Но это не ответ на вопрос, считаю, т.к. на резервном сервере - см. выше...
28 май 08, 12:45    [5726261]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deniro


to Glory

За ссылку спасибо - полезная, еще раз освежили в памяти ограничения Сиквела. Но это не ответ на вопрос, считаю, т.к. на резервном сервере - см. выше...

Вы предварительный план выполнения можете получить для этого запроса ?
28 май 08, 12:58    [5726382]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
Извините, за нескромный вопрос - но как здесь (в топике) приложить файлик? Который с планом исполнения. Так публиковать его тут - очень много строчек.
28 май 08, 13:21    [5726581]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deniro
Извините, за нескромный вопрос - но как здесь (в топике) приложить файлик? Который с планом исполнения. Так публиковать его тут - очень много строчек.

Не надо прикладывать. Полученный предварительный план должен показать, что ошибка возникает не на стадии компиляции и построения плана.
Но вы можете сравнить планы на двух своих серверах
28 май 08, 13:26    [5726612]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
Аааа, все нашел. Сейчас попробуем...
28 май 08, 13:26    [5726613]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
Ошибка возникает как раз на этапе компиляции. Конкретнее, в профайлере на шаге, когда сервер не находит в кэше процедуру и делает SP:Recompile. Т.е. тут на боевом сервере все обрывается и вылетает Exception.
28 май 08, 13:28    [5726640]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deniro
Ошибка возникает как раз на этапе компиляции. Конкретнее, в профайлере на шаге, когда сервер не находит в кэше процедуру и делает SP:Recompile. Т.е. тут на боевом сервере все обрывается и вылетает Exception.

И какова же причина этого SP:Recompile ?
28 май 08, 13:31    [5726668]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
В общем, даже предварительный план вылетает с такой же ошибкой. Сейчас попробовал.

Что значит "Причина ошибки SP:Recompile..." - когда процедуру изменили, когда она была удалена из процедурного кэша (вручную или сервером), тогда и возникает перекомпиляция и тут же обламывается...
28 май 08, 13:40    [5726745]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ммм, а максдоп не пробовали? Может план "слишком" параллельный получается?
28 май 08, 13:42    [5726755]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deniro

Что значит "Причина ошибки SP:Recompile..." - когда процедуру изменили, когда она была удалена из процедурного кэша (вручную или сервером), тогда и возникает перекомпиляция и тут же обламывается...

Причина возникновения события SP:Recompile вообще-то содержиться в аттрибутах этого события.
А при отсутствии плана в кэше вообще возникает
SP:CacheMiss - Stored procedure is not found in the procedure cache.
28 май 08, 13:53    [5726858]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Deniro
Member

Откуда: град Подмосковье
Сообщений: 84
Нет, максдоп еще пробовали. Попробуем, хотя шаманство это все :-))

Перед SP:Recompile конечно же возникает SP:CacheMiss, я это словами и описал.
28 май 08, 14:13    [5727053]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
cxandr
Member

Откуда:
Сообщений: 1
Аналогичная ситуация - на Win Server 2003 SP 2 R2, SQL Server 2055 SP3 после перезагрузки через пару дней возникает переполнение кэша. Как использовать функцию DBCC FREESYSTEMCACHE ?
24 авг 11, 15:32    [11172107]     Ответить | Цитировать Сообщить модератору
 Re: Error 701: There is insufficient system memory to run this query (SQL Server 2005)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
cxandr
Аналогичная ситуация - на Win Server 2003 SP 2 R2, SQL Server 2055 SP3 после перезагрузки через пару дней возникает переполнение кэша. Как использовать функцию DBCC FREESYSTEMCACHE ?
Что-что у вас возникает, простите?
24 авг 11, 15:36    [11172148]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить