J'ai une table avec des 7,526,511 enregistrements avec la définition suivante:Performing extrêmement lent SELECT
/****** Object: Table [dbo].[LogSearches] Script Date: 12/07/2009 09:23:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[LogSearches](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[Acct_ID] [int] NULL,
[RecordCount] [int] NOT NULL,
[PageNumber] [int] NOT NULL,
[Site_ID] [int] NOT NULL,
[SearchAPI] [bit] NOT NULL,
[FormSearch] [bit] NOT NULL,
[IPAddress] [varchar](15) NOT NULL,
[Domain] [nvarchar](150) NOT NULL,
[ScriptName] [nvarchar](500) NOT NULL,
[QueryString] [varchar](max) NULL,
[Referer] [nvarchar](1024) NOT NULL,
[SearchString] [nvarchar](max) NOT NULL,
[UserAgent] [nvarchar](2048) NULL,
[Processed] [datetime] NOT NULL,
[Created] [datetime] NOT NULL,
[IntegerIP] [int] NULL,
CONSTRAINT [PK_LogSearches] 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
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[LogSearches] ADD CONSTRAINT [DF_LogSearches_Processed] DEFAULT (getdate()) FOR [Processed]
GO
ALTER TABLE [dbo].[LogSearches] ADD CONSTRAINT [DF_LogSearches_Created] DEFAULT (getdate()) FOR [Created]
GO
Le plan d'exécution ressemble à ceci:
StmtText StmtId NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type Parallel EstimateExecutions
---------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
SELECT TOP 1 * FROM LogSearches 1 1 0 NULL NULL 1 NULL 1 NULL NULL NULL 0.0032832 NULL NULL SELECT 0 NULL
|--Top(TOP EXPRESSION:((1))) 1 2 1 Top Top TOP EXPRESSION:((1)) NULL 1 0 1E-07 11848 0.0032832 [LOALogs].[dbo].[LogSearches].[ID], [LOALogs].[dbo].[LogSearches].[Acct_ID], [LOALogs].[dbo].[LogSearches].[RecordCount], [LOALogs].[dbo].[LogSearches].[PageNumber], [LOALogs].[dbo].[LogSearches].[Site_ID], [LOALogs].[dbo].[LogSearches].[SearchAPI], [LOALo NULL PLAN_ROW 0 1
|--Clustered Index Scan(OBJECT:([LOALogs].[dbo].[LogSearches].[PK_LogSearches])) 1 3 2 Clustered Index Scan Clustered Index Scan OBJECT:([LOALogs].[dbo].[LogSearches].[PK_LogSearches]) [LOALogs].[dbo].[LogSearches].[ID], [LOALogs].[dbo].[LogSearches].[Acct_ID], [LOALogs].[dbo].[LogSearches].[RecordCount], [LOALogs].[dbo].[LogSearches].[PageNumber], [LOALogs].[dbo].[LogSearches].[Site_ID], [LOALogs].[dbo].[LogSearches].[SearchAPI], [LOALo 1 2956.71 8.279319 11848 0.0032831 [LOALogs].[dbo].[LogSearches].[ID], [LOALogs].[dbo].[LogSearches].[Acct_ID], [LOALogs].[dbo].[LogSearches].[RecordCount], [LOALogs].[dbo].[LogSearches].[PageNumber], [LOALogs].[dbo].[LogSearches].[Site_ID], [LOALogs].[dbo].[LogSearches].[SearchAPI], [LOALo NULL PLAN_ROW 0 1
(3 row(s) affected)
Quand je lance la requête, il ne terminer dans n'importe quel genre de délai raisonnable. J'ai laissé la requête s'exécuter pendant plus de 5 minutes, et elle n'a toujours pas retourné la seule ligne que j'ai demandée. Ce type de performances SELECT lentes a d'autres effets sur la base de données, tels que la difficulté à se débarrasser des lignes dont nous n'avons plus besoin.
Avez-vous une idée de mon goulot d'étranglement? La base de données de 98 gig et ses journaux s'exécutent sur SQL Server 2008 sur un disque RAID 10 à 4 disques avec plus de 100 Go d'espace libre sur les disques.
êtes-vous sûr que la ligne (s) que vous sélectionnez ne sont pas bloqués par la ligne/page/db étant verrouillé par un autre processus ? Essayez d'ajouter avec (NoLock) à la fin de votre requête et voir si cela aide – u07ch
Est-ce que ça revient quand vous utilisez (NOLOCK) –
Il retourne avec NOLOCK. On dirait que j'ai fait une erreur noob parce que j'ai eu affaire à cette table pour ainsi. damné. longue. Cela me prend toujours pour effacer les lignes dont nous n'avons plus besoin. –