X



SQLなら俺に訊け [無断転載禁止]©2ch.net
0001デフォルトの名無しさん
垢版 |
2017/07/14(金) 07:40:53.63ID:HFjsarQi
さあ
0111デフォルトの名無しさん
垢版 |
2021/01/18(月) 11:57:48.25ID:JT9EgKXH
たいていのアプリ・サービスは、サーバー/クライアント方式

Linux のシステム内で動いているものは、サーバーで、
それに、Windows などのパソコンからアクセスするものは、クライアント

例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
Windows パソコンに入れて、それでサーバーにアクセスする

MySQL 用のクライアントも探してみれば?
0112デフォルトの名無しさん
垢版 |
2021/01/18(月) 13:17:29.49ID:+C2vxlND
>>111
うーんと、Xreaなどのレンタルサーバーを借りると予めMySQLがインストール
されていて、確か、管理画面などからMySQLのデータベースの中に入っている
データを、普通のパソコンのブラウザからリモートで見られるようになっている。
それは、なんという名前のCGIを使っているか教えて欲しい。
0113111
垢版 |
2021/01/18(月) 13:48:11.67ID:JT9EgKXH
例えば、AWS なら、AWS Command Line Interface(AWS CLI)みたいなものを、
自分のWindows パソコンに入れて、それでサーバーにアクセスする

たぶん、Xrea, SAKURA でも、
Xrea CLI, SAKURA CLI みたいな同様のツールがあるのじゃないの?

そのサービス事業者に聞いてみれば?
0115デフォルトの名無しさん
垢版 |
2021/01/19(火) 00:28:07.43ID:hiZmhE+d
>>114
なるほど。さんくす。
ついでに、Rubyでユーザー登録や認証をした結果をMySQLの中に
データとして貯めるようなサーバーサイドのCGIのライブラリ
みたいなものは有る?
0116デフォルトの名無しさん
垢版 |
2021/01/19(火) 00:45:19.71ID:sryyIgAN
>>115
Rubyなんぞ知らんし、何をやりたいのかもよくわからんから、Rubyスレで訊け
認証用のフレームワークに何を選ぶかって話で、SQLは直接関係ない
0117デフォルトの名無しさん
垢版 |
2021/01/19(火) 00:47:54.79ID:hiZmhE+d
Ruby on Rails の devise という「gem」が、パスワードを入力したり
メールを送って登録するようなよくある認証パターンをやってくれて、
MySQLも使ってるそうだけど、Ruby on Rails使ったことないし、
登録した MySQL のデータを上手く扱えるか不安。
0118デフォルトの名無しさん
垢版 |
2021/02/08(月) 13:32:01.05ID:0mrKmB9v
テーブル名にバインド変数使う事って出来ないの?
"CREATE TABLE IF NOT EXISTS ? (...);"
といった感じでテーブル名は後付けでバインドしたいんだけどsqlite3_prepare_v2が失敗する
0121デフォルトの名無しさん
垢版 |
2021/02/09(火) 22:59:40.19ID:62IhLHy8
質問スレ過疎ってたからこっちか


専ブラBB2Cでワッチョイを正規表現でNGしたいんだけどうまくいかない
第2オクテット(仮にXXとして)だけ固定でこれじゃダメだろうか
.*XX-.*
0122デフォルトの名無しさん
垢版 |
2021/02/10(水) 14:33:47.60ID:n+lQ6bEt
sqlite3_blob_openで得た列ハンドルをsqlite3_reopen_blobで使いまわすとクエリ投げるより5倍近く高速だと判明したが
nullセルやrowが見つからないとハンドル失効しちゃってopenし直さないといけないんだな
open自体はそれなりに重いから失効が多いとパフォーマンス上の利点はほとんど無しか
0123デフォルトの名無しさん
垢版 |
2021/02/13(土) 18:50:09.35ID:k+FkZinH
データベース板を忘れないでください
0124デフォルトの名無しさん
垢版 |
2021/05/21(金) 10:11:21.48ID:bGYKMPx3
2万レコードのテーブルの全行をそれぞれupdateで値を変更したいんだが、これってforでSELECTを2万回繰り返したりしたらまずいもんなの?

