2010-06-14 2 views
0

다음은 테이블 스크립트입니다. 이 테이블에서 데이터에 액세스하는 것이 너무 느립니다.SQL Server 2005의 단일 테이블에서 데이터 액세스가 너무 느림

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Emails](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [datecreated] [datetime] NULL CONSTRAINT [DF_Emails_datecreated] 
     DEFAULT (getdate()), 
    [UID] [nvarchar](250) COLLATE Latin1_General_CI_AS NULL, 
    [From] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL, 
    [To] [nvarchar](100) COLLATE Latin1_General_CI_AS NULL, 
    [Subject] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL, 
    [Body] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL, 
    [HTML] [nvarchar](max) COLLATE Latin1_General_CI_AS NULL, 
    [AttachmentCount] [int] NULL, 
    [Dated] [datetime] NULL 
) ON [PRIMARY] 

다음 쿼리는 데이터를 가져 오는 데 50 초가 걸립니다. 내가 선택에 HTML을바디을 포함하는 경우

select id, datecreated, UID, [From], [To], Subject, AttachmentCount, 
    Dated from emails 

는 시간 이벤트 나쁘다. 비 고유 비에

  • 클러스터 된 비 고유 비에서 클러스터
  • 독특한

    • ID Tabls 현재 180000+ 레코드가

    클러스터 :

    인덱스가 있습니다.

    매월 100,000 개의 레코드가있을 수 있으므로 시간이 지날수록 느려질 것입니다.

    두 개의 테이블로 데이터를 분할하면 문제가 해결됩니까? 다른 어떤 인덱스가 있어야합니까?

  • +8

    잠깐 기다려주세요. 180K 레코드를 검색하는 데 50 초가 걸립니까? 왜 180K 레코드를 검색하고 있습니까? 당신은 그들과 무엇을합니까? 왜 50 초가 길어? 인간이 화면에 180K 개의 레코드를 처리 할 수있는 것과는 다릅니다. 그래서 내 질문은 정말로 모든 레코드가 필요한지 아니면 예제에서 생략 한 WHERE 절이 있습니까? – MJB

    +2

    where 절이 없기 때문에 인덱스가 작동한다고 생각하지 않습니다. 넌 테이블 전체 스캔을하고있어. – Blorgbeard

    +1

    왜 테이블에서 모든 레코드를 검색해야합니까? restrcitive 절을 사용할 수 없습니까? – pcent

    답변

    1

    문제의 원인이되는 데이터의 양은 거의 확실합니다. 이 때문에 필요할 때까지 Subject 열을 가져 오면 안됩니다. SUBSTRING(Subject, 100)을 가져 오는 경우조차도 눈에 띄게 빨라질 수 있습니다. 블롭 열이 행의 마지막이 아니었다면 SQL 서버의

    이 관련이있을 수 있지만, 이전 버전, 그래서 그냥 실험으로 내가 세 nvarchar(max) 열 위에 [AttachmentCount][Dated]를 이동할 것, 고통.

    +0

    도움을 주셔서 감사합니다. BLOB에 대한 의견을 확인하기 위해 SQL 문서를 살펴 보겠습니다. – Kashif