単純なパラメタのコマンドを複数回実行する場合と、
多くのパラメタを使ってコマンドの実行回数を減らす場合で、
処理時間(呼び出してから処理完了まで)に違いはありますか?
具体的には、50項目のレコードが10000程度あるテーブルの
一部のレコード修正(100レコード中の300項目程度)と、
新規レコード10件程度の追加
を行う場合です。
方法Bを思いついたのですが、パラメタが長くなってしまい、呼び出し回数を減らしたメリットが本当にあるのか
疑問に思ったので教えてください。
もちろん、たかだか1回の呼び出し軽減できただけなので、それほど効果は変わらない気もしますが、興味あるので教えてください。
また、ストアドファンクションを定義して呼び出し回数を減らす方法も思いついたので、これもメリットもあるのかが知りたいです。
<方法A>
更新するレコードをDELETEコマンドで削除して、INSERTコマンドで加筆・編集する
<方法B>
INSERT の ON DUPLICATE KEY UPDATE コマンド1回で実行する
<方法C>
方式Aのストアドファンクションを定義しておいて、DELETEコマンド用のパラメタ、INSERTコマンド用のパラメタを与える
No.3ベストアンサー
- 回答日時:
> 修正のあるレコードを削除して、修正後の内容をインサートするほうが素直な気がしました。
いやそれは誤解です
以下試してみてください
create table tbl(id int primary key,val1 varchar(10),val2 int);
insert into tbl values
(1,'aaa',100),
(2,'bbb',200),
(3,'ccc',300);
replace into tbl values(1,'xxx',1000),(4,'yyy',2000);
id=1は書き換えられ、2,3はそのまま、4は追加されるのがわかります
回答ありがとうございます。
>いやそれは誤解です
失礼しました。
replace関数でなく、replace構文ですね。
13.2.8 REPLACE 構文
https://dev.mysql.com/doc/refman/5.6/ja/replace. …
REPLACE は、INSERT とまったく同じように機能します。ただし、テーブル内の古い行に、PRIMARY KEY または UNIQUE インデックスに関して新しい行と同じ値が含まれている場合、その古い行は新しい行が挿入される前に削除されます。
やりたいことそのものズバリの構文があったのですね。
いろんな解説読んでも、
SELECT文:レコード検索
INSERT文:レコード挿入
UPDATE文:レコード更新
DELETE文:レコード削除
の4つの構文を組み合わせたり、パラメタを工夫する記事しか見つからなかったので replace 構文知りませんでした。
>mysqlの場合replaceという書式が用意されています
MySQL以外のDBでは replace 使えない場合もあるようですね。そのため、一般の解説記事にはreplace は記載されていないのですね。
replace構文使えば、
INSERT - ON DUPLICATE KEY UPDATE
の直後の全ての項目について指示は不要ですね。
はじめの疑問の処理速度の差異については相変わらず未解決ですが、
別の意味では、スッキリしました。
No.2
- 回答日時:
すべてのデータを入れ替える前提ならmysqlの場合replaceという書式が用意されています
回答ありがとうございます
replaceコマンド、今調べましたが、
SQL REPLACE関数とは、対象文字列やカラムの中から指定した文字を別の文字に置き換えることができる関数のことです。SQL REPLACE関数の構文は以下の通りです。
SELECT REPLACE(対象文字列・カラム, 指定した文字, 置き換えたい文字);
とあり、今回の
>具体的には、50項目のレコードが10000程度あるテーブルの
> 一部のレコード修正(100レコード中の300項目程度)と、
> 新規レコード10件程度の追加
>を行う場合です。
での適用には無理がありそうな気がします。例えば同じ文言が複数箇所あった場合、修正したいレコード以外の当該文言も修正されてしまう事故が怖い気がします。
それより、修正のあるレコードを削除して、修正後の内容をインサートするほうが素直な気がしました。
No.1
- 回答日時:
> パラメタが長くなってしまい
の定義がわからないですが、方法Bで問題ないでしょう。
回答ありがとうございます。
方法Bで問題ないことはわかっていますが、今回は、処理時間についての質問です。
> パラメタが長くなってしまい
ON DUPLICATE KEY UPDATE
の直後に50行に渡り
id = VALUES(id),
name = VALUES(name),
:
と全ての項目について、指示を出さないといけない点です。
こんなにたくさんの指示を出すと、処理が重くなりはしないのかな、という素朴な疑問です。
単純に書き換えるレコードを削除してから、INSERTコマンドで加筆するほうが2回のコマンドになりますが、この方が早いのでは?
呼び出しが足を引っ張るなら、ストアドファンクションにすれば、もっと早くなるのかしらという疑問です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux cronでシェルスクリプト実行時のkubactlコマンドが機能しない対処法。 2 2022/08/03 18:58
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- UNIX・Linux linuxサーバーのキャッシュをクリアするコマンドを実行したい。 5 2023/01/24 14:52
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Windows 10 ネットワークプリンターにファイルを直接送る方法・コマンドないですか?(´・ω・`) 3 2023/03/13 23:15
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- MySQL UPDATE my_items SET item_name '赤い,甘い,ケーキ' WHERE id 1 2023/01/03 09:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データの二重表示の原因
-
Accessでの排他制御
-
Access 削除クエリが重い
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
accessで検索&入力 データの...
-
数百万件レコードのdelete
-
Access カレントレコードがあり...
-
非連結サブフォームのレコード...
-
C# Windows Forms で、Accessみ...
-
Access 1レコードずつcsvで出力...
-
Access VBA Me.Requery レコー...
-
一部重複しているレコードの削除
-
Accessでのレコードの削除時の...
-
ManagementStudioからのデータ削除
-
レコードロックする方法
-
テーブルのレコード削除ができ...
-
AccessのSQLについて教えてくだ...
-
ACCESSのBookmarkプロパティの...
-
(ACCESS)並び替えをしないで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
2つの項目が重複するレコード...
-
3つ以上のテーブルをUNIONする...
-
数百万件レコードのdelete
-
Access VBA Me.Requery レコー...
-
非連結サブフォームのレコード...
-
Access 削除クエリが重い
-
ACCESSのBookmarkプロパティの...
-
Access 1レコードずつcsvで出力...
-
ManagementStudioからのデータ削除
-
Accessの重複クエリで最小以外...
-
Accessでの排他制御
-
Accessで重複したデータを一件...
-
(ACCESS)並び替えをしないで...
-
フォームからのレコード削除に...
-
SQLServerで同一条件レコードの...
-
Accessでの禁止文字チェック
-
Accessでレコードが更新された...
-
テーブルのレコード削除ができ...
おすすめ情報