Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
MS SQL 2008 R2 Standart

Есть запрос
select ue.[PackageBarcode]
			,ue.[IdWeightedPoint]
			,wp.[WorkUnitBarcode] 
    from    (
			select [PackageBarcode], [IdWeightedPoint], [MaxDateTime] 
			from [Traceability].[dbo].[UpsetEvents] 
			where IdRequest = @CurIdRequest
			
		) ue
		 left join 
            (select [IdWeightedPoint], [WorkUnitBarcode] from [Traceability].[dbo].[WeightedPoints]) wp
    on ue.IdWeightedPoint = wp.IdWeightedPoint  
	order by [MaxDateTime] asc


Проблема:
Оператор order by выполняется очень долго

Вопрос: Что надо сделать, чтобы order by выполнялся быстрее.

Индексы:
CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents] 
(
	[IdRequest] ASC,
	[MaxDateTime] ASC,
	[IdWeightedPoint] ASC
)
INCLUDE ( [PackageBarcode]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Основная таблица
CREATE TABLE [dbo].[UpsetEvents](
	[IdEvent] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	[IdOperation] [uniqueidentifier] NOT NULL,
	[PackageBarcode] [char](10) NOT NULL,
	[MinDateTime] [datetime] NOT NULL,
	[MaxDateTime] [datetime] NOT NULL,
	[RegisterDateTime] [datetime] NOT NULL,
	[IdWeightedPoint] [int] NOT NULL,
	[UserBarcode] [char](10) NULL,
	[PulledDateTime] [datetime] NULL,
	[IdRequest] [uniqueidentifier] NULL,
 CONSTRAINT [PK_UpsetEvents] PRIMARY KEY CLUSTERED 
(
	[IdEvent] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[UpsetEvents] ADD  CONSTRAINT [DF_UpsetEvents_IdEvent]  DEFAULT (newid()) FOR [IdEvent]
GO

Дополнительная таблица
CREATE TABLE [dbo].[WeightedPoints](
	[IdWeightedPoint] [int] NOT NULL,
	[Type] [varchar](15) NOT NULL,
	[Ip] [varchar](15) NOT NULL,
	[Port1] [int] NOT NULL,
	[Port2] [int] NOT NULL,
	[IsEnabled] [bit] NOT NULL,
	[Description] [nchar](10) NULL,
	[WorkUnitBarcode] [nchar](10) NOT NULL,
	[Port3] [int] NULL,
 CONSTRAINT [PK_WeightedPoints] PRIMARY KEY CLUSTERED 
(
	[IdWeightedPoint] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
21 июл 11, 22:56    [11009715]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
elativus
Проблема:
Оператор order by выполняется очень долго
То есть если не делать order by, то запрос выполняется быстрее?
21 июл 11, 23:24    [11009814]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
alexeyvg
elativus
Проблема:
Оператор order by выполняется очень долго
То есть если не делать order by, то запрос выполняется быстрее?
гы... А это по любому. Даже если и без order by порядок тот же... Всё равно медленнее. Сортитовать-то надо...

Но ЕСЛИ конечная сортировка кушает заметную долю от времени выполнения, то можно радоваться.
21 июл 11, 23:31    [11009827]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

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

Да, быстрее
21 июл 11, 23:39    [11009846]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

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

Сортировка, судя по плану, кушает от 50 до 80 процентов -- в зависимости от количества записей в таблице
21 июл 11, 23:41    [11009853]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Makar4ik
гы... А это по любому. Даже если и без order by порядок тот же... Всё равно медленнее. Сортитовать-то надо...
Неправильно, не всегда сортировка требует времени, это можно видеть в плане запроса.

Но в данном случае в вопросе ТС я имел в виду какую-то заметную разницу. То есть нужна конкретика - на сколько процентов замедляется выполнение запроса с order by и без (на мой взгляд большой разницы в этом запросе быть не должно).

А ещё лучьше приложить планы.
21 июл 11, 23:41    [11009854]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
Я читал, что надо включать в индексы столбцы сортировки. Как я не игрался с этим, добавлял в кластеризованный индекс, некластеризованный -- ничего положительного не вышло
21 июл 11, 23:49    [11009866]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
elativus
Сортировка, судя по плану, кушает от 50 до 80 процентов -- в зависимости от количества записей в таблице
Да, интересно...

А у меня не кушает.

Вы бы выполнили 2 запроса (с сортировкой и без) и посмотрели трейс с данными о выполнении и о реальных планах
21 июл 11, 23:51    [11009873]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
elativus
Я читал, что надо включать в индексы столбцы сортировки. Как я не игрался с этим, добавлял в кластеризованный индекс, некластеризованный -- ничего положительного не вышло
Может, просто запутались с планами и версиями индексов?

У вас планы не отличаются.

Ну и скажите, таблицы в одной базе?
21 июл 11, 23:55    [11009883]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 726
elativus,

			select ue.[PackageBarcode] 
         		,ue.[IdWeightedPoint]
		     	,wp.[WorkUnitBarcode] 
			from [Traceability].[dbo].[UpsetEvents] ue
            JOIN [Traceability].[dbo].[WeightedPoints]) wp
              ON ue.IdWeightedPoint = wp.IdWeightedPoint  
			where IdRequest = @CurIdRequest
	order by [MaxDateTime] asc 
21 июл 11, 23:59    [11009899]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 726
elativus,
еще:
индекса достаточно будет такого:
CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents] 
(
	[IdRequest] ASC,
	[MaxDateTime] ASC.....


та табличке: WeightedPoints
нужен индех: IdWeightedPoint
22 июл 11, 00:07    [11009921]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 726
kapelan
elativus,
еще:
индекса достаточно будет такого:
CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents] 
(
	[IdRequest] ASC,
	[MaxDateTime] ASC.....


та табличке: WeightedPoints
нужен индех: IdWeightedPoint



CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents]
(
[IdRequest] ASC,
[IdWeightedPoint]
ASC.....
22 июл 11, 00:09    [11009930]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
kapelan
elativus,

			select ue.[PackageBarcode] 
         		,ue.[IdWeightedPoint]
		     	,wp.[WorkUnitBarcode] 
			from [Traceability].[dbo].[UpsetEvents] ue
            JOIN [Traceability].[dbo].[WeightedPoints]) wp
              ON ue.IdWeightedPoint = wp.IdWeightedPoint  
			where IdRequest = @CurIdRequest
	order by [MaxDateTime] asc 


Насколько я понимаю это будет INNER JION, а мне нужен LEFT
22 июл 11, 00:11    [11009934]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
kapelan
kapelan
elativus,
еще:
индекса достаточно будет такого:
CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents] 
(
	[IdRequest] ASC,
	[MaxDateTime] ASC.....


та табличке: WeightedPoints
нужен индех: IdWeightedPoint



CREATE NONCLUSTERED INDEX [IX_UpsetEvents] ON [dbo].[UpsetEvents]
(
[IdRequest] ASC,
[IdWeightedPoint]
ASC.....


этот же индекс используется в другом запросе, где еще фильтруется по MaxDateTime
22 июл 11, 00:15    [11009942]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
elativus,

Вы проверьте всё внимательно.
У меня на ваших таблицах сортировка делается вообще бесплатно. Везде Index Seek ... ORDERED FORWARD
22 июл 11, 00:18    [11009949]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 726
elativus
...
Насколько я понимаю это будет INNER JION, а мне нужен LEFT

более всего Вам подойдет документацию почитать.
Я так понимаю приведенный запрос работает правильно но медленно.
Результат моего запроса бутет таким-же.
Попробуйте таки рекомендации
22 июл 11, 00:19    [11009953]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
kapelan
elativus
...
Насколько я понимаю это будет INNER JION, а мне нужен LEFT

более всего Вам подойдет документацию почитать.
Я так понимаю приведенный запрос работает правильно но медленно.
Результат моего запроса бутет таким-же.
Попробуйте таки рекомендации


Одинаковым он не будет
22 июл 11, 00:23    [11009962]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
alexeyvg
elativus,

Вы проверьте всё внимательно.
У меня на ваших таблицах сортировка делается вообще бесплатно. Везде Index Seek ... ORDERED FORWARD


А на каком кол-ве строк вы делаете? На малом -- да, все круто. А вот на 4к строк и более -- все хуже.

Прикладываю планы.

К сообщению приложен файл (Планы.rar - 6Kb) cкачать
22 июл 11, 00:26    [11009966]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
elativus
kapelan
пропущено...

более всего Вам подойдет документацию почитать.
Я так понимаю приведенный запрос работает правильно но медленно.
Результат моего запроса бутет таким-же.
Попробуйте таки рекомендации


Одинаковым он не будет


Будет, прислушайтесь к kapelan-у
22 июл 11, 00:39    [11009991]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
elativus
А на каком кол-ве строк вы делаете? На малом -- да, все круто. А вот на 4к строк и более -- все хуже.
Ну вот собственно вопрос, почему там вообще Hash Match...

kapelan
Результат моего запроса бутет таким-же.
В смысле, если в [Traceability].[dbo].[WeightedPoints] не будет записей, результат всё равно вернётся???
22 июл 11, 00:46    [11010002]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
ura
elativus
пропущено...


Одинаковым он не будет


Будет, прислушайтесь к kapelan-у
Ну вот, уже двое :-(

А почему будет???
22 июл 11, 00:48    [11010005]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
elativus
Member

Откуда:
Сообщений: 18
ura
elativus
пропущено...


Одинаковым он не будет


Будет, прислушайтесь к kapelan-у


Джентльмены, читаем курс MSTS 70-433. INNER JOIN -- это тип соединения, применяемый по умолчанию, когда в запросе задано только ключевое слово JION.
INNER JION веренет то же, что и LEFT JION, если бы был навешан констраинт ссылочной целостности. Но его тут нет.
22 июл 11, 00:50    [11010011]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 726
alexeyvg
ura
пропущено...


Будет, прислушайтесь к kapelan-у
Ну вот, уже двое :-(

А почему будет???

LEFT JOIN=INNER JOIN=JOIN=RIGHT JOIN
22 июл 11, 00:59    [11010033]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
точно, ступил - из-за дурацкого оформления кода прочитал on как where

тем не менее, запрос лучше переписать в удобочитаемом виде:
select ue.[PackageBarcode] 
     		,ue.[IdWeightedPoint]
	     	,wp.[WorkUnitBarcode] 
	from [Traceability].[dbo].[UpsetEvents] ue
		LEFT JOIN [Traceability].[dbo].[WeightedPoints]) wp	ON ue.IdWeightedPoint = wp.IdWeightedPoint
	where IdRequest = @CurIdRequest
	order by [MaxDateTime] asc 
22 июл 11, 01:03    [11010042]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация order by результата join'a  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
elativus
Makar4ik,

Сортировка, судя по плану, кушает от 50 до 80 процентов -- в зависимости от количества записей в таблице
ЕСЛИ сортировка кушает столько, то поздравляю, запрос оптимальный.
А сама сортировка - это уже ваши причуды оформления вывода, выраженная в запросе к серверу.
И это - копейки.
Если эти копейки кушают 50-80%, то реально, вас можно только поздравить.
22 июл 11, 04:29    [11010270]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить