2012-02-27 29 views
2

私は自分のDelphi 2006のアプリケーションは、(実際に、それは当然のことながら、より複雑である)このようなSQL文を使用してTSimpleDataSetにデータを読み込み、そこからのOracle 9データベースがあります。DelphiのSimpleDataSetでOracleバインド変数を使用するにはどうすればよいですか?

select * from myschema.mytable where ID in (1, 2, 4) 

私のアプリケーションが起動し、このクエリーは、毎回、多くの場合、in節に異なる値で実行されます。

私のDBAは、毎回実行するたびにクエリが再解析されるため、これがデータベースサーバーに強制的に負荷をかけていることを通知しました。彼らは、クライアントでSQLステートメントを作成するのではなく、bind variablesを使用するように提案しました。

私はDelphiでパラメータ化されたクエリを使用することに慣れていますが、上記にリンクされた記事から、バインド変数が正確ではないという感覚が得られます。また、私は、これらの準備済みのステートメントがアプリケーションの異なる実行間で動作する必要があります。

in句を含む文をデータベースで一度作成し、TSimpleDataSetから渡された異なるパラメータで実行させる方法はありますか?そのため、アプリケーションを実行するたびに再解析する必要はありませんか?

+0

TSimpleDataSetまたはdbExpressを本当に使用する必要がありますか?パフォーマンスが重要な場合は、ネイティブのOracle専用DBコンポーネントに切り替える必要があり、dbExpressとTSimpleDataSetを削除する必要がありますか? –

+0

@WarrenP可能であれば、私はdbExpressにとどまりたいので、他のコンポーネントがたくさん集まっています。しかし、好奇心の念から、Oracle固有のネイティブなDBコンポーネントは何でしたか? – PersonalNexus

+1

商業的かつ非常に高い性能:http://www.devart.com/odac/ –

答えて

0

私の答えはDelphiには直接関係しませんが、一般的にはこの問題です。あなたの問題は、可変サイズのインリストの問題です。 Tom Kyte of Oracleには、使用できるいくつかの推奨事項があります。基本的には、ユニークなクエリが多すぎるため、データベースでハード解析が頻繁に行われます。これはCPU消費量(およびDBA血圧)を不必要に高めます。

クエリを静的にすることで、ソフトパースまたはパーズなしで取得できます。 DBは実行計画をキャッシュすることができ、DBAはより安定したSQLを処理でき、全体的なパフォーマンスを改善する必要があります。

関連する問題