9

多くのストアド プロシージャを持つ運用 SQL サーバー DB (レポート) があります。SP は、さまざまな方法で外部世界に公開されます
。SP に直接アクセスできるユーザーもいれば
、Web サービスを介して公開されるユーザーもいます
。また、DCOM レイヤーを介してインターフェイスとしてカプセル化されるユーザーもいます。

ユーザーベースは大きく、どのユーザーセットがどの方法で DB にアクセスするのか正確にはわかりません。
出力に 1 つの列を追加するか、既存の出力に列のグループを追加することによって、既存の SP を変更するというユーザー セットからの要求が頻繁に (隔月で約 1 回) あります。それ以外はすべて同じままです。
最初に、既存の SP を変更し、新しく要求された列を出力の最後に追加することから始めました。しかし、これにより他のユーザー ベースによって作成されたカスタム ツールが機能しなくなりました。そのツールには列の数がハードコーディングされていたため、列を追加するとツールも変更する必要があったためです。

また、一部の列では、その列をレポートに取り込むために複雑なロジックが必要であり、SP のパフォーマンスが低下し、すべてのユーザー (新しい列を必要としないユーザーも含む) に影響を与えました。

これを修正するためのさまざまな方法を考えています。

1 フローを制御するためのデフォルト パラメータ

コード パスを制御するデフォルト パラメータとしてフラグを追加することで、既存の SP を更新し、新しい機能を制御します。パラメータの値が true に設定されている場合、デフォルトのパラメータを使用して、新しい機能のみを呼び出します。デフォルトでは、False に設定されています。

アドバンテージ

  • 新しいオブジェクトは必要ありません。
  • 進行中のメンテナンスは影響を受けません。
  • テストのオーバーヘッドは引き続き制御されます。

不利益

  • 既存の SP が変更されるため、既存の機能と新しい機能のテストが必要になります。
  • クライアント ツールがどのように SP を呼び出しているかについては何もわかっていないため、何も壊れていないことを確信することはできません。
  • より多くのリクエストで同じレポートが再度変更された場合、処理が難しくなります。つまり、フラグが増え、コードが判読できなくなります。

2 新しいストアド プロシージャ

SP の署名 (入力/出力) を変更する要件に対して、新しいストアド プロシージャが作成されます。
新しい SP は、既存のものに対して元のストアド プロシージャを呼び出し、その上に新しい要件のロジックを追加します。

アドバンテージ

  • ここでの利点は、既存の手順に影響がないため、古いロジックのテストが不要になることです。

不利益

  • 変更が要求されるたびに、データベースに新しいオブジェクトを作成する必要があります。これは、データベース メンテナンスのオーバーヘッドになります。

新しいパラメーターの追加に基づいて実行計画は変更されますか? はいの場合、これは、新しい列を要求しなかったユーザーに悪影響を与える可能性があります。
SP は DB へのパブリック インターフェイスであり、インターフェイスは不変である必要があると考えると、オプション 2 を使用する必要がありますか?
ベスト プラクティスは何ですか、それともケースバイケースで異なりますか?また、オプションを選択する際の主な要因は何ですか?

前もって感謝します!

4

7 に答える 7

4

最初のオプションの不利な点からの引用:

より多くのリクエストで同じレポートが再度変更された場合、処理が難しくなります。つまり、フラグが増え、コードが判読できなくなります。

個人的には、これが新しい列に対応するために既存のストアド プロシージャを変更しない最大の理由だと思います。

複数のブランチを持つストアド プロシージャにバグが発生すると、デバッグが非常に困難になる可能性があります。また、示唆したように、実行計画は分岐/ if ステートメントで変更できます。(クエリを実行するときと、ストアド プロシージャ内でそのクエリを実行するときに、異なる実行プランを使用する sql? )

これはオブジェクト指向のコーディングと非常によく似ており、既存のオブジェクトを変更するのではなく拡張するのが最善であるというあなたの本能は正しいです。

私はアプローチ#2に行きます。オブジェクトが増えますが、少なくとも問題が発生した場合、影響を受けるストアド プロシージャの範囲/影響が限られていることがわかります。

時間の経過とともに、オブジェクト/データ構造を垂直ではなく水平に成長させることを学びました。言い換えれば、ただ新しいものを作るだけで、既存のものをどんどん大きくしていくのではありません。

于 2013-08-30T16:24:39.033 に答える
1

