いったい何が原因なのでしょうか。 0182NAME IS NULL2016/11/28(月) 14:34:48.86ID:??? 解決しました。
ALTER DATABASE データベース名 SET ARITHABORT ON で算術アボートを有効にしてやったら、クエリエディタと同じになりました。 0183NAME IS NULL2016/11/28(月) 14:56:49.87ID:??? ちょっと違ってました。
ALTER DATABASE データベース名 SET ARITHABORT ON することで、クエリエディタと同じ速度になりましたが、 ADO.NET のときと同じ速度に、つまりは遅い方に揃ってしまいました。
ALTER DATABASE データベース名 SET ARITHABORT OFF に戻したうえで、SqlCommand を投げるごとに 先に SET ARITHABORT OFF しておくと、早いクエリエディタと同じ速度になりました。
ゼロ割算の対策はしてあるつもりだし、むしろ NULL で進むよりエラーにしてもらったほうが嬉しいので これはこれでいいのですが、全ての SqlCommand に埋め込まないといけないのか・・・ 0184NAME IS NULL2016/11/28(月) 15:26:31.97ID:???>>181-182 テーブル変数とか使ってる? 実テーブルからだけのselectでも発生してる? 0185NAME IS NULL2016/11/28(月) 15:54:51.04ID:??? テーブル変数を使ってたんですが、作業表(#〜)にしても一緒でした。 中身一緒かもしれませんが。 0186NAME IS NULL2016/11/28(月) 16:07:15.48ID:???>>185 テーブル変数つかうと、行数を正しく判定できないで遅いプラン作る事があるってのは聞いたことある selectしてるとこにRECOMPILEヒント入れるとマシになるかも 当然リコンパイル分のパフォーマンス劣化はあるけど、遅いプランとどっちがマシか比べて 0187NAME IS NULL2016/11/28(月) 16:19:19.41ID:??? ストアドの中のselect〜の末尾に option(RECOMPILE) 追加するんですよね? 試してみましたが、全く効果なく、事前の SET ARITHABORT ON を外すと元通り劇遅になりました。
ConnectionStringで SET ARITHABORT ON を指定できたらいいのですが。。。 0188NAME IS NULL2016/11/28(月) 16:38:59.67ID:??? ARITHABORT OFFで遅い実行計画つくることがあるとはMSDNにも書かれてるけど 実際にそれが原因で問題のある実行計画作られたのは見た事ないなぁ executeにWITH RECOMPILEつけても同じ? これでダメなら、自分で適切なヒント付けてやればいいんだけど そもそも実行計画の問題じゃない気もしなくはないな 0189NAME IS NULL2016/11/28(月) 17:00:05.82ID:??? テーブルに単価のフィールドを持ってなくて、そのかわりに金額÷数量を単価とみなすビューを作ってあるんです 金額/nullif(数量,0) as 単価
それ利用してるもんだから、ゼロ割算の関係だとしたらビンゴなんですよ。 0190NAME IS NULL2016/11/28(月) 17:12:45.91ID:??? 以降は、君のブログで。 0191NAME IS NULL2016/11/28(月) 17:20:38.36ID:??? SET NOCOUNT ON してる? ほんとにSET ARITHABORT の問題なら、ストアドの中でSET ARITHABORT ON すれば良い 0192NAME IS NULL2016/11/28(月) 17:30:39.39ID:???>>191 SET NOCOUNT ON は基本やってます。 ストアドの中で SET ARITHABORT ON 明示してもいいんですか。
とりあえず今回気が付いたもの以外にも、気が付かないだけで潜在的に遅いものがありそうな気がしてまして かつ、ストアドでなくソースの中でSQL吐いてるのもあって、 CreateCommand する直後で全て SET ARITHABORT ON したほうが良さそうな感じ。
それはともかく、単純にwhere old_item1 <> new_item1 or old_item2 <> new_item2 or ... ってやるのは駄目なのか? 0241NAME IS NULL2017/02/22(水) 08:27:45.48ID:??? binary_checksumがどうやって計算してるかしらんが、たとえば単純なsumだったら (1,0)と(0,1)が同じ値になるのは当然だわな 素直に全項目比較する方がいいんじゃね
どういう状況かわからんが、本来はホストアプリ側で更新する(UPDATE発行する)かどうか判断するべきだと思うけどな 02422392017/02/22(水) 10:07:47.80ID:??? ありがとうございます。 仕方ないので where ・・・ and (binary_checksum(項目1)<>binary_checksum(@項目1) or binary_checksum(項目2)<>binary_checksum(@項目2) ・・・) という風にやりました。 HashBytesにしなかった理由は、項目1つならコンフリクトの可能性が低いと判断したためです。 (演算の軽いほうで) 0243NAME IS NULL2017/02/22(水) 21:31:00.62ID:??? SQLServerを使用したいと思っているのですが、全くの無知なので教えて頂きたいです。