2010-07-27 6 views
2

현재 응용 프로그램의 성능/메모리 사용 최적화를 다루고 있습니다. 수행 할 작업 중 하나는 빈 배열에 해당하는 테이블의 모든 BLOB를 null 값으로 바꾸는 것입니다. 이렇게하면 db 크기, 메모리 사용량이 줄어들고로드 속도가 빨라집니다.SQL Server 성능 저하

CREATE TABLE [dbo].[SampleTable](
    [id] [bigint] NOT NULL, 
    [creationTime] [datetime] NULL, 
    [binaryData] [image] NULL, 
    [isEvent] [bit] NULL, 
    [lastSavedTime] [datetime] NULL, 
CONSTRAINT [PK_SampleTable] 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] 

테이블을 업데이트하고 적절한 이미지 필드 값 (binaryData)을 NULL 값 (응용 프로그램의 빈 배열에 해당하는 데이터)으로 바꿨습니다. 이제는 사소한 SELECT * FROM SampleTable을 실행할 때 성능 저하를 관찰했습니다.

원래 업데이트 된 필드의 길이는 512 바이트 였지만 문제가 있는지는 확실하지 않았습니다.

NULL 값을 포함하는 BLOB를 선택하는 것이 다른 행에 대해 데이터가 동일하더라도 실제 이진 데이터를 선택하는 것보다 더 오래 걸리는 이유는 무엇입니까?

+0

을 NULL로 업데이트? 당신이 사용한 두 개의 SQL 명령은 무엇입니까? 같은 장소/환경에서 실행 했습니까? SSMS? –

+0

미안합니다. 두 경우 모두 동일한 'Select * from Table'쿼리를 실행하고 있습니다. 두 가지 다른 방법으로 성능을 확인했습니다. 1. 관리 스튜디오 2. db에 연결된 응용 프로그램을 실행하고 쿼리를 실행하고 SQL 프로파일 러에서 결과를 검사합니다. 결과는 두 경우 모두 비슷했습니다. – Daniel

+0

'[dbo]. [image]'유형이 무엇입니까? 그것은 사용자 지정 CLR 데이터 형식입니까? –

답변

0

나 당신이 다시 언급 도와 드리겠습니다 :

당신은 every.single.record을 테스트하는 동안 테이블 스캔을하고 SQL 서버가 있습니다. SQL Server에서 모든 레코드를 대량으로 덤프하는 경우와 비교하여 한쪽면에 null 값이있는 경우 ...

BLOB가 비교적 작 으면 어떤 것이 더 빠를 것입니까?

1

이 질문에 대한 답을 모르겠습니다. 나는 다음과 같은 시험을 시도했지만 놀라운 결과를 얻었다. 이 찾고

CREATE TABLE [dbo].[SampleTable](
    [id] [BIGINT] NOT NULL, 
    [creationTime] [DATETIME] NULL, 
    [binaryData] [IMAGE] NULL, 
    [isEvent] [BIT] NULL, 
    [lastSavedTime] [DATETIME] NULL, 
CONSTRAINT [PK_SampleTable] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
) 
) 

INSERT INTO [dbo].[SampleTable] 
SELECT 1, GETDATE(), 
0x1111, 
1, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 2, GETDATE(), 
0x2222, 
2, GETDATE() 

INSERT INTO [dbo].[SampleTable] 
SELECT 3, GETDATE(), 
NULL, 
3, GETDATE() 


UPDATE [dbo].[SampleTable] SET [binaryData] = NULL 
WHERE [id]=2 

SQL Internals Viewer에 난 NULL로 삽입 행 및 I는 NULL 업데이트 한 차이를 볼 놀랐다.

값이 NULL로 업데이트되는 경우에도 일부 이유로 NULL 비트 맵을 설정하지 않고 다른 LOB_DATA 페이지의 포인터를 따라야하는 것처럼 보입니다. 당신이 사과에 사과를 비교하고 있다는 확신

는 NULL로 삽입

Inserted http://img809.imageshack.us/img809/9301/row3.png

Updated http://img84.imageshack.us/img84/420/row2.png