Как правильно организовать индексы?

Всем доброго дня!
Читал документацию, но до конца не пойму - правильно ли сделал или нет, и можно ли сделать что то еще.
Есть таблица:
CREATE TABLE [Application].[PA] (
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CRId] [int] NOT NULL,
	[AGId] [int] NOT NULL,
	[PPId] [int] NOT NULL,
 CONSTRAINT [PK_PA] PRIMARY KEY CLUSTERED 
([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [Application].[PA]  WITH CHECK ADD  CONSTRAINT [FK_PA_PAG] FOREIGN KEY([AGId])
REFERENCES [Application].[PAG] ([Id])
GO
ALTER TABLE [Application].[PA] CHECK CONSTRAINT [FK_PA_PAG]
GO
ALTER TABLE [Application].[PA]  WITH CHECK ADD  CONSTRAINT [FK_PA_PP] FOREIGN KEY([PPId])
REFERENCES [Application].[PP] ([Id])
GO
ALTER TABLE [Application].[PA] CHECK CONSTRAINT [FK_PA_PP]
GO


У нее есть некластеризованный индекс
CREATE NONCLUSTERED INDEX [PA_NC_Index] ON [Application].[PA]
(
	[AGId] ASC,
	[PPId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO


[CRId] - это записи, которые в конечном итоге надо получить, чтобы понять какие строки надо выбрать из другой таблицы;
[AGId] - основной объект, уникален
[PPId] - дополнительный объект внутри основного, но является уникальным между основными объектами

Обращение в основном происходит подобным образом:
select [CRId] from [Application].[PA] where [PA].[AGId]=1 and [PA].[PPId]=21


В таблице более 1 млн записей, и начинает беспокоить вопрос - правильно ли организовано хранение и выборка? Или можно что то изменить / улучшить?

В случае, если делаем связь к этой таблице, то сразу получаем сильные тормоза (2 сек, прямая выборка - 0,02 сек), например
select top(10) Id 
from [Application].T inner join
[Application].[PA] on T.id=PA.[CRId]
where [PA].[AGId]=1 and [PA].[PPId]=21
  • Вопрос задан
  • 464 просмотра
Пригласить эксперта
Ответы на вопрос 1
swanrnd
@swanrnd
Издатель HTML5 игр
Попробуй так:
Ключ на [PA].[AGId] + [PA].[PPId] (уникальный класт)
Ключ [Application].id. (уникальный класт)

Сделай 2 запроса:
select [CRId] from [Application].[PA] where [PA].[AGId]=1 and [PA].[PPId]=21
select [CRId] from [Application].[T] where id IN (полученые айди в запросе до этого)

Иногда следует отказываться от JOIN.
Но для начала надо определиться, что именно тормозит.
Можно еще с планом запроса, конечно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы