2009-08-23 2 views
0

SQL 주입 공격을 막기 위해 매개 변수화 된 쿼리를 사용하는 것이 중요하다는 사실을 알고있는 사람이 많습니다.다른 db에 대한 매개 변수화 된 쿼리의 성능

쿼리 최적화 프로그램이 실행하기 전에 모든 매개 변수가있는 SQL 문을 다시 구문 분석 할 필요가 없기 때문에 매개 변수가있는 쿼리는 온라인 트랜잭션 처리를 수행 할 때 sqlite 및 oracle에서 훨씬 빠릅니다. 나는 당신이 매개 변수화 된 질의를 사용할 때 sqlite가 3 배 더 빨라지는 것을 보았습니다. 오라클은 어느정도의 매개 변수화 된 질의를 사용할 때, 동시성이 많은 극단이 인 경우가 더 빨라질 수 있습니다.

다른 db는 mysql, ms sql, db2 및 postgresql과 비슷합니까?

매개 변수가있는 쿼리와 리터럴 쿼리간에 성능에 동일한 차이가 있습니까?

답변

1

저는 거의 항상 속도가 향상되는 것을 보았습니다. 계획이로드되고 캐싱 된 후에는 다양한 db 엔진이 두 가지 유형 모두에서 동일하게 작동 할 것이라 추측됩니다.

2

MySQL과 관련하여 MySQLPerformanceBlog reported은 준비되지 않은 명령문, 준비된 명령문 및 쿼리 캐시 된 명령문을 사용하여 초당 쿼리의 일부 벤치 마크를 수행합니다. 그들의 결론은 준비된 진술이 실제로는 보다 더 빠른보다 14.5 % 빠르다는 것입니다. 자세한 내용은 링크를 클릭하십시오.

물론 비율은 쿼리에 따라 다릅니다.

일부 사람들은 클라이언트에서 RDBMS로 추가 왕복을하고 있기 때문에 약간의 오버 헤드가 있다고 가정합니다. 하나는 쿼리를 준비하고 다른 하나는 매개 변수를 전달하고 쿼리를 실행합니다.

그러나 현실은 이것이 실제로 측정하지 않은 거짓 가정이라는 것입니다. 필자는 어떤 브랜드의 데이터베이스에서도 준비된 문장이 더 느리다는 것을 들어 본 적이 없다.

+1

오늘날 많은 DBMS가 SQL 문자열 동등성으로 식별 된 매개 변수화 된 쿼리를 지원하기 때문에 매개 변수화 된 쿼리를 준비하기 위해 추가 왕복이 필요하지 않습니다. –

+0

(계속 된 설명) : SQL Server에서 sp_executesql을 사용하거나 Oracle에서 "execute immediate"와 같이 사용합니다. DB에서 쿼리 식별자를 검색하는 여러 언어로 사용할 수있는 "준비"메서드는 연결 컨텍스트 내에서만 사용할 수 있으며 프로그래밍 오류가 발생하기 쉽습니다 (예 : 모든 쿼리 전에 "준비"호출). SQL 문자열로 식별 된 쿼리는 전체 또는 여러 애플리케이션에서 다시 사용할 수 있습니다. –

관련 문제