2016-12-19 3 views
0

Это мои таблицы:Как улучшить производительность на большом левом внешнем соединении?

Source_Artikelen - столбцы: статья - описание (1.438.171 записей)

Source_LevArt - столбцы: статья - производитель номер детали (1.751.801 записей)

... и это запрос я выступаю

SELECT a.Artikel,a.Omschrijving, l.Artikel_Leverancier 
    FROM Source_Artikelen AS a 
     LEFT OUTER JOIN Source_LevArt AS l 
    ON a.Artikel Like l.Artikel 

Этот запрос был запущен сегодня Ф.О. r более чем за 20 часов до того, как я отменил его вручную.

Итак, что я пытаюсь сделать?

Я хочу перечислить все статьи из моей таблицы Source_Artikelen. Тогда я хотел бы посмотреть, есть ли номера деталей производителя, доступные в Source_LevArt.

  • не каждая статья из Source_Artikelen присутствует в Source_LevArt
  • иногда есть несколько номеров производитель деталей в Source_LevArt одной статьи

Вот почему мне нужно использовать ЛЕВЫЙ ВНУТРЕННИЙ ВСТУПИТЕЛЬ.

Я пробовал некоторые вещи с индексами, но это не очень помогает. Возможно, я что-то делаю неправильно.

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


UPDATE 19/12/2016 16:24: Привет piet.t

SELECT TOP(20) a.Artikel,a.Omschrijving, l.Artikel_Leverancier 
    FROM Source_Artikelen AS a 
     LEFT JOIN Source_LevArt AS l 
    ON a.Artikel LIKE l.Artikel 

это занимает 9 секунд

SELECT TOP(20) a.Artikel,a.Omschrijving, l.Artikel_Leverancier 
    FROM Source_Artikelen AS a 
     LEFT JOIN Source_LevArt AS l 
    ON a.Artikel = l.Artikel 

требуется 1 секунда!

Я действительно не знал, что есть разница, поскольку я не использую подстановочные знаки.

+0

Source_Artikelen .Artikel первичный ключ и Source_LevArt.Artikel внешний ключ? вы также можете указать как «И» после «ВКЛ» (нет предложения where) «И« Номера деталей изготовителя »не являются нулевыми. заменяя то, что цитируется полем, содержащим номера деталей. (предполагая, что некоторые могут быть пустыми для записей в source_levArt.Тогда должно произойти, что фильтр применяется ко второй таблице до того, как произойдет соединение, уменьшив количество записей, к которым должен присоединиться запрос. – xQbert

+7

Первое, что я хотел бы сделать, это избавиться от 'like' в условии соединения, поскольку вам кажется, что вам нужны только точные соответствия, поэтому попробуйте' ON a.Artikel = l.Artikel' и посмотрите, ускоряет ли это , –

+0

@ vlatro «Я действительно не знал, что есть разница, поскольку я не использую подстановочные знаки». Вы знаете это, но SQL-процессор не работает, так как может быть '' '' '' '' '' 'скрыта в содержимом' l.Artikel' –

ответ

0

Использование = вместо этого.

Эти 2 указателя должны дать вам наилучшую производительность для Select.

CREATE INDEX idx ON Source_Artikelen(Artikel) INCLUDE(Omschrijving); 

CREATE INDEX idx ON Source_LevArt(Artikel) INCLUDE(Artikel_Leverancier); 

Если вы реализуете их и снова пытаетесь выполнить SELECT, можете ли вы загрузить копию своего плана выполнения?

0

Это покрыт Пол Уайт здесь: Dynamic Seeks and Hidden Implicit Conversions

с использованием как даже при наличии точного соответствия, как правило, делает динамический seek..which означает, зная, столбец будет добившимся во время выполнения, а не во время компиляции. .

ниже как., столбец выводится для таблиц, приведенных в примере ниже шахты ..

[Expr1005] = Скалярное Оператор (CONVERT_IMPLICIT (VARCHAR (12), [Aegon_X]. [Sales] [Заказы]. [Custid] as [o]. [Custid], 0)),
[Expr1006] = Скалярное Оператор (LikeRangeStart (CONVERT_IMPLICIT (VARCHAR (12), [Aegon_X]. [Продажи]. [Заказы]. [CustID] как [O]. [CustID], 0))),
[Expr1007] = Скалярный оператор (LikeRangeEnd (CONVERT_IMPLICIT (varchar (12), [Aegon_X]. [Sales]. [Заказы]. [Custid] as [o]. [Custid], 0))),
[ Expr1008] = Скалярное Оператор (LikeRangeInfo (CONVERT_IMPLICIT (VARCHAR (12), [Aegon_X]. [Продажи]. [Заказы]. [CustID], как [о]. [CustID], 0)))

ниже, что описывает Пол, как они получены

Верхняя всплывающая подсказка показывает, что Compute Scalar использует три внутренние функции: LikeRangeStart, LikeRangeEnd и LikeRangeInfo.

Первые две функции описывают диапазон как открытый интервал. Третья функция возвращает набор флагов, закодированных в целое число, которые используются внутренне для определения определенных свойств поиска для механизма хранения. Нижняя подсказка показывает поиск в открытом интервале, описываемом результатом LikeRangeStart и LikeRangeEnd, и применение остаточного предиката «LIKE @Like».

Таким образом, в целом, используя как SQL использует динамический стремятся получить искать свойства во время компиляции ..

Примеры ниже показаны различные планы

используя как:
Я действительно не знаю, что есть разница, поскольку я не использую подстановочные знаки.

select top 10* from sales.orders o 
join 
sales.customers c 
on c.custid like o.custid 

план:
enter image description here

Теперь при использовании точного соответствия ..

select top 10* from sales.orders o 
    join 
    sales.customers c 
    on c.custid =o.custid 

enter image description here

Вы можете увидеть слияние присоединиться план

+0

Спасибо, ясно сейчас! – vlatro

Смежные вопросы