2011-07-05 2 views
0

나는 1 개의 열이있는 테이블을 가지고 있으며 10,000 개의 사용 가능한 행 사이에서 값의 반복을 확인하려고합니다.반복을 찾는 것이 더 빠릅니다.

이 같은 SELECT 문을 사용하여 쿼리를 확인하십시오 :

Var = Query('SELECT * FROM Table WHERE 
Field1="VALUE"'); 

if (Var <> null) 
    MessageBox("This value exists in the table"); 

Primary Key 나의 열을 설정하고 INSERT 문을 사용하여, 같은 :

try { 
    Var = Query('INSERT INTO Table(Field1) VALUES("VALUE")'); 
} 
catch { 
    MessageBox("This value exists in the table"); 
} 

가 나는 두 가지 선택이 생각

더 빠릅니다.

Var = Query('SELECT count(*) FROM Table WHERE Field1="VALUE"'); 

if (Var > 0) MessageBox("This value exists in the table"); 

두 번째 방법은 IMO, 너무 좋은하지 않고, 아마 훨씬 느린 될 것 :

+0

새 행을 삽입 * 하시겠습니까, 아니면 새 행을 삽입 하시겠습니까? 확실히 그것이 가장 중요한 것입니다 - 테이블의 상태가 나중에 무엇이되기를 원합니까? –

답변

1

, 그것은 스키마 설정 방법에 따라 달라집니다 존재한다. 대부분의 (아마도 모든?) 관계형 데이터베이스에서 필드를 Primary Key으로 만들면 해당 필드에 인덱스가 자동으로 만들어집니다. 그리고 인덱스에 대해 유일성 검사를하는 것은이 경우 얻을 수있는 것보다 훨씬 빠릅니다.

그러나 테이블의 Primary Key을 신고하지 않고 필드의 색인을 생성 할 수 있습니다. 그렇게하면 SELECT 명령은 INSERT 플러스 캐치 메소드만큼 빠릅니다. 더 광범위하게는 테이블 당 Primary Key 개만 가질 수 있으므로 필드를 Primary Key으로 만드는 것은 매우 강력한 솔루션이 아닙니다. 독창성을 적용하려는 여러 필드가있는 즉시 중단됩니다 (두 필드간에 복합 기본 키를 작성하지 않는 한 ...). 그러나 나는 뺄셈을하고 열 단위 고유성을 적용하지 않습니다.

필드/열에 인덱스를 만든 다음 SELECT 메서드를 사용하여 값이 이미 있는지 확인하는 것이 좋습니다. 또는 필드를 색인화하고 고유해야 함을 지정하면 이되고 Primary Key이되며 INSERT 더하기 캐치 접근법을 사용합니다. 다음

INSERT INTO Table(Column) 
SELECT 'New Value' WHERE NOT EXISTS (SELECT * FROM Table where Column = 'New Value') 

을 그리고 여부를 확인 : 당신이 삽입 값을 원하는 경우

1

나는 선택 카운트를 사용하는 것이 좋습니다 것입니다. 그리고 BTW, 그것은 대신 의 존재 읽어야 여기에는 일반적인 대답이 없습니다 :-)

1

, 그것은 (다른 SQL 방언이 적용될 수 있음) 가장 적합한 것 다음과 같이 다음, 뭔가를 존재하지 않는 경우 0 또는 1 행이 영향을받습니다.

내가 가장 적절한 말을하는 곳에서 성능 평가를하지는 않습니다. 나는 의도를 가장 명확하게 나타내는 코드 인에 대해 이야기하고 있습니다. 보통, 이것으로 충분할 것입니다. 만 거의 당신은 ... 멀리 가장 명확하게 0.5 % 더 좋은 성능을 덜 분명 뭔가를, 당신의 의도를 표현하는 코드에서 이동 안


또한 일반적인 스타일로, 첫 번째 형식 (SELECT * FROM TABLE...)을 조심해야한다 .크고 넓은 테이블을 쿼리하는 경우 이러한 선택을 수행하면 데이터베이스에서 많은 I/O를 수행하여 모든 열 값을 검색 할 수 있습니다. 코드에서 모든 값을 무시합니다. 반면에 EXISTS 절의 SELECT *...은 대부분의 데이터베이스 엔진에서 특별히 처리되며 실제 행/열 데이터는 검색하지 않습니다.

+0

고맙습니다.하지만 저는 '나는 1 칸짜리 테이블이 있어요.'라고 말했습니다. 그래서'SELECT ALL'을 사용하는 데 아무런 문제가 없습니다. – Kermia

+1

@Kermia - 제 대답의 두 번째 부분은이 상황과 관련이없는 일반적인 스타일로주의를 기울이려고했습니다. 나머지 대답은 여전히 ​​적용됩니다. –