レンタルサーバー使ってるんだが
0127デフォルトの名無しさん
垢版 |
2021/07/10(土) 13:35:16.95ID:0S1tAkGn
一個前のidからカラム取ってくることはできますか?
0128デフォルトの名無しさん
垢版 |
2021/07/10(土) 14:09:51.57ID:1/iYafxq
前とか後とかいう概念が、、、というのは置いといて
自分のidより小さいidの最大が該当のidだろ
あとはサブクエリなりwindow関数なりでとってこい
0129デフォルトの名無しさん
垢版 |
2021/07/13(火) 23:04:11.03ID:oBbbWw6W
出来たわ!ありがとう
0131デフォルトの名無しさん
垢版 |
2021/10/15(金) 22:03:31.28ID:atwiHSUT
レコードのデータが
AAA  1
AAA 2
BBB 3
BBB 4
BBB 5
CCC 6
CCC 7
AAA 8
AAA 9
BBB 10
BBB 11
ってなってるデータから
AAA 1
BBB 3
CCC 6
AAA 8
BBB 10
みたいなデータに変換したいのですがやる方法ってありますか
0133デフォルトの名無しさん
垢版 |
2021/10/16(土) 08:56:30.04ID:vbkw9O81
どういうルールで変換するのか書かないで丸投げされてもな。
というかそれを自分で考えないからわかんないんだろう。
0136デフォルトの名無しさん
垢版 |
2021/10/17(日) 10:18:00.58ID:O7pSNP76
すまん 俺が悪かった。
みんなありがとう


例えば、下記の時系列データがあったときに、nameごとにまとめたものを別のテーブルに入れたいんだよね。
nameがはまとめたときに、IDがもっとも若いものを格納したい。
SQLで一発取れたりするかな?
ロジックを考える必要ある?

ID(PK)  name value
1 AAA 1
2 AAA 3
3 BBB 5
4 BBB 2
5 BBB 4
6 CCC 1
7 CCC 3
8 AAA 1
9 AAA 2
10 CCC 3
11 CCC 4



ID(PK)  name value
1 AAA 1
3 BBB 5
6 CCC 1
8 AAA 1
10 CCC 3
0137デフォルトの名無しさん
垢版 |
2021/10/17(日) 10:20:12.93ID:O7pSNP76
>>135
がやってくれたことがまさにやりたいことだわ
くわしくありがと
0138デフォルトの名無しさん
垢版 |
2021/10/23(土) 10:22:47.90ID:D86LbS/L
時刻昇順に並んでるデータでstatusが1〜4を一塊として
縦横変換したテーブルが欲しいんですけどSQLだけじゃムリですかね。
欲しいテーブルにあるrep_idは元のテーブルにない(生成したい)です。

元のテーブル
time    status
10/1 0:01  1
10/1 1:34  2
10/1 2:00  4
10/1 22:00 2
10/1 23:32 3
10/2 1:02  4

欲しいテーブル
rep_id| status_1  | status_2   | status_3  | status_4
-----+----------+-----------+----------+--------
1   |10/1 0:01  | 10/1 1:34  | null     | 10/1 2:00
2   |null     | 10/1 23:00 | 10/1 23:32 | 10/2 1:02
0139デフォルトの名無しさん
垢版 |
2021/10/23(土) 10:32:24.95ID:D86LbS/L
時刻昇順に並んでるデータでstatusが1〜4を一塊として
縦横変換したテーブルが欲しいんですけどSQLだけじゃムリですかね。
欲しいテーブルにあるrep_idは元のテーブルにない(生成したい)です。

元のテーブル
time    status
10/1 0:01  1
10/1 1:34  2
10/1 2:00  4
10/1 22:00 2
10/1 23:32 3
10/2 1:02  4
10/2 4:05  4
10/3 18:30 2
10/3 20:34 2

