2012-02-27 1 views
2

내 델파이 2006 응용 프로그램 (물론, 더 복잡한 현실에서) 이와 같은 SQL 문을 사용하여 TSimpleDataSet에 데이터를 읽고있는 오라클 9 데이터베이스가 매일이 과정에서이 쿼리를 매우 자주 실행하며 매번 in 절에 다른 값이 사용됩니다.Delphi의 SimpleDataSet에서 Oracle 바인드 변수를 어떻게 활용할 수 있습니까? <pre><code>select * from myschema.mytable where ID in (1, 2, 4) </code></pre> <p>내 응용 프로그램</p>가 시작되고 :

내 DBA는 모든 실행에서 쿼리가 다시 구문 분석되므로 데이터베이스 서버에 실행 부하가 발생한다는 것을 DBA가 알려주고 있습니다. 그들은 클라이언트에서 SQL 문을 작성하는 대신 bind variables을 사용하도록 제안했습니다.

델파이에서 매개 변수화 된 쿼리를 사용하는 것에 익숙하지만, 위에 링크 된 기사에서 바인드 변수가 정확히 무엇인지 알지 못합니다. 또한 응용 프로그램의 여러 실행에 걸쳐 작업 할 준비가 완료된 문이 필요합니다.

데이터베이스에 in 절을 포함하는 문을 준비한 다음 TSimpleDataSet에서 전달 된 다른 매개 변수로 실행되도록 할 수 있습니까? 따라서 응용 프로그램을 실행할 때마다 다시 구문 분석 할 필요가 없습니까?

+0

정말 TSimpleDataSet 또는 dbExpress를 사용해야합니까? 성능 문제가 발생할 경우 오라클 전용 DB 구성 요소로 전환하고 dbExpress 및 TSimpleDataSet을 삭제해야합니다. –

+0

@WarrenP 가능한 한 dbExpress를 사용하고 싶습니다. 다른 구성 요소를한데 모아 두었습니다. 그러나 호기심에서 오라클 전용 DB 컴포넌트를 염두에 두셨습니까? – PersonalNexus

+1

상업적이고 매우 높은 성능 : http://www.devart.com/odac/ –

답변

0

제 대답은 Delphi와 직접 관련이있는 것이 아니라 일반적으로이 문제입니다. 귀하의 문제는 가변 크기의 인리스트입니다. Tom Kyte of Oracle에는 사용할 수있는 몇 가지 권장 사항이 있습니다. 본질적으로, 너무 많은 고유 쿼리를 생성하여 데이터베이스가 많은 수의 하드 파싱을 수행하게 만듭니다. 이것은 불필요하게 CPU 소비 (및 DBA ​​혈압)를 증가시킵니다.

쿼리를 정적으로 만들면 소프트 파스 또는 전혀 구문 분석을하지 않아도됩니다. 그런 다음 DB는 실행 계획을 캐시 할 수 있고 DBA는보다 안정적인 SQL을 처리 할 수 ​​있으며 전반적인 성능을 향상시켜야합니다.

관련 문제