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

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

Есть следующий запрос
CREATE TABLE DataOrder(
						Id				int	primary key				,
					        Summ			decimal (10, 3) NOT NULL	,
						StartDate		datetime		NOT NULL	,
						EndDate			datetime		NOT NULL	,						
						Aditionl		int							,
						Created		int				NULL		)
---- 100 млн строк
Индекс следующий
INDEX DataOrder(Aditionl,StartDate,EndDate)

DECLARE
	@StarDate	DATETIME = DATEADD(MONTH,-3,GETDATE())
SELECT TOP 25000*
	FROM DataOrder f WHERE NOT EXISTS(SELECT 1 FROM Position bp WITH(INDEX(IX_Position_DataOrderId),FORCESEEK)  WHERE f.Id = bp.DataOrderId) 
	AND StartDate < @StarDate and EndDate < @StarDate


Если я из запроса убираю последнее условие and EndDate < @StarDate, то скрипт отрабатывает меньше чем за 1 сек, если же оставляю то 12 минут ждал, но так и не дождался, к сожалению убрать данное условие не могу, будет глупо звучать, индекс переделать нельзя.

План запроса
  |--Top(TOP EXPRESSION:((25000)))
       |--Parallelism(Gather Streams)
            |--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([f].[Id], [Expr1005]) WITH UNORDERED PREFETCH)
                 |--Clustered Index Scan(OBJECT:([DATA].[dbo].[DataOrder].[PK_DataOrder] AS [f]), WHERE:([DATA].[dbo].[DataOrder].[StartDate] as [f].[StartDate]<[@StarDate] AND [DATA].[dbo].[DataOrder].[EndDate] as [f].[EndDate]<[@StarDate]))
                 |--Top(TOP EXPRESSION:((1)))
                      |--Index Seek(OBJECT:([DATA].[dbo].[Position].[IX_Position_DataOrderId] AS [bp]), SEEK:([bp].[DataOrderId]=[DATA].[dbo].[DataOrder].[Id] as [f].[Id]) ORDERED FORWARD)


Можно ли как-то переписать запрос ил что можно сделать, чтобы его оптимизировать
Так же пробовал этот же запрос, но без хинтов

Обе таблицы имеют порядка 100 млн строк.
6 дек 13, 15:27    [15253817]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
user87
Если я из запроса убираю последнее условие and EndDate < @StarDate, то скрипт отрабатывает меньше чем за 1 сек

И какой при этом план выполнения получается ?
6 дек 13, 15:50    [15254064]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
user87
Member

Откуда:
Сообщений: 257
 |--Top(TOP EXPRESSION:((25000)))
       |--Parallelism(Gather Streams)
            |--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([f].[Id], [Expr1005]) WITH UNORDERED PREFETCH)
                 |--Clustered Index Scan(OBJECT:([DATA].[dbo].[DataOrder].[PK_DataOrder] AS [f]), WHERE:([DATA].[dbo].[DataOrder].[StartDate] as [f].[StartDate]<[@StarDate]
                 |--Top(TOP EXPRESSION:((1)))
                      |--Index Seek(OBJECT:([DATA].[dbo].[Position].[IX_Position_DataOrderId] AS [bp]), SEEK:([bp].[DataOrderId]=[DATA].[dbo].[DataOrder].[Id] as [f].[Id]) ORDERED FORWARD)
6 дек 13, 16:01    [15254156]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
 |--Top(TOP EXPRESSION:((25000)))
       |--Parallelism(Gather Streams)
            |--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([f].[Id], [Expr1005]) WITH UNORDERED PREFETCH)
                 |--Clustered Index Scan(OBJECT:([DATA].[dbo].[DataOrder].[PK_DataOrder] AS [f]), WHERE:([DATA].[dbo].[DataOrder].[StartDate] as [f].[StartDate]<[@StarDate]
                 |--Top(TOP EXPRESSION:((1)))
                      |--Index Seek(OBJECT:([DATA].[dbo].[Position].[IX_Position_DataOrderId] AS [bp]), SEEK:([bp].[DataOrderId]=[DATA].[dbo].[DataOrder].[Id] as [f].[Id]) ORDERED FORWARD)

  |--Top(TOP EXPRESSION:((25000)))
       |--Parallelism(Gather Streams)
            |--Nested Loops(Left Anti Semi Join, OUTER REFERENCES:([f].[Id], [Expr1005]) WITH UNORDERED PREFETCH)
                 |--Clustered Index Scan(OBJECT:([DATA].[dbo].[DataOrder].[PK_DataOrder] AS [f]), WHERE:([DATA].[dbo].[DataOrder].[StartDate] as [f].[StartDate]<[@StarDate] AND [DATA].[dbo].[DataOrder].[EndDate] as [f].[EndDate]<[@StarDate]))
                 |--Top(TOP EXPRESSION:((1)))
                      |--Index Seek(OBJECT:([DATA].[dbo].[Position].[IX_Position_DataOrderId] AS [bp]), SEEK:([bp].[DataOrderId]=[DATA].[dbo].[DataOrder].[Id] as [f].[Id]) ORDERED FORWARD)

Планы то одинаковые
6 дек 13, 16:08    [15254231]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
user87
Member

Откуда:
Сообщений: 257
Обнаружил следующую вещь

У меня две среды, как и у всех, думаю.

Тестовая, где слабенький компьютер и боевой, где очень мощный комп)
Так вот попробовал запустить скрипт на боевом, там же только селект, так он отработал на ура, буду разбираться с тестовой средой.

Спасибо большое.
6 дек 13, 16:10    [15254243]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Обеспечить Nested Loops на соединении 100-миллионных таблиц - это какой-то приём оптимизации?
6 дек 13, 16:35    [15254467]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
user87
Member

Откуда:
Сообщений: 257
Это был предворительный план запроса, после того как проабдейтил статистику на тестовой среде запрос заработал, и соединение идет MERGE
6 дек 13, 16:54    [15254631]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как переписать запрос  [new]
GordonF
Member

Откуда:
Сообщений: 39
Зайцев Фёдор,

Смотря, что они хотят получить в конечном результате, и в каком объёме. При всей противности данного соединения, приходится самому его использовать при правке исторических запросов, добавляя в подсказки.
7 дек 13, 22:07    [15258955]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить