База данных унаследованного приложения, которое я недавно начал обслуживать, имеет 2 индекса, область действия которых я не понимаю.
Таблица, для которой создаются индексы, выглядит следующим образом (это таблица, в которой хранятся ссылки междуОбъекты SW (это позволяет, например, связать клиента и 2 заказа, поэтому устанавливается связь между клиентом и 2 заказами):
CREATE TABLE [LINKS](
[LINK_ID] [int] NOT NULL, -- Counter Primary Key
[LINK_TYPE] [int] NOT NULL,-- Foreign Key to "link types" table
[ID_LINK_FROM] [int] NOT NULL, -- this is not FK, just an int
[ID_LINK_TO] [int] NOT NULL, -- this is not FK, just an int
[ID_LINK_TO_DETAIL] [int] NULL, -- this is not FK, just an int
[HAS_PRIORITY] [nchar](1) NOT NULL -- this is 'Y'/'N' "Boolean-like"
)
таблица имеет счетчик PK
и три целых поля, которыена самом деле отсутствуют FK, потому что в зависимости от LINK_TYPE
место назначения - это другая таблица. Конечно, полным решением будет нормализация БД, но сейчас это не вариант.
В этой таблице явно представлены проблемы с производительностьюво всех запросах, которые используют его в JOIN
. Чтобы попытаться решить эту проблему, кто-то в прошлом создал 2 (бесполезных, с моей точки зрения) индекса:
CREATE NONCLUSTERED INDEX [IDX_LINKS_ID_LINK_FROM] ON [dbo].[LINKS]
(
[ID_LINK_FROM] ASC
)
и
CREATE NONCLUSTERED INDEX [IDX_LINKS_ID_LINK_TO] ON [dbo].[LINKS]
(
[ID_LINK_TO] ASC
)
Эти индексы содержат только «недостающий FK», поэтому они бесполезны, потому что недостающие FK
наверняка используются для JOIN
, но затемлюбое другое поле отсутствует в индексе.
Так что мой вопрос "обратного инжиниринга" таков: вы подтверждаете, что эти 2 индекса бесполезны?
Насколько мне известно, следующие 2 были бы лучше "«исправление» из-за отсутствия нормализации БД:
CREATE NONCLUSTERED INDEX [IDX_LINKS_ID_LINK_FROM] ON [dbo].[LINKS]
(
[ID_LINK_FROM] ASC
)
INCLUDE ( LINK_TYPE,
ID_LINK_TO,
ID_LINK_TO_DETAIL,
HAS_PRIORITY)
и
CREATE NONCLUSTERED INDEX [IDX_LINKS_ID_LINK_TO] ON [dbo].[LINKS]
(
[ID_LINK_TO] ASC
)
INCLUDE ( LINK_TYPE,
ID_LINK_FROM,
ID_LINK_TO_DETAIL,
HAS_PRIORITY)
Как минимум последние 2 индекса содержат все поля, которые мне могут понадобиться в запросе, поэтому они намного лучше.
Можете ли вы подтвердить, что я на правильном пути?
С первых измерений, которые я провел по некоторым "значимым запросам", я вижу улучшение, но я хотел бы получить некоторые отзывы, прежде чем продолжитьна этом пути.