
No.4ベストアンサー
- 回答日時:
あるコンピュータメーカー系ソフトウェア会社に在籍し、DBMSの設計部署に長年在籍していました。
以下の例で説明します。
(1)DELETE FROM 表名 WHERE 列名 IN(値1,値2,値3)
(2)DELETE FROM 表名 WHERE 列名=値1 OR 列名=値2 OR 列名=値3
(3)DELETE FROM 表名 WHERE 列名=値1
DELETE FROM 表名 WHERE 列名=値2
DELETE FROM 表名 WHERE 列名=値3
(3)は構文解析だけでなく、何度もサーバとのやり取りが発生するので、オーバヘッドが多くなります。
(2)はORでつなげた条件が、INと等価であることがDBMSで判断できるか否かで、処理時間がINと同等になるか劣るかになります。
実際にそこまでDBMSで判断できないケースは、少なくありません。
(1)IN条件であることが明らかなので、DBMSから見ればオーバヘッドは少ないです。
ただし、他の方も書いていますが、範囲条件にできるものをIN条件にしているなら、範囲条件にした方が早いです。
2)について。Explainを使う意味がすごく理解できました。先生ありがとうございます♪
DBエンジニアも良いお仕事ですね。
今回は、範囲条件にはできませんが、もっと早くする方法を追求する意識が持てるようになりたいと思いました。
No.5
- 回答日時:
DBサーバがSQLを発行するプログラムと別のマシンかどうかや、RDBMSが何かなどと関係してくるため、この情報だけでははっきりとした解答は得られないと思います。
私の予想ではRDBMS内の計算よりRDBMSへのSQLの発行のほうがコストが高いと思われますので、1の方が高速だと思います。
RDBMSがMySQLやPostgreSQLの場合、EXPLAINを使うことによってWHRER区の効率を調べることができますので活用されてはいかがでしょうか。
No.3
- 回答日時:
WHERE a >= 1 AND a<=10;
のほうが手っ取り早いかと・・・
aに 1.20や2.15 などの小数点も含まれていてそれらを消したくない場合はまた別ですけどね
もしくは、
WHERE a=1 OR a=2 OR ・・・OR a=10;
とかね
どんな機能を実装させようとしてDELETEしてるのかわかりませんが、私の場合は、デリートフラグ のカラム(フィールド)を作っておいて
DELETEさせたい場合はDELETEを使わずに
UPDATE で たとえば、SET del_flg = 1 WHERE a=1;
等にさせておきますね
万が一消してはだめだった レコードだった場合、簡単に復旧できますしね。
管理のためのメンテナンス時と、web上で操作につかう ユーザー名、パスワード を別々にさしておきます
管理者の操作用のユーザー名パスワードにはDELETE権限を持たせる
web上で不特定多数が操作するとき用のユーザー名パスワードは INSERT、UPDATE 、SELECT のみを許可する
もっと細分化してもかまわないとおもいます。
別に設定しておくことで
万が一インジェクションされたときに、まっさらに消されてしまうのを防ぐのと、DELETEって結構ぐちゃぐちゃしてゴミ残ります(表向きではなく、データベースサーバーの中でです
del_flgについては、もっと頑張って考えてみようと思います。ありがとうございます。
全てのテーブルをDEL_FLGありにすれば
web上で不特定多数が使うユーザーをDELETE権限なしにする設定は、レコード数がそれほど増えないシステムな場合シンプルで良さそうですね。
MySQLではテーブル単位のアクセス権は設定できないですし。
No.2
- 回答日時:
構造上は1が速いだろうと予測できるのは#1さんに
同意ですが1をするためにはプログラムでINないの
データを作ることになりますよね?
制約上INは無限にデータをつなげることはできません。
それをプログラムで解析しながら冗長にかくと
かえってオーバーヘッドがおおきいかもしれません。
おそらく人が認識できるほどの速度の差は出ないと
おもいますので、どちらでよい・・・というのが
妥当な回答になります。
INは無限ではなかったのですね。知りませんでした(汗) 今回は10レコードの削除ということで大丈夫ですが気をつけます。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
他のシートの検索
-
構造が異なる二つのテーブルをu...
-
エクセルかワードで家系図を作...
-
インデックスについて
-
カラムとコラムの使い分け
-
UNIONする際、片方テーブルしか...
-
AUTO_INCREMENTに0はダメ?
-
DBの定義のサイズを大きくし過...
-
type date にnullをinsert
-
now()かCURRENT_TIMESTAMPか
-
テーブルの列数を調べたい
-
自動販売機でホットとアイスが...
-
複数カラムに対するLIKE文の最適化
-
MySQL 改行コードを含む文字列...
-
select * での表示が崩れる?
-
MYSQLで全てのカラムから検索す...
-
ROUND関数で、四捨五入ができな...
-
DBエラーの意味
-
SELECT文で、指定カラム以外の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
他のシートの検索
-
BULK INSERT時のNull許容について
-
【Transact-sql】 where条件、i...
-
自分自身のテーブルを参照して更新
-
列を行に表示する方法は?
-
Accessで複数(3以上)...
-
Accessの「IIF」に相当するSQL...
-
mongoDBについて質問です
-
ACCESS SQLのデータ変換。
-
SQLiteで「UPDATE table1 SET c...
-
sqlite3でrowid以外にid必要で...
-
【SQL文】 where (colA & colB)...
-
数百行の複数列を1列にしたい。
-
一部のカラムでdistinctし全て...
-
SELECT文で、指定カラム以外の...
-
UNIONする際、片方テーブルしか...
-
DBの定義のサイズを大きくし過...
-
ホームページを作ろうと思いま...
-
SQLServerでNULLを挿入したいです
おすすめ情報