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

Откуда:
Сообщений: 255
Добрый день, форумчане!
Подскажите пожалуйста, как можно оптимизировать запрос?
Суть вопроса:
Есть 1 таблица с полями счет,наименование счета, дата открытия - в этой таблице 12000 счетов (47423 и 60323)
Есть 2 таблица остатков с полям: счет, дата, остаток - в этой таблице около 2 000 000 записей (все балансовые счета)
Необходимо по каждому счету из таблице 1, найти минимальную дату из таблицы 2 (если по-русски, то первое движение средств по данному счету (будь-то нулевое))
Делаю таким образом
Есть функция
USE [datebase1]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GET_DAT_VOZNIK] (@acc varchar(20))
RETURNS date
AS
BEGIN
	declare @d date;
	set @d='1900-01-01';
	
	select @d=DDATE from datebase2.dbo.table2 t ,
	(SELECT ACC_CODE,MIN( DDATE ) AS dat FROM datebase2.dbo.table2 where SUBSTRING(ACC_CODE,1,5) in ('47423','60323') GROUP BY ACC_CODE) t2
	where t.ACC_CODE=t2.ACC_CODE and t.DDATE=t2.dat and t.ACC_CODE=@acc	
	
	return (@d)
END


Соответственно вывожу счета
 select acc,dbo.GET_DAT_VOZNIK(acc) from t1 


Понимаю,что решено влоб, но другого решения пока не приходит в голову.
выполняется, уж очень долго порядка 1 часа и больше
7 июл 14, 11:07    [16268329]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
SELECT T1.acc, MIN(T2.DDATE) AS [Date]
FROM [1 таблица] T1 LEFT JOIN [2 таблица] T2 ON T1.acc=T2.acc
GROUP BY T1.acc;
???
7 июл 14, 11:17    [16268396]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
denis_stell
Member

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

ну да кстати, или же так


   select a.acc,min(a.ddate) from t2 a where acc in (select b.acc from t1 b) group by a.acc
7 июл 14, 11:21    [16268424]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
denis_stell
Member

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

спасибо
7 июл 14, 11:30    [16268486]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
aleks2
Guest
iap
SELECT T1.acc, MIN(T2.DDATE) AS [Date]
FROM [1 таблица] T1 LEFT JOIN [2 таблица] T2 ON T1.acc=T2.acc
GROUP BY T1.acc;
???

Профнепригоден.

select T1.acc, X.[Date]
  from
   [1 таблица] T1 LEFT JOIN 
   ( SELECT acc, MIN(DDATE) AS [Date]
        FROM [2 таблица] T2 
        GROUP BY acc
    ) as X
    ON T1.acc=T2.acc;
7 июл 14, 12:23    [16268922]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
aleks2
Профнепригоден
Ну конечно же!
7 июл 14, 12:31    [16268967]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Типа страшные варнинги вылезут, что ли?
7 июл 14, 12:50    [16269057]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов
Типа страшные варнинги вылезут, что ли?
aleks2 полагает, что группировка бОльшего количества строк убивает производительность.
Поэтому сначала сгруппировать и посчитать агрегаты,
а потом прицепить к результату не вошедшие туда строки LEFT JOINом.
7 июл 14, 12:55    [16269083]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
denis_stell,

Пару дополнений к запросу тов. iap:
1) сделайте индекс на table2 (acc_code, ddate)
2) не используйте в запросе substring, замените на like '47423%' (вряд ли вам все 12000 счетов нужны)
3) не используйте функции
7 июл 14, 14:55    [16269885]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить