Eu trabalho no sql server 2019, enfrento um problema ao selecionar top 5
linhas, demora muito tempo.
Número de Linhas na Tabela Z2DataCore.parts.SourcingNotMappedParts
70 milhões de linhas.
quando executar statment selecione top 5
demora muito tempo exceda 15 minutes
.
Então, como torná-lo mais rápido
selecione a declaração que tem problema
SELECT top 5 GivenPartNumber_Non,vcompanyid
into #GetSupplierAndOther
FROM Z2DataCore.parts.SourcingNotMappedParts with(nolock)
Where PriorityLevel in ('A3','A4') and vcompanyid is not null and sourcetypeid=484456
group by GivenPartNumber_Non,vcompanyid
having count(distinct sourcetypeid)=2
meu plano de execução estimado
https://www.brentozar.com/pastetheplan/?id=r1EPmqFx5
Notas: Eu tento fazer selecionar colunas acima sem usar select into
mas ainda muito lento.
scripts e índices de tabela de amostra
CREATE TABLE [Parts].[SourcingNotMappedParts](
[SourcingNotMappedPartsID] [int] IDENTITY(1,1) NOT NULL,
[SearchPart] [nvarchar](200) NULL,
[GivenManufacture] [nvarchar](200) NULL,
[CompanyId] [int] NULL,
[SourceTypeID] [int] NULL,
[RevisionId] [bigint] NULL,
[ExtractionDate] [date] NULL,
[Taxonomy] [nvarchar](250) NULL,
[PartStatus] [nvarchar](50) NULL,
[Datasheet] [nvarchar](2000) NULL,
[ROHS] [nvarchar](250) NULL,
[StockId] [int] NULL,
[SourceUrl] [nvarchar](2000) NULL,
[Description] [nvarchar](2000) NULL,
[CreatedBy] [int] NULL,
[ModifiedBy] [int] NULL,
[CreatedDate] [datetime] NULL,
[ModifiedDate] [datetime] NULL,
[Comment] [nvarchar](2000) NULL,
[Reason] [nvarchar](2000) NULL,
[PartId] [int] NULL,
[GroupID] [int] NULL,
[PartStatusID] [int] NULL,
[ManufactureStatus] [int] NULL,
[EditStatus] [int] NULL,
[FamilyID] [int] NULL,
[LookupId] [int] NULL,
[ValidationReasonId] [int] NULL,
[MatchStatus] [nvarchar](200) NULL,
[GivenPartNumber_Non] [nvarchar](200) NULL,
[GivenManufacturer_Non] [nvarchar](200) NULL,
[signatureID] [int] NULL,
[VCompanyId] [int] NULL,
[PriorityLevel] [nvarchar](10) NULL,
[NotMappedCode] [int] NULL,
[PCPartStatus] [nvarchar](50) NULL,
CONSTRAINT [PK_Parts.SourcingNotMappedParts] PRIMARY KEY CLUSTERED
(
[SourcingNotMappedPartsID] 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 [Parts].[SourcingNotMappedParts] ADD CONSTRAINT [DF_SourcingNotMappedParts_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate]
GO
ALTER TABLE [Parts].[SourcingNotMappedParts] ADD CONSTRAINT [DF_SourcingNotMappedParts_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
ALTER TABLE [Parts].[SourcingNotMappedParts] ADD CONSTRAINT [PK_Parts.SourcingNotMappedParts] PRIMARY KEY CLUSTERED
(
[SourcingNotMappedPartsID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_NotMapped_SourceType] ON [Parts].[SourcingNotMappedParts]
(
[SourceTypeID] ASC,
[CompanyId] 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
CREATE NONCLUSTERED INDEX [IX_NotMapped_PriorityLevel] ON [Parts].[SourcingNotMappedParts]
(
[PriorityLevel] 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
CREATE NONCLUSTERED INDEX [IX_NotMapped_NonalphaPartCompany] ON [Parts].[SourcingNotMappedParts]
(
[GivenPartNumber_Non] ASC,
[VCompanyId] 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
CREATE NONCLUSTERED INDEX [IDX_SourcingNotMappedParts_VCompanyId] ON [Parts].[SourcingNotMappedParts]
(
[VCompanyId] 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
Seu problema realmente não tem nada a ver diretamente com o
TOP 5
. Você tem uma cláusulaGROUP BY
and , as quais acontecem antes do . O pode ter que tocar em milhares de linhas antes de produzir um conjunto de resultados reduzido. Por esse motivo, não é como se você estivesse passando 5 linhas para o e esperando que ele agisse neles.HAVING
SELECT TOP
GROUP BY
GROUP BY
Além disso, você forneceu apenas um plano estimado. Ele estima que 522 linhas serão lidas. Mas sem um plano de execução real, não há como saber quantas linhas foram realmente lidas.
O plano estimado também tem uma Pesquisa de Chave porque você não tem um índice que abranja todas as colunas referenciadas em sua consulta. As pesquisas de chave geralmente são ruins, porque são executadas uma vez para cada linha. Nesse caso, estima-se que seu Index Scan retornará 522 linhas. Para cada uma dessas 522 linhas, haveria uma pesquisa de chave distinta. Revendo seus índices atuais, eu consideraria adicionar este índice para obter uma busca de índice sem uma pesquisa de chave.
Além disso, depois disso, você poderá descartar esse índice.
Você não criou o índice adequado, ao que parece. Mas antes de criá-los investigue o plano de consulta da sua consulta. Se estiver usando o SSMS, selecione a consulta e pressione Ctrl + L para habilitar o plano de consulta. Os índices ausentes também são mostrados no plano de consulta.
Esta é uma consulta criada por Pinal Dave . Ele mostra os 25 principais índices que você pode ter perdido para criar.