2009-11-10 2 views
0

DB에서 여러 행을 검색하지만 현재 동일한 연결에서 한 번에 하나씩 수행하는 C# 프로그램이 있습니다.최적의 코드 - 하나의 큰 쿼리이지만 더 복잡한 데이터 검색 또는 많은 작은 쿼리

(ㅋ ㅋ이 때마다 변경 곳)를 실행 반복적으로 쓰기 때문에 그 대신에 더 좋을 것이다 :

select data from table where name = 'blah' 

같은 사람 :

select name, data from table where name in ('blah','blah2','blah3') 

내가이 만드는 긴장 결과 테이블에서이 데이터를 검색하는 추가 오버 헤드가 확실하지 않으므로 변경하십시오. 또한이 그래서 조금이라도 개선이 크게 도움이 될 수있는 고도의 스트레스 환경에

select name, data from table where name like 'blah%' 

:

내가 같은 아무것도 할 수 있도록 예제 데이터는 실제 데이터를 대표하지 않습니다. 사전에

감사합니다, 톰

+0

가능한 중복 [더 : 데이터의 많은 여러 SQL 쿼리 나 하나의 SQL 데이터 (http://stackoverflow.com/questions/4315658/which-is- more-sql-queries-or-one-sql-data-lots-of-data) –

답변

1

매개 변수가있는 쿼리는 빠르고 안전한 둘 다 .. 최고, 데이터베이스를 최적화 할 수 있습니다. 쿼리 계획을 캐시하고 SQL injection으로부터 보호합니다.

SELECT name, data 
FROM table 
WHERE name in (@name1, @name2, @name3) 

호출 코드에서 필요에 따라 매개 변수를 추가 할 수 있습니다.예를 들어 (C#을)의

var command = connection.CreateCommand(); 
command.CommandText = "SELECT name, data FROM table WHERE name in ("; 
int index = 0; 
string separator = ""; 
foreach (string value in valueList) 
{ 
    string paramName = "@p" + Convert.ToString(index); 
    command.CommandText += separator + paramName; 
    command.Parameters.Add(paramName, value); 
    separator = ", "; 
    index++; 
} 
command.CommandText += ")"; 
+0

그러나 이것은 매개 변수의 수를 알고 있다고 가정합니다. 현재 Append.Format을 사용하여 쿼리를 작성하고 있습니다. – tgandrews

+0

좋은 지적. 가변 수의 매개 변수를 처리하기 위해 내 대답을 편집했습니다. –

2

내가 한 땅딸막 한 요청에 가고 싶어. 최소한 성능 관점에서 볼 때 이것이 더 나은 접근 방법입니다.

2

DB 로의 한 번의 이동은 여러 개의 작은 히트보다 효율적입니다.

2

성능 향상을 위해 단일 명령문을 사용하면 명령문 준비, 제출 및 실행과 관련된 오버 헤드가 줄어들 것으로 예상됩니다. 그러나 어떤 최적화와 마찬가지로 - 커밋하기 전에 시도하고 측정해야합니다.

개별 요청 대신 진술을 준비하고 제출하는 방법을 살펴볼 수도 있습니다. 또한 첫 번째 경우에는 명령문을 한 번 준비하고 준비된 명령문을 캐싱하는지 확인하여 명령문의 반복 된 컴파일에 대한 부담을 덜어줍니다.

+0

다소 어렵습니다. 이것은 SQL 서버의 어셈블리입니다. – tgandrews

2

이론적으로 단일 쿼리가 더 좋습니다. 데이터베이스의 처리 시간이 같더라도 데이터베이스 서버와 클라이언트 간의 다중 왕복 통신을 피함으로써 자원과 시간을 절약 할 수 있습니다.

즉, 이는 변경 사항의 개선을 실제로 측정하기 위해 프로파일 링을 요구하는 한 가지 유형의 문제입니다.

0

내가 저장 프로 시저를 통해

select data from table... etc.etc. 

를 호출 한 작업에 가고 싶어 : 다음 프론트 엔드 코드에서 아무것도 변경하지 않고도는 SQL 로직 (가능한 최적화)와 수리를 할 것이다.

0

한 문은

관련 문제