Настройка производительности SQL Server 2008 (T-SQL) с несколькими таблицами LEFT JOIN и представлением - PullRequest
3 голосов
/ 01 февраля 2011

У меня есть 20+ вспомогательных таблиц, настроенных следующим образом

[common_column1, common_column2, unique_column]

Мне нужно создать комбинированную таблицу или представление, которое будет настроено так

[common_column1, common_column2, 
 table1_unique_column, table2_unique_column, table3_unique_column, etc...]

У меня есть 6 миллионов записей в каждой вспомогательной таблице. Мой комбинированный запрос на создание таблицы / представления выглядит следующим образом:

select 
   a.common_column1, a.common_column2, a.unique_column, b.unique_column, 
   c.unique_column, d....  
into combined_table  
from table1 as a   
left join table2 as b on (a.common_column1 = b.common_column1 and a.common_column2 = b.common_column2)  
left join table3 as c on (a.common_column1 = c.common_column1 and a.common_column2 = c.common_column2)  
left join table4 as d ...`   

Моя основная задача - обеспечить лучшую производительность чтения в комбинированной таблице / представлении, которую я буду запрашивать несколько раз по всем полям. Не могли бы вы предложить, что было бы лучше: создать комбинированную таблицу и поместить индексы в каждый ее столбец или поместить индексы в каждый общий столбец каждой вспомогательной таблицы, а затем создать комбинированное представление? Или есть какой-то другой способ достичь моей цели?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Если бы у вас не было LEFT JOIN, вы могли бы исследовать индексированных представлений - но поскольку вы оставили эти объединения, об этом и речи не идет.

Использование LEFT JOIN является грязным и дорогостоящим - и на самом деле не так много "волшебства", чтобы ускорить это.

Просто убедитесь, что у вас есть индекс для каждого столбца (-ов) внешнего ключа в дочерних таблицах, которые вы используете в своих объединениях, и в столбцах в предложении WHERE(с) - это все, что вы можете сделать, я боюсь ...

Но учтите: слишком много индексов могут быть хуже, чем никаких индексов вообще ... выбирайте их осторожно!

0 голосов
/ 01 февраля 2011

Создайте индекс покрытия в каждой из вспомогательных таблиц:

CREATE INDEX ix_b_1_2_unique ON b (common_column1, common_column2) INCLUDE (unique_column)

Обратите внимание, что для выполнения этого запроса общие столбцы также должны быть почти уникальными.

Если у вас естьно 2 дублируется на (common_column1, common_column2) в каждой из таблиц, он вернет вам 1048576 записей для каждой пары в a.

Не могли бы вы рассказать о вашей модели немного больше?Вы уверены, что вам нужны объединения, а не союзы?

0 голосов
/ 01 февраля 2011

Представление - это то же самое, что и выбор - оно не повлияет на производительность, но ими часто легче управлять.
Что касается того, будет ли объединенная таблица быстрее, трудно определить, не увидев запроспытаясь запустить.
Кстати, индексирование каждого столбца вряд ли будет полезным.Индексирование столбцов соединения возможно.Также могут помочь индексные столбцы, используемые в предложении «где».
Почему бы вам не опубликовать свой запрос, и мы посмотрим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...