入庫を発注書と照合して、最初に注文された品目と、入庫によって予約された数を確認する次のクエリがあります。たとえば、10 個のバナナ ミルクセーキを注文すると、その注文書でこれらのミルクセーキを 5 個受け取ったことを示す商品受領書が生成されます。
SELECT t.PONUM, t.ITMNUM, t.ordered,
SUM(t.received) as received,
t.ordered - ISNULL(SUM(t.received),0) as remaining,
SUM(t.orderedcartons) as orderedcartons,
SUM(t.cartonsreceived) as cartonsreceived,
SUM(t.remainingcartons) as remainingcartonsFROM(SELECT pod.PONUM,
pod.ITMNUM, pod.QTY as ordered, ISNULL(grd.QTYRECEIVED, 0) as received,
pod.DELIVERYSIZE as orderedcartons,
ISNULL(grd.DELIVERYSIZERECEIVED, 0) as cartonsreceived,
(pod.DELIVERYSIZE - ISNULL(grd.DELIVERYSIZERECEIVED, 0)) as remainingcartons
FROM TBLPODETAILS pod
LEFT OUTER JOIN TBLGRDETAILS grd
ON pod.PONUM = grd.PONUM and pod.ITMNUM = grd.ITMNUM) t
GROUP BY t.ITMNUM, t.PONUM, t.ordered
ORDER BY t.PONUM
次のデータを返します。
PONUM ITMNUM ordered received remaining orderedcartons cartonsreceived remainingcartons
1 1 5.0000 3.0000 2.0000 5.0000 3.0000 2.0000
次に、上記のクエリから返されたデータに基づいて更新クエリを生成する C# ループがあります。
foreach (DataRow POUpdate in dt.Rows) {...
query += "UPDATE MYTABLE SET REMAININGITEMS=" + remainingQty.ToString()
+ ", REMAININGDELIVERYSIZE=" + remainingBoxes.ToString() + " WHERE ITMNUM="
+ itemNumber + " AND PONUM=" + poNumber + ";";
次に、DB に対して各更新クエリを実行します。これは私のローカル開発マシンでうまく動作します。
ただし、本番サーバーにデプロイすると、最初のクエリで 150,000 を超えるレコードが引き戻されます。
そのため、非常に多くの行をループすると、SQL とアプリがロックされます。それはforeachですか?そのすべてのデータをメモリにロードするのは元の選択ですか? 両方?このクエリを 1 つのクエリにして、C# ループを切り取ることはできますか? もしそうなら、これを達成するための最も効率的な方法は何ですか?