2012-05-11 1 views
1

私は効率性の点で、データベースとの接続の量を最小限に抑えること(特に、強力なネットワークトラフィックの状況で)が望ましいため、小さなクエリではなく1つの大きなクエリではなく、トランザクションは大きなクエリのようですか?

私の質問は、データベース操作のセットを分離して霧化すること(そして、それらのうちの1つが失敗した場合ロールバックすること)の他に、トランザクションを実行することです。行為は大きなクエリのようですか?つまり、多くのデータベース操作を行う必要がある場合は、トランザクションでラップして単一の大きな操作にすることができますか?あなたは多くのデータベース操作を行う必要がある場合

+2

質問の精神が「トランザクションを使用してパフォーマンスを向上できますか?その答えは大声ではありません!トランザクションは、複数の操作のアトミック性、ロールバック機能など、多くのメリットをもたらします。しかし、これらの機能にはコストがかかり、パフォーマンスコストがかかります。 – Asaph

+2

@Asaphそれは本当ですか?トランザクションから大きな利益を得る例を作ることは非常に簡単です。例えばインサートごとに1つのSQLステートメント、SQLステートメントごとに1つのトランザクション(トランザクションを明示的に使用しない場合は、多くの場合、これがデフォルトです)。テストを繰り返しますが、100個のSQL文をトランザクション内に配置します。トランザクションごとに100個の挿入を行うものは、少なくともテストしたすべてのDBMSについて、1トランザクションあたり1個の挿入を行うよりもずっと高速になります。 – nos

+0

@nosそれは面白いです。私はバッチインサートの利点を見てきました。たとえば、MySQLの複数行の挿入文(暗黙的なトランザクションで実行すると思います)などです。私は規模のパフォーマンスの向上を見てきました。バッチ処理の効果を達成するためのトランザクションアプローチを試みることは決してありませんでした。意味をなさない – Asaph

答えて

2

いいえ、あなたが尋ねていることを理解していれば、いいえ。トランザクションは、データベース履歴のチェックポイントを設定するものと考えることができます。したがって、トランザクション内の個々の操作が失敗した場合、データベースの状態をチェックポイントに復元できます。それは大きな単純化ですが、概念的にはトランザクションの仕組みです。

トランザクション内では、個々のクエリが個別に実行されます。

「多くの小さなクエリではなく、1つの大きなクエリ」を持つことは、必ずしも効率的ではありません。それはクエリが何であるかによって異なります。一度に1つずつ問い合わせるのではなく、1つの大きなクエリで一連の行を要求する方が効率的です。私は実際にこの(擬似コード)行うコードを見てきました:

SELECT id FROM people WHERE ... ORDER BY lastname; 

for each (id) { 
    SELECT firstname, lastname, phone from people WHERE id = {id}; 
    ... 
} 

ディスクの面では

SELECT id, firstname, lastname, phone FROM people WHERE ... ORDER BY lastname; 
+0

私が理解しているように、質問は*「それは速くなるのではないか」*しかし*「それは単一の大きな操作ですか? – Tomalak

+0

私は少しここで混乱しているが、答えのみんなありがとう。トランザクション内では、個々のクエリは個別に実行されるか、@Tomalakのようにすべて単一のクエリとして扱われますか? – federicot

+0

@ジョン私はそれを言わなかった。あなたはそれについて考えるなら、それは論理的に不可能です。私が言ったことは、操作が* atomic *になるということです。つまり、個々の操作がどれだけ多く(またはいずれの)操作に含まれていても、全体として成功するか、全体として失敗します。 DBサーバーは、他の操作がトランザクションを妨害できないことを確認し、エラーが発生した場合、影響を受けたすべての変更が取り消されます。 2つのテーブルが一貫性を保つために更新を必要とする場合、トランザクションは2つの更新が両方のテーブルに対して正常に実行されるか、まったく実行されないかを確認します。それがトランザクションの目的です。 – Tomalak

1

、あなたはトランザクションでそれをラップし、単一の大きな操作

はいにそれを回すことができます。その操作は、単一の行更新のように、アトミックになります。

2

このアプローチの問題は、いくつかのリソースをロックし、同時性が悪いことです。 1つのクエリで1つのエラーが発生すると、ロールバックが膨大になります。

私はトランザクションを避けようとしますが、可能であれば、何らかの補償トランザクションを実装する必要があることもあります。

0

として多くの方が効率的だろうI/O:たぶん(に応じてどのように大規模な取引は他にも多数の要因があります)。 あなたが求めているネットワークI/Oに関して:いいえ。トランザクションはサーバー側で実装されます。