2013-12-04 3 views
0

У меня есть простое внутреннее соединение, возвращающееся под 10k строк, но это занимает около 6 секунд. Могу ли я ускорить его с улучшением индексирования или чем-то еще?Как ускорить этот простой запрос, который использует кластерное сканирование индекса?

В прошлом я использовал guid или увеличивал int для первичного ключа и никогда не имел проблемы с более крупными наборами данных, чем это, я подозреваю, что Stock.StockId varchar (50) - моя проблема. Я понимаю, что могу изменить это на int, но подумал, что может быть альтернатива, чтобы сохранить меня, обновляя все мои источники данных, ссылки на fk и т. Д. После изменения этого столбца. Я представил кластерный ключ на StockBinQuantity сегодня, который сократил время запроса с 10 секунд до 6, но все же слишком медленный.

Мой объем данных - строки таблицы Считает
Bin: 1009
Наличие на складе: 11414
StockBinQuantity: 8456

Столбцы таблицы и индексы
http://i41.tinypic.com/w14txi.jpg http://i43.tinypic.com/2iuyl4o.jpg

запросов и План выполнения http://i43.tinypic.com/10xa9m9.jpg

Таблица Создание отчетности

-- STOCK 
CREATE TABLE [dbo].[Stock](
    [StockId] [varchar](50) NOT NULL, 
    [Alias] [varchar](50) NULL, 
    [Description] [varchar](max) NOT NULL, 
    [PartNumber] [varchar](250) NULL, 
    [StockImage] [image] NULL, 
    [IsRestricted] [bit] NOT NULL, 
    [Notes] [varchar](max) NULL, 
CONSTRAINT [PK_Stock] PRIMARY KEY CLUSTERED 
(
    [StockId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Stock] ADD CONSTRAINT [DF_Stock_Restricted] DEFAULT ((0)) FOR [IsRestricted] 
GO 

-- BIN 
CREATE TABLE [dbo].[Bin](
    [BinId] [int] IDENTITY(1,1) NOT NULL, 
    [BinCode] [varchar](50) NULL, 
    [WarehouseCode] [varchar](50) NOT NULL, 
    [Name] [varchar](max) NOT NULL, 
CONSTRAINT [PK_Bin_1] PRIMARY KEY CLUSTERED 
(
    [BinId] 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 [dbo].[Bin] WITH CHECK ADD CONSTRAINT [FK_Bin_Warehouse] FOREIGN KEY([WarehouseCode]) 
REFERENCES [dbo].[Warehouse] ([WarehouseCode]) 
GO 

ALTER TABLE [dbo].[Bin] CHECK CONSTRAINT [FK_Bin_Warehouse] 
GO 

-- STOCKBINQUANTITY 
CREATE TABLE [dbo].[StockBinQuantity](
    [StockBinQuantityId] [int] IDENTITY(1,1) NOT NULL, 
    [StockId] [varchar](50) NOT NULL, 
    [BinId] [int] NOT NULL, 
    [QuantityOnHand] [int] NOT NULL, 
    [QuantityOnOrder] [int] NOT NULL, 
    [ReorderPoint] [int] NOT NULL, 
CONSTRAINT [PK_StockBinQuantity] PRIMARY KEY NONCLUSTERED 
(
    [StockBinQuantityId] 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 [dbo].[StockBinQuantity] WITH CHECK ADD CONSTRAINT [FK_StockBin_Stock] FOREIGN KEY([StockId]) 
REFERENCES [dbo].[Stock] ([StockId]) 
GO 

ALTER TABLE [dbo].[StockBinQuantity] CHECK CONSTRAINT [FK_StockBin_Stock] 
GO 

ALTER TABLE [dbo].[StockBinQuantity] WITH CHECK ADD CONSTRAINT [FK_StockBinQuantity_Bin] FOREIGN KEY([BinId]) 
REFERENCES [dbo].[Bin] ([BinId]) 
GO 

ALTER TABLE [dbo].[StockBinQuantity] CHECK CONSTRAINT [FK_StockBinQuantity_Bin] 
GO 
+2

Начните с указания только столбцов, которые вам нужны в инструкции SELECT. – user172839

+1

Просто удаление select * сделает этот план выполнения радикально отличающимся. Если это не сработает, просмотрите индексы покрытия. –

+1

Это мое предположение, что StockBinQuantity PK должен быть StockID и BinId. Вам не нужен суррогатный ключ для этого стола. Затем вы помещаете кластерный индекс в столбцы. –

ответ

1

Спасибо ребята за комментарии - вы правы в том, что изменения оператора выбора ускоряет запрос. В моем случае, определяя каждый столбец, кроме столбца изображения в разделе «Склад», вы получаете время выполнения запроса на одну секунду, вы помогли мне определить, что это одно поле, которое замедляет его.

Я также нашел How to improve performance in SQL Server table with image fields?, изучим.

Следовательно, с вашей помощью я решил, почему это медленно в sql, и я могу оставить это одно поле. Теперь мне нужно уточнить свой оператор linq, чтобы это отразить.

Я согласен с тем, что ключ является избыточным как таковой, но он упоминается в нескольких местах по существующему коду и таблицам и заметно не замедляет мои запросы.

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