2011-07-29 4 views
0

테이블의 업데이트 작업 속도를 높이십시오. 테이블은 레코드를 찾고 해당 필드를 UPDATE하는 데 사용되는 고유 ID에 있습니다. 테이블에 1M 레코드가 있습니다. 색인이 사용되지 않았습니다. 유일한 ID입니다. 삽입에 약간의 시간이 걸립니다. 여기서 예상되는 밀리 초입니다.업데이트 작업 속도 향상

테이블 구조 :

create table customers 
(
    id int IDENTITY(1,1) UNIQUE NOT NULL, 
    phonenum varchar(15) UNIQUE NOT NULL, 
    date datetime, 
    company varchar(150), 
    full_name varchar(150), 
    address varchar(150), 
    street varchar(100), 
    zip varchar(100), 
    city varchar(100), 
    info varchar(300), 
    op_data varchar(150), 
    op_date datetime, 
    op_user_taken varchar(100), 
    op_time_taken datetime, 
    op_status varchar(100), 
    user_taken varchar(100), 
    time_taken datetime, 
    status varchar(100),   
    ); 

나는 레코드를 업데이트 할 수도록 SqlConnection System.Data.SqlClient.SqlConnection 및 ExecuteNonQuery 메서드를 사용하고 있습니다.

테이블을 다시 디자인해야합니까, 아니면 ExecuteNonQuery가 너무 느립니까?

편집 : 업데이트 명령을

"UPDATE customers SET [email protected], [email protected], 
[email protected], [email protected], [email protected], 
[email protected], [email protected], [email protected], 
[email protected], [email protected] , status=\'Completed\', 
[email protected] WHERE [email protected]"; 
+1

UPDATE 문 예제를 볼 수 있습니까? – n8wrl

+0

업데이트 진술을 보여주십시오. 1M 행 모두를 업데이트하는 중이면 예, 약간의 시간이 걸릴 것입니다. –

+0

밀리 초 단위로 일어날 것으로 예상되면 일부 인덱스를 추가 하시겠습니까? 1 백만 개의 레코드 테이블에서 전체 테이블 스캔을 수행해야하는 경우 빠른 속도는 기대하지 마십시오. : p – Dismissile

답변

7

귀하의 ID 열 기본 키합니다. 기본 키는 자동으로 색인이됩니다. 다음과 같은 간단한 업데이트 문을 실행하는 경우 :

UPDATE customers SET <something> WHERE id = @id 

이렇게하면 INDEX SEEK가 실행되고 훨씬 빨라집니다. 이 인덱스가 없으면 INDEX SEEK 또는 INDEX SCAN (대량의 행을 갱신하는 경우에 발생)보다 더 긴 순서를 취하는 TABLE SCAN으로 갱신 중입니다.

또 다른 트릭은 업데이트 문을 SQL Server에서 실행하고 실행 계획을 살펴 보는 것입니다. 이것은 병목 현상이 어디 있는지 알려줍니다. 또한 Query Options (쿼리 옵션) | 고급 | 출력 탭에 표시 할 통계를 설정하십시오.

+0

전적으로 동의합니다. 이것이 바로 인덱스입니다. –

+1

'PRIMARY KEY'와'UNIQUE'는 모두 제약과 인덱스입니다! – a1ex07

+0

예, UNIQUE 제약 조건을 클러스터링 할 수 없습니다. 대량의 데이터에 대해 더 나은 인덱스를 얻으려면 UNIQUE 제약 조건 위에 클러스터 된 인덱스를 추가해야합니다. – Josh

-2

시도 -

using (SqlCommand comm = new SqlCommand("update sql", conn)) 
{ 
     SqlDataReader results = (SqlDataReader)comm.ExecuteReader(); 
} 

그냥 궁금해서 ...

+0

왜 ExecuteReader()가 UPDATE 명령을 실행합니까?왜이 방법이 더 빠를 것이라고 생각하는지 설명 할 수 있습니까? –

0

나는 당신이 인덱스를 (unique은 기본적으로 클러스터되지 않은 경우) 클러스터가 없기 때문에 그것의 생각, 그래서 SQL Server는 힙에 클러스터되지 않은 인덱스를 사용 업데이트 할 레코드를 찾으십시오 (UNIQUE은 색인입니다). IdUNIQUE이 아니라 기본 키 (기본적으로 클러스터 됨) 여야합니다.