2009-08-04 4 views
1

반복 SQL 쿼리를 실행하기위한 최상의 방법은 무엇입니까? 필자는 매개 변수화 된 쿼리를 사용하여 첫 번째 실행시 준비된 문으로 변환하는 것을 이해합니다. 이 쿼리를 여러 스레드에서 실행해야하는 경우 어떻게해야합니까? 각 스레드에 대한 각 쿼리 유형에 대해 준비된 문을 작성해야합니까? 또는 SQL 문을 구문 분석하면 현재 준비된 문이 더 이상 필요하지 않으므로 효율적입니까?반복 SQL 쿼리

답변

2

좋은 질문 - 한 번에 한 비트 씩 대답합니다.

  • 반복 SQL 쿼리를 실행하기위한 가장 좋은 방법이란 무엇인가요? 쿼리 매개 변수의 차이에서 떨어져 반복 될 경우

후 준비된 문을 사용합니다.

  • 나의 이해는 매개 변수가있는 쿼리를 사용하여 처음 실행시 준비된 문으로 바꿀 것입니다.

이것이 무엇을해야하는지에 대한 제 의견입니다. 전통적으로 조언은 프로그램 시작시 모든 쿼리를 준비하는 것이 었습니다. 내 생각에, 이것은 항상 말도 안되는 것이었다. 서버를 쿼리로 오버로드합니다.이 중 다수는 주어진 실행에서 사용되지 않으므로 클라이언트와 DBMS 모두에서 메모리를 낭비합니다. 요구에 따라 진술을 준비하는 것이 항상 가장 현명했습니다. 그것이 필요할 때가 아니라면 필요하지 않았다. '항상'실행될 명령문에 대한 예외를 허용 할 것이지만 '항상'은 100 %에 가깝다는 것을 확신해야합니다.

  • 이 쿼리를 여러 스레드에서 실행해야한다면 어떻게해야합니까? 각 스레드에 대한 각 쿼리 유형에 대해 준비된 문을 작성해야합니까?

다른 스레드가 DBMS와 통신하는 방법에 따라 다릅니다. 필자가 잘 알고있는 DBMS에서 스레드가 모두 공유하는 단일 연결이 있으면 단일 연결에 대해 한 번만 준비하면됩니다. 각 스레드마다 별도의 연결이있는 경우 각 스레드에 대해 별도로 명령문을 준비해야합니다.

  • 또는 문장이 더 이상 필요 준비되지 요즘 때문에 효율적인 SQL 문을 구문 분석이다?

기계가 빠르다. 반복되지 않는 명령문의 경우에는 오버 헤드에 대해 걱정할 필요가 없습니다.그러나 쿼리를 몇 백만 번 실행하면 몇 백만 번 준비하는 비용이 합산되기 시작합니다. 또한 데이터베이스 서버 시스템은 일반적으로 공유 자원이지만 명령문은 각 사용자마다 별도로 준비되기 때문에 여러 명의 사용자가 반복되는 쿼리를 사용하여 시스템을 망치는 경우 서버는 너무 많은 쿼리를 준비하여 실행하기가 어려울 수 있습니다 그 (것)들의 빠른.

그래서 대답은 "아니오"입니다. 준비된 진술은 쿼리가 충분히 자주 반복 될 때 여전히 도움이됩니다. '자주 사용하는 경우'가 그다지 자주 사용되지는 않습니다. 수 백 번 - 준비된 진술을 사용하십시오. 수십 번 - 아마도 준비된 문장을 사용하십시오. 그보다 작습니다. 아마도 준비된 문장을 사용하지 마십시오.

+0

준비된 문은 종종 서버와 클라이언트의 메모리를 사용합니다. 각 쿼리가 반복 한 작업량의 비율과 각 쿼리가 반복 된 횟수를 살펴볼 것입니다. Prepared 문을 사용하면 코드가 복잡해지기 전에 수십 번에 걸쳐 수 백 가지의 구문에 더 가깝게 보일 것입니다. –

2

글쎄, 당신이 사용하는 환경에 대해서는 언급하지 않았지만 일반적으로 DB 엔진이 지원하는 경우 저장 프로 시저를 고려할 수도 있습니다. 데이터베이스 자체에 추가적인 추상화 계층을 구축하여 정확한 데이터베이스 스키마가 클라이언트 응용 프로그램과 관련성이 떨어지는 이점이 있습니다.

성능 향상을 위해서가 아니라 SQL 주입에 대한 보안 및 데이터 형식 변환 문제 (현지화 된 날짜 시간)를 방지하기 위해 대부분 매개 변수가있는 쿼리를 사용하는 것이 좋습니다.