![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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で質問しましょう!
似たような質問が見つかりました
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- 英語 this is where it comes from. という文をよく見るのですが、文法的に正しい 4 2022/07/15 17:25
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- 英語 関係副詞 where 4 2022/03/27 13:49
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- 英語 How were researchers able to identify the place wh 1 2023/08/09 19:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
BULK INSERT時のNull許容について
-
Accessの「IIF」に相当するSQL...
-
【Transact-sql】 where条件、i...
-
GREATESTで NULLをスルーする方...
-
SELECT文で、指定カラム以外の...
-
MYSQLで全てのカラムから検索す...
-
一部のカラムでdistinctし全て...
-
DBの定義のサイズを大きくし過...
-
mysqlでdate型のカラムに今日か...
-
mysqlで50音順にorder byしたい。
-
JDBCドライバがない?
-
SQLServerでNULLを挿入したいです
-
正規表現で置換
-
スペースによる絞り込み検索をS...
-
whereで全てを検索する方法
-
SQLでカラムを追加し、条件に合...
-
UNIONする際、片方テーブルしか...
-
'PRIMARY KEY'と'UNIQUE()'の違...
-
now()かCURRENT_TIMESTAMPか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
【Transact-sql】 where条件、i...
-
BULK INSERT時のNull許容について
-
Accessの「IIF」に相当するSQL...
-
WHERE句で結合。INNER JOINとの...
-
SQLiteで「UPDATE table1 SET c...
-
WHERE句の速度について
-
Accessで複数(3以上)...
-
ADOによる検索条件の書き方(ア...
-
create tableのフィールド名
-
列を行に表示する方法は?
-
Oracleの制約について
-
PLSQLのTO_CHARについて
-
SQLの書き方
-
EXCEL VBA
-
CSV fileを指定してSQLへimport
-
mongoDBについて質問です
-
自分自身のテーブルを参照して更新
-
【SQL文】 where (colA & colB)...
-
DBの定義のサイズを大きくし過...
おすすめ情報