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

Откуда:
Сообщений: 7
Привет всем!!! У меня есть один вопрос. Помогите плз. Есть фукция, написанная на 2005 скл...она работает отлично и выполняется за 2-3 секунды...после переноса бд на 2008 сервер запрос выполняется в течении 6 минут.
USE [TestDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE FUNCTION [dbo].[Test] (
			@UserId int,
			@UserLogin nvarchar(250),
			@LoginStatus bit,
			@DateTimeFrom datetime,
			@DateTimeTo datetime,
			@DomainName nvarchar(250),
			@UserIP bigint) 
RETURNS TABLE

AS

RETURN
(	

select main.* ,main.LogonTime - tab1.LogonTime as DiffTime1 ,  tab2.LogonTime- main.LogonTime as DiffTime2
from (
	(select *  from  TableSelect(@UserId,@UserLogin,@LoginStatus,@DateTimeFrom,@DateTimeTo,@DomainName,@UserIP))  main		
left join
	(select *  from  TableSelect(@UserId,@UserLogin,@LoginStatus,@DateTimeFrom,@DateTimeTo,@DomainName,@UserIP))  tab1
	on main.NumberRec = tab1.NumberRec - 1
left join
	(select * from  TableSelect(@UserId,@UserLogin,@LoginStatus,@DateTimeFrom,@DateTimeTo,@DomainName,@UserIP))  tab2
	on main.NumberRec = tab2.NumberRec + 1
)
);

GO


и вторая фукция

USE [TestDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE FUNCTION [dbo].[TableSelect] (
			@UserId int,
			@UserLogin nvarchar(250),
			@LoginStatus bit,
			@DateTimeFrom datetime,
			@DateTimeTo datetime,
			@DomainName nvarchar(250),
			@UserIP bigint) 
RETURNS TABLE
AS
RETURN
(	
	(select  row_number()  over (order by LogonTime desc) as NumberRec , *
		from  UserLoginLog
		where 
			(@UserId IS Null or UserId=@UserId) 
			and (@UserLogin is null or UserLoginLog.Login=@UserLogin) 
			and LoginStatus <> 4 and LoginStatus <> 0 
			and (@LoginStatus IS Null or (@LoginStatus = 1 and LoginStatus = 2) or (@LoginStatus = 0 and LoginStatus in (1,3))) 
			and (@DateTimeFrom is null or LogonTime>=@DateTimeFrom)
			and (@DateTimeTo is null or LogonTime<=@DateTimeTo)
			and (@DomainName is null or DomainName LIKE @DomainName)
			and (@UserIP is null or UserIP=@UserIP)) 

);

GO

Посоветуйте в чем мжт быть проблема. Заранее спасибо.
9 ноя 11, 10:16    [11567561]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Планы то хоть сравнивали? После переноса бд статистику обновляли?
9 ноя 11, 10:18    [11567571]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
tpg,

планы сравнивали...что интересное что на 2008 скле...один левт жоин выполняется вложенным циклом, на 2005 все нормально.
а если убираем на 2008 в фукции + 1 или -1...то фукция начинает выполнятся за 2-3 секунды

после переноса бд поправила индексы...пробовала переписать запросы с помощью корреляционных запросов...обьединить сначала 2 первые таблицы...потом третью....бестолку...результат тот же((
9 ноя 11, 11:21    [11567984]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
9 ноя 11, 14:11    [11569608]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
kuku60na,

К сообщению приложен файл. Размер - 57Kb
9 ноя 11, 14:13    [11569629]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
и для 2008

К сообщению приложен файл. Размер - 66Kb
9 ноя 11, 14:14    [11569644]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
aleks2
Guest
left join
	(select *  from  TableSelect(@UserId,@UserLogin,@LoginStatus,@DateTimeFrom,@DateTimeTo,@DomainName,@UserIP))  tab1
	on main.NumberRec+1 = tab1.NumberRec 
left join
	(select * from  TableSelect(@UserId,@UserLogin,@LoginStatus,@DateTimeFrom,@DateTimeTo,@DomainName,@UserIP))  tab2
	on main.NumberRec-1 = tab2.NumberRec
)

ЗЫ. Ужос рожденный в больном воображении.
9 ноя 11, 17:25    [11571335]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
aleks2,

к сожалению ваш ужас работает аналогично моему(((
10 ноя 11, 12:56    [11574132]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
aleks2
Guest
kuku60na
aleks2,

к сожалению ваш ужас работает аналогично моему(((


А вам надо быстрый ужос?
Тады пользуйте времянку под результат TableSelect.
10 ноя 11, 16:14    [11576339]     Ответить | Цитировать Сообщить модератору
 Re: не работает фукция для 2008sql  [new]
kuku60na
Member

Откуда:
Сообщений: 7
aleks2,

насколько я помню временные таблицы недоступны из функций...а мне нужно реализовать именно в фукции.
или я чего то не знаю?
11 ноя 11, 10:18    [11579607]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить