問題タブ [set-based]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - イベントを除く、イベントテーブルのベース計算を設定します
メンテナンスサービスの状態を変更するためのイベントを含むテーブルがあります。これはデータのサンプルです:
レポートでは、各アイテムに費やされた時間を表示する必要があります
基本的に、私は次のようなDATEDIFFを実行しています。
今、私は新しい状態を実装する必要があります。サービスの遅延と再アクティブ化。ただし、そのサービスに費やされた合計時間を計算するときに、これらの時間を考慮する必要はありません。
報告する
遅延と再アクティブ化は、どのアイテムでもさまざまな時点で発生する可能性があります。
カーソルでこれを実行できることは知っていますが、私にはハッキーに思えます。セットベースのアプローチでこれを計算する方法はありますか?
mysql - MySql:複合PKの長いリストを使用して多くの行を操作する
ODBCと接続しているクライアントアプリケーションにキーの長いリストがある場合、MySqlの多くの行を操作するための良い方法は何ですか?
注:私の経験は主にSQL Serverであるため、MySQLだけでなく、少しは知っています。
タスクは9つのテーブルからいくつかの行を削除することですが、5,000以上のキーペアがある可能性があります。
私は、すべてのキーをループして、各テーブルに対して各キーのステートメントを送信する簡単な方法から始めました。たとえば、次のようになります。
ただし、それは45,000の個別のステートメントになりますが、ご想像のとおり、少し遅いです。
では、フロントエンドで使用しているプログラミング言語を気にせずに、リストを送信して、一度に、または少なくとも大量に操作を実行できるようにするための良い方法は何でしょうか。これまでの私の考えは次のとおりです。
一時テーブルを作成して挿入し、結合します。MySQLの構文を調べて一時テーブルを作成しますが、それは良い方法ですか?
一時テーブルを使用すると仮定すると、一時テーブルにデータを入力するための最良の方法は何ですか?5000
/li>INSERT Table VALUES ()
ステートメント?SELECT 123, 456 UNION ALL SELECT 124, 457
?MySqlがテーブルに対して発行されないこの種のSELECTを許可することをテストしました。しかし、リストが長くなりすぎるとSQL Serverが最終的に爆発するので、これはMySQLの良い方法ですか?リストを一度に数百に保つ必要がありますか?XML。MySQL 5.1にはいくつかのXML関数があるようですが、大まかな検索では、XMLテキストのチャンクを結合する行セットに変換することをサポートしていないようです。本当?値をXMLに取り込むのは非常に簡単です。
仮想分割操作。MySqlには、ある種の手続き型言語が可能であると思います。SQL Serverでは、文字列を解析して行セットに変換するカスタムコードを記述できます。
/li>
私はMySQLに慣れていないので、最初に調査する可能性が本当にわかりません。悪い決断をしたり、難しい方法を学んだりするのを防ぐために、助けていただければ幸いです。
sql - update ステートメントで SUM を使用します。
私はこれを検索しようとしてきましたが、正しい用語を使用しているかどうか確信が持てません。あるいは、それが不可能なだけかもしれません。しかし、私がやろうとしているのは、設定値より小さい合計値を構成するテーブル内のすべてのレコードを更新することです。
以下に例を示します。
今、私がやりたいことは、合計が 22 未満のすべてのレコードを更新することです。そのため、ID 1 と 2 の合計を実行すると、22 未満の 20 になります。 processed_date に null を指定します。また、古いものから新しいものへと更新されるように動作させたいと考えています。
基本的に、擬似コードで記述する方法は次のとおりです。
しかし、私はこれがうまくいかないことを知っています。だから私は、いくつかの SQL マスターがアイデアを持っていることを願っています。
これをカーソル内に書き込むことができると確信していますが、これを実行するためのセットベースの方法があるかどうか疑問に思っています。
編集:私の状況をよりよく表すために、以下の表と簡単な説明を更新しました。
.net - セットベースの実行。SQL と .NET
SQL では、反復ベース (つまり、ループ) ではなく、セットベースの操作を常に心がける必要があります。.NET では、コレクションとオブジェクトを頻繁にループします。.NET にセットベースの処理を可能にするコマンドはありますか?それともすべて反復ベースですか? (結果セット内の各レコードを反復するDataAdapter.Fill
呼び出し方法を思い出しました)。DataReader
私は にあまり詳しくありませんLINQ
が、その実装は単に舞台裏で行われている反復を隠しているだけだと思います。
アップデート:
明確にするために、私はここで天才だと主張しているわけではありません。また、私の人生のプログラミングをより良くする素晴らしい人々を推測しているわけでもありません。SQL が you のときに行うように、セットベースの操作を実行するコマンドがあるかどうかを単純に尋ねているのに対し、UPDATE
どちらforeach(var item in obj) { ... }
がオブジェクトを明確に繰り返しているかを尋ねています。SQL 開発者は、ループを使用するたびに非難されますが、.NET では常にループを使用しています。SQL と .NET の両方で頻繁に作業する開発者として、ループを完全に回避する .NET の代替手段があるかどうかを尋ねています。
database - DB ストアド プロシージャ操作の設計 - セット ベースとカーソル ベースの比較
ストアド プロシージャを設計するときは、セット ベースの操作の方がカーソル ベースの操作よりも優れていると聞いています。
誰かがこれがなぜなのかを簡潔に説明できますか?
sql-server-2008 - XLS バッチ SQL からの挿入時にトリガーを使用して複数行の FK ID をインクリメントする
この問題に関連する他の質問を投稿しましたが、XLS からの複数の行データのインポートの問題に直接対処するための回答はありませんでした。私は一般的に SQL や DB の使用頻度が低いため、これらのクエリの作成に関する背景や経験は限られています。私の目標を達成するためのより簡単で直接的なアプローチがあれば、私はそれらにオープンです. 過剰投稿などの意図はありませんが、このサイトが最も役に立ちそうです (私の他の投稿に返信してくれた皆さんに感謝します)。
私が見たいくつかの投稿から、作業セットベースのクエリ/トリガーがあることを理解しています (複数の行がインポートされるため)。最終的には、データを親テーブルにインポートするだけでよく、子テーブルには静的な値や親テーブルの値を入力できますが、PK/FK 関係は維持する必要があります。これは、XLS から複数行のデータをインポートするときに最も問題になると思われることです。
親テーブルで挿入が実行されたときに子テーブルに値を挿入するトリガーを設定しました。クエリは正しく実行されますが、複数のデータ行が挿入されたときに FK を PK と一致させることができません。FK には常に、親テーブルに挿入された最後の行の ID があります。他のフォーラムの投稿 (ここおよび他のサイト) からいくつかのアプローチを試しましたが、常にエラーが発生します。
これが私の updatePgVer トリガー コードです。
そして、親テーブルに挿入するために使用されるクエリ:
私が持っている他の唯一のアイデアは、@@IDENTITYが常に一致するように、各行を通過して一度に1つずつインポートするある種のループを作成することです。ただし、私が見た例は、インポートに適用するのが難しいようです。
tsql - TSQLカーソルが最適なオプションまたは唯一のオプションはいつですか?
最近、TSQLでのカーソルの使用についてこの議論があります...
まず第一に、私は議論のチアリーダーではありません。しかし、誰かがカーソルを言うたびに、義務的な「カーソルは邪悪な」というマントラで飛び跳ねるナックルヘッド(または50)が常にいます。SQL-Serverがセットベースの操作用に最適化されていることは知っています。カーソルは本当に邪悪な化身である可能性がありますが、その背後に客観的な考えを置きたい場合は...
これが私の心の行き先です:
カーソルとセット操作の唯一の違いはパフォーマンスの1つですか?
編集:IDのリストに対して単一のバッチを繰り返し実行したり、テーブルフィールドの行に格納された実際のSQLテキストを実行したりするなど、単にパフォーマンスの問題ではないという良いケースがあります。行ごと。
フォローアップ:カーソルのパフォーマンスは常に低下しますか?
- 編集:@Martinは、カーソルがセットベースの操作をかなり劇的に上回っている良いケースを示しています。これは(ある種のOLAP /データウェアハウスのようなソリューションに頼る前に)あまり頻繁に行うようなことではないと思いますが、それでも、それなしでは本当に生きていけないケースのようです。カーソル。
- カーソルが一般的に信じられているよりも競争力があるかもしれないことを示唆するTPCベンチマークへの参照。
- Sql-Server2005以降のカーソルのメモリ使用量の最適化への参照
セットベースの操作よりもカーソルの方が解決に適しているという、考えられる問題はありますか?
- 編集:セットベースの操作では、文字通りストアドプロシージャなどは使用できません(上記の項目1の編集を参照)。
Execute
- 編集:セットベースの操作は、大規模なデータセットを集約する場合、行ごとよりも指数関数的に遅くなります。
- 編集:セットベースの操作では、文字通りストアドプロシージャなどは使用できません(上記の項目1の編集を参照)。
- 人々がカーソルに頼る最も一般的な問題の見方を説明するMSDNの記事(および、より適切に機能するセットベースの手法の説明)。
- Microsoftは、MSDNの2008 Transact SQLリファレンスで(漠然と)「...結果は一度に1行ずつ処理するのが最適な場合があります」と述べていますが、どのような場合を参照しているのかについては例を挙げないでください。に。
ほとんどの場合、さまざまなアプリケーションに大幅なアップグレードを行う場合は、そこから何かが得られる限り、古いコードでカーソルをセットベースの操作に変換することを心がけています。(私は多くの場合、純粋さよりも怠惰になる傾向があります。つまり、壊れていない場合は修正しないでください。)
tsql - ステージングテーブルから複数の関連テーブルにデータを挿入しますか?
AccessからSQLServer2008にデータをインポートするアプリケーションに取り組んでいます。現在、ストアドプロシージャを使用して、レコードごとにデータを個別にインポートしています。データが2つの関連するテーブルに挿入されるため、一括挿入などを使用できません...アカウントテーブルに入力されるフィールド(名、姓など)と3つのフィールドがあります。それぞれがInsuranceテーブルにレコードを持ち、ストアドプロシージャのSCOPE_IDENTITYで選択された自動インクリメントのAccountIDによってAccountテーブルにリンクされます。
アプリケーションからデータベースへのラウンドトリップの数が多いため、パフォーマンスはあまり良くありません。この理由と他のいくつかの理由から、代わりにステージングテーブルを使用して、そこからデータをインポートすることを計画しています。これにアプローチするための私のオプションを読んで、ステージングテーブルのデータに対して同じ挿入ストアドプロシージャを実行するカーソルは理にかなっています。ただし、カーソルは邪悪な化身であり、避ける必要があるようです。
セットベースの操作で、1つのテーブルにデータを挿入し、自動生成されたIDを取得してから、対応するIDを使用して同じレコードのデータを別のテーブルに挿入する方法はありますか?それとも、カーソルはここでの唯一のオプションですか?
sql-server - カーソルは本当に「正しい」選択ですか?
データを処理するときに、手続き型プログラミングが絶対に避けられない場合があります。
現在、いくつかのレガシー コードの最適化に取り組んでいます。カーソル、63 組のIF
/ELSE
ステートメントとBEGIN
/END
などを使用します。カーソルをリバース エンジニアリングして、手続き型のプロセスにしたいと考えていました。今、私はアルゴリズムの解読の最後にいて、 . . . おっと...レコードに対して行われた各選択は、先行するすべてのレコードに対するプロセスの結果に依存するため、手続き型でなければなりません。
だから今、私は引き裂かれています...手続き型コードをSQL Server処理(CLR SP、UDFなど)と混合するための他の選択肢があります。私は仕事に適したツールを使用することを強く信じているので、このために .NET CLR SP を作成することに傾倒しています。ただし、カーソルを少し単純化するだけで、カーソルを保持する方が高速で「簡単」です。
皆さんはどう思いますか?SQL Server 内から .NET モジュールにアクセスできるようになったので、カーソルを使用することはもはや適切でしょうか (私の意見では、最初はおかしな/回避策でした)。