要件はほとんどの場合変化し続けるため、特に #1 の短所の箇条書き 3 を考慮すると、#2 は #1 よりも優れたオプションである可能性があります。私がこれを感じるのは、どちらの側の利点よりも、ここでは欠点が支配的だからです。

于 2013-09-06T09:09:38.953 に答える
1

Ok。#2。絶対。間違いない。

#1は、「既存の手順を変更する」と言います。これにより、物事が壊れます。まさかそれはいいことだ!あなたの顧客はあなたを嫌うでしょう。コードがより複雑になるということは、物事を壊すことを避けるのがますます難しくなり、憎しみにつながるということです。それは恐ろしく遅くなり、調整することは不可能です。等々。

#2の場合、安定したインターフェースがあります。憎しみはありません。わーい!真剣に、「私はまだ仕事があります!」のように「やった!」「ブー、顧客に迷惑をかけたために解雇された」とは対照的です。真剣に。その理由だけで#1を行うことは決してありません。あなたはこれが真実であることを知っています。知ってるでしょ!

そうは言っても、人々が何をしているかを記録してください。ユーザー ID をパラメーターとして受け取ります。ログに記録します。ユーザーを知る。古いくだらないコードを使用しているものを見つけて、必要に応じてアップグレードするように依頼してください。

2番を避ける理由は増殖です。しかし、それは何かをテストしない場合にのみ問題になります。テストを適切に行っていれば、いずれにせよ、テストで増殖が起こっています。また、必要に応じて #2 でいつでも調整できます。または、少なくともパフォーマンスの問題を切り分けることができます。

より太い手順が本当に優れている場合は、細いバージョンを太いバージョンのよりスリムなバージョンに改造します。SQL ではこれはトリッキーですが、選択した列のリストをコピーして貼り付けて切り取ると機能します。通常、私はこれを行うことを気にしません。人生は短すぎる。非常に優れたテスト コードを用意することは、時間の投資にはるかに有効であり、データ スキーマは、既存のクエリを壊すような変更を行うことはめったにありません。

わかった。うそつき。深刻なメッセージ。2 を実行するか、少なくとも 1 を実行しないでください。それ以上の理由が思いつきません。

于 2013-09-04T16:22:50.987 に答える
0

私も#2に投票します。#1 を極限まで引き上げるいくつかのストアド プロシージャを見てきました。SP にはパラメータ@Optionといくつかのパラメータがあります@param1, @param2, .... 最終的な効果は、これが多くの役割を果たそうとする単一のストアド プロシージャであることです。ストアド プロシージャ。

#2 の主な欠点は、ストアド プロシージャが多いことです。探しているものを見つけるのはもっと難しいかもしれませんが、それはあなたが得る他の利点のために支払う小さな代償だと思います.

また、元のストアド プロシージャをコピー アンド ペーストしていくつかの列を追加するだけではないことも確認したいと思います。私もそれらの多くを見てきました。いくつかの列のみを追加する場合は、元のストアド プロシージャを呼び出して、新しい列に結合できます。これらの列が以前にすぐに利用可能だった場合、これは間違いなくパフォーマンスの低下を招きますが、元のストアド プロシージャを変更する必要はなく (パフォーマンスを向上させ、コードの重複を避けるためのリファクタリング)、2 つのコピーを維持する必要もありません。コードの (パフォーマンスのためのコピーと貼り付け)。

于 2013-09-02T23:53:37.670 に答える
0

あなたが与えたオプションに基づいて、他のいくつかのオプションを提案します。

代替オプション #1: 別の変数を追加しますが、それをデフォルトの変数にする代わりに、変数を顧客名に基づいて作成します。このようにして、顧客 A は専門的なレポートを取得し、顧客 B はわずかに異なるカスタマイズされたレポートを取得できます。これにより、「メイン」部分への更新をすべての専門顧客のものにコピーする必要があるため、大量の作業が追加されます。これは、分岐 'if' ステートメントで行うことができます。

代替オプション #2: 新しいストアド プロシージャを追加します。顧客の名前をストアド プロシージャに追加するだけです。メンテナンスに関しては、これは少し難しいかもしれませんが、最終的に同じ結果が得られます。各顧客は独自のレポート タイプを取得します。

于 2013-09-03T18:29:19.663 に答える
0

オプション #2 を選択します。

あなた自身が(欠点)利点について言及しました。

要件の変更に基づいて新しいオブジェクトを db に追加することを検討している間は、新しい SP を大きくしたり保守を難しくしたりしないように、必要なオブジェクトのみを追加してください。

于 2013-09-07T11:12:38.610 に答える