У меня есть простое внутреннее соединение, возвращающееся под 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
Начните с указания только столбцов, которые вам нужны в инструкции SELECT. – user172839
Просто удаление select * сделает этот план выполнения радикально отличающимся. Если это не сработает, просмотрите индексы покрытия. –
Это мое предположение, что StockBinQuantity PK должен быть StockID и BinId. Вам не нужен суррогатный ключ для этого стола. Затем вы помещаете кластерный индекс в столбцы. –