2009-12-07 75 views
0

我有一個表與7526511個記錄,定義如下:極慢速執行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 

執行計劃是這樣的:

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) 

當我運行查詢它不在任何合理的時間範圍內完成。我讓查詢運行了5分鐘以上,但它仍然沒有返回我要求的單個行。這種類型的慢SELECT性能對數據庫有其他影響,例如難以擺脫我們不再需要的行。

你知道我的瓶頸可能在哪裏嗎? 98 gig數據庫及其日誌在SQL Server 2008上運行的4磁盤RAID 10上,驅動器上有超過100個可用空間。

+1

您確定您選擇的行沒有被另一個進程鎖定的行/頁面/數據庫阻止?嘗試添加(NoLock)到您的查詢結束,看看是否有幫助 – u07ch 2009-12-07 14:35:32

+0

它使用時返回(NOLOCK) – 2009-12-07 14:37:57

+0

它確實返回NOLOCK。看起來我做了一個noob錯誤,因爲我一直在處理這個表。該死的。長。它讓我永遠清除我們不再需要的行。 – 2009-12-07 14:48:53

回答

0

您是否檢查過您是否遇到阻塞問題?

+0

我一直在這個桌子的最後幾天,但這一次沒有。看起來這畢竟可能是問題。我試圖從這張表中刪除記錄,並且做了一個錯誤的假設,即它是同樣的舊東西。 – 2009-12-07 14:40:17

0

創建具有所需結構的另一個表並複製/「泵」數據,然後刪除舊錶並重新命名新表?您可能需要在「批次」中針對特定ID範圍執行此操作:

INSERT INTO LogSearches_new ... SELECT * FROM LogSearches WHERE ID BETWEEN 1 AND 999999 
+0

不幸的是,當我嘗試時,解決方案造成的問題與原始刪除一樣多:-(。我認爲我遇到了需要解決的磁盤I/O問題,以加速它的運行速度。一直運行PerfMon 24小時,所以我們會看看它有什麼要說的。 – 2009-12-08 14:15:30