欲しいテーブル
rep_id| status_1  | status_2   | status_3  | status_4
-----+----------+-----------+----------+--------
1   |10/1 0:01  | 10/1 1:34  | null     | 10/1 2:00
2   |null     | 10/1 23:00 | 10/1 23:32 | 10/2 1:02
3   |null     | null     | null     | 10/2 4:05
4   |null     | 10/3 18:30 | null     | null
5   |null     | 10/3 20:34 | null     | null
0140デフォルトの名無しさん
垢版 |
2021/10/24(日) 00:25:59.14ID:4lHZz/Ub
SQLだけでやってみた
WITH
ブレークチェック AS (
SELECT
CASE WHEN LAG(status,1,NULL) OVER (ORDER BY [time]) < status
THEN 0
ELSE 1
END AS st,
[time]
FROM 元のテーブル),
開始終了 AS (
SELECT
[time],
(SELECT MIN([time]) FROM ブレークチェック WHERE st = 1 AND [time] > t.[time]) AS end_time
FROM ブレークチェック t
WHERE st = 1),
t1 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 1),
t2 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 2),
t3 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 3),
t4 AS (SELECT [time] FROM 元のテーブル WHERE [status] = 4)
SELECT ROW_NUMBER() OVER (ORDER BY 開始終了.[time]) AS rep_id,
t1.[time] AS status_1,
t2.[time] AS status_2,
t3.[time] AS status_3,
t4.[time] AS status_4
FROM 開始終了
LEFT JOIN t1 ON t1.[time] >= 開始終了.[time] AND (t1.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t2 ON t2.[time] >= 開始終了.[time] AND (t2.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t3 ON t3.[time] >= 開始終了.[time] AND (t3.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
LEFT JOIN t4 ON t4.[time] >= 開始終了.[time] AND (t4.[time] < 開始終了.[end_time] OR 開始終了.end_time IS NULL)
素直にループ回すほうがいいな
0141デフォルトの名無しさん
垢版 |
2021/10/24(日) 07:39:02.37ID:djVQHxKk
>>140
ありがとうございます。SQLだけでも書けるんですね
足りないstatusを補完できないかとか集計キーを作ってからとか当初の目的と外れたところで発狂してました
0142デフォルトの名無しさん
垢版 |
2021/11/06(土) 13:34:50.16ID:ABCltTaS
検索やら削除、CRUDをしたあとに得られるデータの命名に
rowsとかitems、個々はrowやitem
と考えています。
さらに個々rowにはdeleteやupdateのメソッドが使えるよう処理しています
つまり純粋なデータというよりインスタンス化されています
ここで疑問が。
rowという命名がしっくりこない気がします
row.column名やらrow.delete()とかで使う分にはrowで良いと思いますが
rowオブジェクトのクラス名をRowにするのはぴんとこないのです
何かいい命名案はないでしょうか
もうItemでいいかなとも思ってます
0143デフォルトの名無しさん
垢版 |
2021/11/06(土) 19:03:36.97ID:zfMx2fqR
Row/Columnは行/列だから表(Table)に対しての名前はフィットしていると思うがな。
気に入らなければRecord/Flieldではどうかな?
0144デフォルトの名無しさん
垢版 |
2021/11/07(日) 12:35:47.69ID:X+EdCY7G
ありがとうございます >>143
一括置換しても問題なくいつでも変えられそうなのでとりあえずはRowにしときます
0145デフォルトの名無しさん
垢版 |
2021/11/14(日) 11:47:27.97ID:wWg1lz8i
日本全国民テーブルから
年収960万円以下の世帯で、
かつ
18才未満の子供の数。

を抽出するSQLを書いて下さい
0146デフォルトの名無しさん
垢版 |
2021/11/14(日) 12:12:19.12ID:DPFsPWqC
>>145
日本人達テーブルには

マイナンバー、世帯主マイナンバー、生年月日、徴収税額

があるものとします。
0147デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:47:45.91ID:E00roTgy
電通もしくはぱーそるの人か
0149デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:16:56.72ID:mFG9NQD5
>>142
Ruby on Rails のO/R マッパーでは、
命名規約で決まっているから、row みたいな抽象的な名前にならない

テーブル名が複数形のmy_books(snake case)なら、
各行は、単数型のmy_book を使えばよい

クラス名は、MyBooks(Pascal, upper camel)
ファイル名は、my_book.rb
0150デフォルトの名無しさん
垢版 |
2021/11/14(日) 16:50:43.91ID:tkHjD9h1
便通はfirewallで5ch禁止してるからな
自宅から業務外で5chに質問描いてたらクビ
0151デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:15:00.80ID:zZUF+qfu
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒
0152デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:15:06.69ID:zZUF+qfu
selectはそこそこ速いのに(30秒くらいで処理終わる) updateにすると遅くなる(10分以上)要因って何が怪しいかわかる?
抽出条件は全く一緒
0154デフォルトの名無しさん
垢版 |
2021/11/25(木) 21:42:40.77ID:rnpiht7q
selectとupdateで経過時間を比較してもあんまり意味ないよ
抽出条件は同じでもupdateは抽出後に1件1件更新処理が必要なんだから
件数が多ければそのくらいの差になっても何も不思議じゃない
0155デフォルトの名無しさん
垢版 |
2021/12/24(金) 16:39:20.24ID:unjC7EWw
複数のカラムのどれかに該当文字を含む行を知りたいが、
どのカラムだったかで区別したい時に、一発でやる方法ってある?
具体的には以下(2発)を一発にしたい。

SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';

例えば、「どのORに当たったか」を教えてくれるスカラー関数 hitplace() があったとすると、

SELECT hitplace(),target FROM sometable WHERE col0 MATCH 'str' OR col1 MATCH 'str';

に出来るのだけど。
環境はPHP+SQLite。
出力は配列の配列、 [[col0に当たった行],[col1に当たった行]] の形式で、重複はなし。
この形式にサクッと変換出来るのなら、読み出した形式は上記とは違っても可。
0157デフォルトの名無しさん
垢版 |
2021/12/24(金) 19:31:42.64ID:unjC7EWw
お早い回答ありがとう。
もっと色々試すが取り急ぎ。


新案1:
SELECT CASE WHEN col0 LIKE 'str' THEN 0 WHEN col1 LIKE 'str' THEN 1 ELSE -1 END AS col,target FROM sometable WHERE col>=0;
explainでは32、他だと文法エラーらしいがSQLiteだと通る。(参考 https://rainbow-engine.com/sql-howto-caseresult-where/)
explain query plan では
0|0|0|SCAN TABLE tags_bulk VIRTUAL TABLE INDEX 0:

新案2:
SELECT col,target FROM (SELECT CASE WHEN col0 LIKE 'str' THEN 0 WHEN col1 LIKE 'str' THEN 1 ELSE -1 END AS col,* FROM sometable) WHERE col>=0;
他ではこう書けと言われているもの。
explainでは32で、見た目中身も同じ。explain query plan も全く同じ。
0158デフォルトの名無しさん
垢版 |
2021/12/24(金) 19:32:06.67ID:unjC7EWw
元:
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';
explainでは同じく32だが、見た目は違う。が、読み方が分からない。
explain query planでは以下。見た目通り2周している。
1|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)


MATCHはCASEの中では使えないらしくLIKEにしている。
(Error: unable to use function MATCH in the requested contextと出る。)
MATCHだとインデックスが使える分速いはずだが2周する分遅くなるのでどうなるか。

DBやアプリ構造の改善案は今のところ思いつかない。(変更は可能)
カラムはそれぞれ別の管理なので、先に合わせる事は出来ない。
0159デフォルトの名無しさん
垢版 |
2021/12/24(金) 21:34:31.41ID:unjC7EWw
新案3: UNION ALL
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION ALL SELECT 1,target FROM sometable WHERE col1 MATCH 'str' AND col0 NOT MATCH 'str';
元はUNIONにB-TREEが必要でこの分無駄だった。
explainは23と軽くなった。explain query plan は以下。
1|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)
単発で別々にクエリすればUNION ALL 分も取れるが、単に追加してるだけなのでPHP側で結合するよりは速いはず。


今のところこの辺か。他に何かあればよろしく。
とりあえず実装して試すが、差が出るほどDBの中身が埋まるまでにはだいぶかかるとは思う。
0160デフォルトの名無しさん
垢版 |
2021/12/24(金) 21:37:57.02ID:cMhJNtck
>>157
その案はどちらもテーブルスキャンになってインデックス使わない
SELECT句のCASE式とは別にWHERE句に本来の条件を書く

DB構造の話はカラムとして持つべきデータじゃなくて
子テーブルの行として持つべきデータかと思ったんだけど
全文検索でいずれかのカラムに検索キーワードが含まれてる行を
どのカラムかという情報も含めて抽出する用途なんであれば
そのままでいいんじゃないかと思う
0161デフォルトの名無しさん
垢版 |
2021/12/24(金) 22:28:50.21ID:unjC7EWw
>>160
> その案はどちらもテーブルスキャンになってインデックス使わない
そうだが、今回はこれで仕様的にも問題ない。


俺が勘違いしてたのもあって言葉が混乱しているが、
SQLiteのFTSは全文検索仕様で、通常のインデックスは作成出来ない。
FTSで「インデックス」と言われてるのは全文検索用のキーワードインデックスで、
つまりMATCHがLIKEに比べて糞速いだけで、常に全row検索する仕様のようだ。
https://sqlite.org/fts3.html
(俺がFTSの「インデックス」をここでもそのままインデックスと表記したのが不味かった。
FTS用のテーブルでは通常のインデックスでの単rowからの検索は出来ない。
《rowidだけは使えるらしいが、使っても explain query plan では scan と表示された》)


> 子テーブルの行として持つべきデータかと思ったんだけど
あーなるほど、勘がいいね。
実は元々そういう構造になっていたのだが、
下部構造のサマリを作ってしまった方が楽だからそうしようとしていて、
col0は上部から与える名前、col1は下部のそれぞれの中身の寄せ集めになってる。
だからcol0を下部構造の各行のcol1相当部分に対して混ぜ込めば、下部構造で一発クエリ出来る。
そして元々そうしていたのだが、他の都合上、管理が面倒なので変更しようとしているところ。
しかしよく分かったね。まあ妙な事をしてるからか?


まあとにかくありがとう。
今回は下部構造のサマリなので、常に全文検索で問題ない。
言葉が混乱しててごめん。
0162デフォルトの名無しさん
垢版 |
2021/12/25(土) 19:58:56.64ID:GPUeNtJx
NOT MATCH が使えない。(Error: unable to use function MATCH in the requested context)
ただし動的エラーで、2つ目のクエリでcol1にMATCHの後、col0にNOT MATCHのチェックで落ちるようだ。
CASEの中でも使えないし、やはりMATCHはインデックスのようだ。
ところでMATCH NOTは使える。

新案4: MATCH NOT
SELECT 0,target FROM sometable WHERE col0 MATCH 'str' UNION ALL SELECT 1,target FROM sometable WHERE col1 MATCH 'str -col0:str';
これでexplainは20、explain query plan は以下。
1|0|0|SCAN TABLE sometabke VIRTUAL TABLE INDEX 9:
2|0|0|SCAN TABLE sometable VIRTUAL TABLE INDEX 11:
0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)

当面はこの新案4で行く予定。
0164デフォルトの名無しさん
垢版 |
2022/05/28(土) 08:36:34.97ID:2HB62XT0
カーソルって何のために使うの?
0165デフォルトの名無しさん
垢版 |
2022/05/28(土) 11:06:08.08ID:81XaDMLN
iteration
0166デフォルトの名無しさん
垢版 |
2022/05/28(土) 12:02:17.61ID:WzAPHv6Z
>>164
クライアント側に結果セットを全部抱えなくてもいいのと、クエリが全部終わらなくても出てきたレコードから順に
処理を進められるんで、主に対象のレコードが多いバッチ処理なんかで使う。
0167デフォルトの名無しさん
垢版 |
2022/05/28(土) 16:19:02.25ID:63kkWN4T
SQLでDECLARE CURSORと書くサーバーサイドのカーソルと
DBドライバーのAPIが提供するクライアントサイドのカーソルは別のもの

前者はSQLで1行単位の処理をしたい場合に使うものだけどよほど特殊な事情がない限りは使わない

後者はクライアントがクエリの結果セットを塊単位でフェッチするのに使うもので呼び名が違うこともあるが一般的に使われてる

どちらも結果セット内の次の読み込み位置を指し示す抽象オブジェクトとしての役割は同じ
0168デフォルトの名無しさん
垢版 |
2022/06/07(火) 20:12:44.49ID:SiB5OW5s
車テーブルがあって
車両番号 走行日 走行距離(出発) 走行距離(到着)  運転手
というカラムがあります。

各車両の現在の走行距離と、今運転手が乗っていれば運転手名が欲しいです。
乗っているという判断は
走行距離(出発)が入ってるけど到着は入ってない、という事になってます。

これってMAX関数で現在の走行距離とるクエリと、運転手データとるクエリとでJOINするしかないですよね?
0170デフォルトの名無しさん
垢版 |
2022/06/08(水) 02:38:50.06ID:m+BIRTG0
>>168
普通にCASEで行けそうだけど

現在の走行距離とは何?
運転手が乗ってなければどうしたいの?
0171デフォルトの名無しさん
垢版 |
2022/06/08(水) 04:53:57.00ID:8AxfQ9fg
GROUP BYの集計項目以外のカラムの値(運転手等)をサブクエリ使わずに一発でできるかどうかという質問かと思ったが
運転手を表示する場合としない場合の分岐方法の話ならCASE式だね
0172168
垢版 |
2022/06/08(水) 05:07:53.00ID:reQXGMu0
>>171
そういう意図でした!
caseでもう一度試行錯誤してみます!
0173168
垢版 |
2022/06/08(水) 05:13:05.52ID:reQXGMu0
>>170
現在の運転手がいなかったらnullにしたいです。
0174168
垢版 |
2022/06/08(水) 19:01:35.68ID:o/KS6P14
>>168
解決しました!ありがとうございます!
0175デフォルトの名無しさん
垢版 |
2022/06/14(火) 14:33:53.86ID:eTPeyH+k
SQL Serverで質問です。

テーブル1
テーブル2
テーブル3
テーブル4

とテーブルはどんどん増えます。

各テーブルにはIDという数値型のフィールドがあるのですが、
テーブル名とIDの最大値の一覧表にしたいです。

INFORMATION_SCHEMAを使ってテーブル名の一覧までは出せたのですが、
それらの各IDの最大値を産出するのはどう書けばいいのでしょうか?
0176デフォルトの名無しさん
垢版 |
2022/06/14(火) 15:30:50.28ID:EXjYCut5
>>175
identity columnなら
SELECT IDENT_CURRENT (‘table_name’)かsys.identity_columnsのlast_value
違うなら
SELECT MAX(ID) FROM table_name
0177デフォルトの名無しさん
垢版 |
2022/06/14(火) 16:44:05.01ID:eTPeyH+k
>>176 ありがとうございます。

しかしながら

テーブル名 IDの最大値
テーブル1 6
テーブル2 1014
テーブル3 1990
テーブル4 74
テーブル5 1861
テーブル6 136

という感じに表示されてほしいです
0178デフォルトの名無しさん
垢版 |
2022/06/15(水) 20:45:45.59ID:W3daPLoz
一つのテーブルに対して、複数のクエリ(参照、更新)が同時に投げられても、テーブルロックされない限り並行して動くものなの?
0179デフォルトの名無しさん
垢版 |
2022/06/17(金) 01:53:08.02ID:qX3KJPna
>>178
ロックはテーブルロックだけじゃないし
同時実行できるかはハードやDBMSの機能によるんだが
まあ基本的には複数のコネクションのクエリは並列して動くと考えていいんじゃね
0180デフォルトの名無しさん
垢版 |
2022/06/22(水) 21:18:18.43ID:JRkIVgOU
>>177
それなら統計情報を検索すればいい話
0181デフォルトの名無しさん
垢版 |
2022/06/29(水) 17:50:51.99ID:EbiKHqB9
全く同じクエリの処理してるのに、時間帯によって波があるのって何が原因かな?
夜中は10秒、朝9時くらいは1時間とかザラにある
しかも、毎日波がある
こんなに気まぐれなの?
0186デフォルトの名無しさん
垢版 |
2022/06/29(水) 21:18:34.19ID:zCehF1Jn
マシンのメモリなどの、何かのリソースが少ないのかも

例えばメモリが少ないと、1クリックしてから処理されるまで、1分掛かる。
遅すぎて何もできない
0187デフォルトの名無しさん
垢版 |
2022/06/30(木) 16:46:00.43ID:4XQ6AH+7
バラバラな日付が入っているテーブルから、
特定日以前3日間のレコードを取るSQL教えてください

hogeテーブル
id,date
5,2022-06-30
4,2022-06-19
3,2021-12-24
2,2021-06-03
1,2021-01-02

ここから2022-06-19以前の3日間のレコード
2022-06-19
2021-12-24
2021-06-03
を取りたいです
0188デフォルトの名無しさん
垢版 |
2022/06/30(木) 17:49:50.05ID:1+oYjPxt
その日付より小さくて、その日付ー3日より大きいっていうwhere条件書くだけだと思うが

日付の扱いはDBMSによって差が大きいからこれ以上はちゃんと環境書け
0189デフォルトの名無しさん
垢版 |
2022/06/30(木) 17:56:20.31ID:eK6suSY8
>>187
where date <= ‘2022-06-19’
order by date desc
limit 3;

上から3行取る方法はDBMSによって違うのでマニュアルを読んで
0190デフォルトの名無しさん
垢版 |
2022/06/30(木) 18:54:13.55ID:6sehYChL
>>189
ソートしろとは言ってないぞ
0192デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:18:37.20ID:1+oYjPxt
ああ、三日じゃなくて3件分のデータが欲しいのか
日付にダブりがないなら>>189さんの方法で
ダブりがあるならdistinctなりgroup byなりしてからだな

>>190
ソートしないでできるならぜひその方法を教えてくれ
0193デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:29:12.21ID:6sehYChL
>>192
ソートする必要がどこにあるのか?
0194デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:31:30.23ID:6sehYChL
3日が3レコードという意味なのかどうかからわからない。
0196デフォルトの名無しさん
垢版 |
2022/06/30(木) 22:57:01.80ID:1+oYjPxt
>>195
なるほど。件数がゼロ件になるやつの考慮がいるけど、いけるのはいけそうだな
SELECT * FROM hoge T WHERE
 (SELECT count(*) FROM hoge
  WHERE hoge.[date] >t.date AND hoge.[date]<='2022-06-19'
 ) < 3 AND t.[date]<='2022-06-19'
こんな感じか
これならオフセット取れないとかwindow関数使えないDBとかでも動くな
0197デフォルトの名無しさん
垢版 |
2022/06/30(木) 23:12:15.50ID:y+cu0wpZ
>>190
ソートしろと言われているのにソートしないのは問題だが逆に
ソートしろと言われてないのにソートするのは構わんだろ
0198デフォルトの名無しさん
垢版 |
2022/07/01(金) 00:36:44.48ID:oYJ8x66X
>>197
無駄なソートはRDBMSによっては致命的な性能問題を引き起こす。
0199デフォルトの名無しさん
垢版 |
2022/07/01(金) 03:40:55.11ID:42pyAc9U
>>198
「無駄な」ソートはな
order by 書けば絶対ソートするとでも思ってるんだろうか
つかおまえソートしない方法提示できてないだろ

テーブルスキャン何回もやるぐらいならソート1回のほうがましなことも多いぞ
まあなんにせよインデックス構成とオプティマイザ次第だけどな
0200デフォルトの名無しさん
垢版 |
2022/07/01(金) 09:55:27.56ID:g3tdjjPX
TOP/LIMIT/FETCH FIRST + ORDER BY使ったtop-Nクエリが
相関サブクエリ使ったtop-Nクエリより遅くなるようなメジャーなDBMSがあるの?
0201デフォルトの名無しさん
垢版 |
2022/07/02(土) 00:59:29.77ID:1zpQKBp2
構文の話をし始めるやつはヤバい
0203デフォルトの名無しさん
垢版 |
2022/07/02(土) 19:31:42.58ID:1zpQKBp2
内部の処理の説明をSQLの構文で説明するのは、知識がなさすぎると思うぞ。

少なくとも業務システムでは嫌われる。
0204デフォルトの名無しさん
垢版 |
2022/07/02(土) 20:23:17.28ID:MgQFVCuv
構文の話してるヤバい奴ってどれ?

というか、こういうどこに向かって話してるのかわからないようなのもなんかヤバい。
0206デフォルトの名無しさん
垢版 |
2022/07/03(日) 12:56:59.34ID:UY7Pdi/e
つかDB板の連中って何でそれが重い処理なのかまるで理解してないよね
しかも呼び出し側含めた全体最適化なんてする気もないようだし、
あいつらはSQLを手打ちでもしてるのだろうか?
0208デフォルトの名無しさん
垢版 |
2022/07/03(日) 22:24:10.66ID:UY7Pdi/e
インデックスを張ってる状態での189は間違いなく軽い
DB屋はDBで済ませる傾向があるとは聞くし、
クエリプランナで最高に最適化されてリングバッファ的に動くのなら196も確かに軽いが、
そうならない場合は糞重い

俺はそこまでDBのことは知らないので、
189が第一選択肢で、速度の問題があればインデックスを張る
これで問題がある場合は、自前でカーソルをとってリングバッファを実装する

DB屋なら196がそれぞれのDBで軽いか重いか把握した状態で使うのだとは思う
ただそれは俺らプログラマとはだいぶ視点が違うと感じた
0209デフォルトの名無しさん
垢版 |
2022/07/03(日) 23:34:25.47ID:fr0a/itN
ソートの話は相関サブクエリを使えという話じゃなく
指定日以前の任意の3レコードなのか(ソート無し)
指定日以前の直近の3レコードなのか(ソート有り)
という違いを指摘したかったんでしょ
0210デフォルトの名無しさん
垢版 |
2022/07/04(月) 01:22:49.55ID:7pHsiooe
それもあるとは思ったが、187だとほぼid通りの順なのだろうし、
191で文句も言ってないので、おそらくログ的な物のラスト3行を取りたいのだろうよ

なら俺は208で言ったとおりにする
(なお俺は189ではない)
それを(実際どうなるのかは知らんが)糞遅くなりそうなSQLを出すのもいかがなものかと

質問者が悪いと言えばそうだが、
質問者のレベル推定も含めての回答にしないと、ここでは成り立たない

「ソートして良い」と勝手に決めるのが問題なら、
「ソートしてはいけない」と勝手に決めるのもまた問題でしかない
なら聞けばいいのに、それもしない
(なお、しても意味は通じず、余計に面倒になるのは見えているので、
今回のようにいきなり189で問題ないとも思うが)
なんというか、この辺の空回り具合は、文化の違いを俺は感じたよ

ただまあ俺らが特殊なのかもしれないけどな
この板では基本的にエスパー出来ないと回答は無理だし
レスを投稿する


ニューススポーツなんでも実況