#sql #sql-server #performance #tsql
#sql #sql-сервер #Производительность #tsql
Вопрос:
У меня есть новая таблица A. Он присоединяется к существующим таблицам X, Y, Z. Поскольку это новая таблица, я могу создавать индексы для повышения производительности. В нем есть следующие столбцы.
C1 - nvarchar,
C2 - NUMERIC,
C3 - NUMERIC,
C4 -NVARCHAR,
C5 - NVARCHAR,
C6 - NUMERIC,
C7 - NUMERIC
Эта таблица является ссылкой ТОЛЬКО в этом запросе, где она соединяется следующим образом:
select A.C6, A.C7, ... (other columns from x,y,z table)
From A JOIN X ON A.C1 = X.C1
JOIN X X1 ON A.C4 = X1.C1
JOIN X X2 ON A.C5 = X2.C1
LEFT JOIN Y ON (A.C1 = Y.C1 AND A.C2 < Y.C3 AND A.C3 > Y.C2)
LEFT JOIN Z ON (A.C1 = Z.C1 AND A.C2 < Z.C3 AND A.C3 > Z.C2)
Какие индексы помогут повысить производительность этого запроса?
Комментарии:
1. Вам действительно нужны индексы на
x
,y
, иz
больше, чем наa
.
Ответ №1:
Какие индексы помогут повысить производительность этого запроса?
Начните только с кластеризованного первичного ключа в таблице. Затем заполните таблицы и запустите запрос, выводя фактический план запроса. SQL Server сообщит вам, если у вас есть какие-либо недостающие индексы.
Комментарии:
1. В таблице нет первичного ключа. Также нет уникального столбца. Можно ли создавать кластеризованный ключ на C1, C2, C3?
2. Ключ часто имеет несколько столбцов. Любая комбинация столбцов однозначно идентифицирует строку. Но дело в том, что каждая таблица имеет некоторые обязательные индексы, обычно уникальные индексы для ключей и индексы, поддерживающие внешние ключи. Начните только с них, а затем найдите недостающие индексы в плане запроса.