0

Я пытаюсь оптимизировать мой INNER JOIN заявления на следующих таблицах:Оптимизировать INNER JOIN заявления через индексы столбцов

[articlegroups] содержит ~ 700 строк
[продукты] содержит ~ 150,000 строк
[products_category_mapping] содержит 1 до 3 строк для каждого продукта в [продуктов] (так в любом месте между 150,000 и 450.000 строк)

Вот мой текущий запрос:

SELECT ga.label_sp,ga.label_en,ga.slug_sp,ga.slug_en,ga.pagetitle_sp,ga.pagetitle_en,ga.image_sp,ga.image_en,ga.description_sp,ga.description_en,ga.metadescription_sp,ga.metadescription_en 
FROM articlegroups ga WITH (NOLOCK) 
INNER JOIN products_category_mapping pcm on pcm.articlegroup_id=ga.id 
INNER JOIN products gp on gp.id=pcm.artikelid 
WHERE gp.id=<PRODUCTID> AND ga.catlevel=0 

Я читаю здесь http://www.sql-server-performance.com/2006/tuning-joins/, что я могу сделать, это добавить индексы в столбцы, по которым соединяются таблицы.

Теперь я задаюсь вопросом, что приведет к наилучшей производительности: Добавление индекса в products_category_mapping.artikelid и/или в products_category_mapping.articlegroup_id и какой индекс? Должен ли я добавлять индексы в оба столбца? Должен ли я сделать один из них сгруппированным, и если да, то какой? Теперь я добавил индексы в оба столбца и кластеризованный индекс в products_category_mapping.artikelid, так как я, хотя последний столбец мог иметь самые разные результаты и потребовал бы самой высокой скорости. Я не уверен, что я прав в том, что я сейчас делаю.

+1

С каких таблиц появляются ваши поля 'label' и' page'? Если вы можете добавить их как 'include' в свой индекс, вы можете вообще не столкнуться с таблицей. –

+0

@BrianStork см. Мое обновленное заявление. Я также добавил все поля в моем запросе (который я удалил для простоты). Ваше предложение по-прежнему работает с большим количеством полей, и если да, как бы включить их в свой индекс, чтобы избежать попадания в эту таблицу? – Flo

ответ

0

ARTICLEGROUPS имеет всего 700 строк. Это небольшой стол, и вы также можете попробовать его не индексировать. Используемые здесь столбцы: GA.ID, GA.CATLEVEL. Возможно, вы можете попробовать приведенный ниже индекс.

Create Index IX_id on ARTICLEGROUPS (id) Include (CATLEVEL asc); 

PRODUCTS имеет 150000 строк и столбцов используется GP.ID. Если LABEL и PAGE не из PRODUCTS, попробуйте

Create Clustered Index IX_id on PRODUCTS (id); 

еще создать

Create Index IX_id on PRODUCTS (id) Include (..); -- Pls fill include part. 

PRODUCTS_CATEGORY_MAPPING имеет 150000 < строки. Используемые столбцы PCM.ARTICLEGROUP_ID и PCM.ARTIKELID. попробуйте ниже и посмотрите.

Create Index IX_agid on PRODUCTS_CATEGORY_MAPPING (ARTICLEGROUP_ID) Include (..) --If LABEL or PAGE is from this table add thosem coumns in the include part) 

Create Index IX_aid on PRODUCTS_CATEGORY_MAPPING (ARTIKELID) Include (..) --If LABEL or PAGE is from this table add those columns in the include part) 

См. План выполнения запроса после добавления индекса. Я добавляю это в часть ответа, так как я нашел его очень неуклюжим, когда написал это в комментарии, надеюсь, это поможет вам.

+0

Привет, спасибо! См. Мой обновленный отчет. Я добавил все поля в свой запрос (который я удалил для простоты). Ваше предложение все еще работает с большим количеством полей в запросе? Не знаете, какие из ваших предложений я должен использовать ... – Flo

+0

Поля 'include' в индексе становятся частью индекса, но не индексируются. Подумайте об индексе, как о другой таблице, закажите способ, который вы укажете. Вот как легко найти нужную строку (потому что она правильно отсортирована). Столбцы 'include' являются частью индекса, но они не сортируются. Поэтому, когда вы быстро найдете нужную строку, в индексе доступны данные 'include', и вам не нужно возвращаться к таблице, чтобы получить ее.Если вы пишете индекс с индексированными столбцами, необходимыми для идентификации записей, тогда «включайте» данные, которые хотите видеть, вы должны быть хорошими. –

+0

@BrianStork Хорошо, спасибо. Но теперь, когда вы видите мою структуру таблицы, какие индексы по-прежнему актуальны? [PRODUCTS_CATEGORY_MAPPING] содержит строки 150K-450K. 'LABEL или PAGE' являются частью [articlegroups], а не [PRODUCT_CATEGORY_MAPPING], поэтому последние 2 индекса в ответе Джитина не будут корректными? Я все еще путаю, какие индексы создавать и какие поля использовать в заявлении include. Вы можете помочь? – Flo

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

  • Нет связанных вопросов^_^