X



トップページDB@2ch掲示板
1002コメント330KB
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2016/07/10(日) 22:29:01.40ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
0233NAME IS NULL
垢版 |
2017/05/01(月) 17:06:24.57ID:???
つか、いたるところで会計年度を意識するようなシステムなら、会計年度カラムを作っとけばいいよな
0234NAME IS NULL
垢版 |
2017/05/01(月) 18:03:32.59ID:???
>>232
where句も入れて何回繰り返すのさ
面倒くさいとは思わないの?
単発の作業ならわからんでもないが会計年度みたいなのは1回じゃすまないだろ

>>231
日付型でデータを持ったテーブルがあったり
日付型に徐々に移行したい場合に同じ名前で扱えるとうれしいから
会計年度って概念をDBに反映させる一つの手段
0235NAME IS NULL
垢版 |
2017/05/01(月) 18:18:52.43ID:???
>>234
> 面倒くさいとは思わないの?
いや、まったく
>>232レベルのクエリなら10秒もかからずタイプできるだろ
0236NAME IS NULL
垢版 |
2017/05/01(月) 18:28:00.19ID:???
>>234
> where句も入れて何回繰り返すのさ
ストアドでも似たようなもんだろ。
select fiscal_year(year, month), sum(hoge) from fuga group by fiscal_year(year, month)
しかもストアド使うと、year, monthにインデックスあっても使われないし。
0237NAME IS NULL
垢版 |
2017/05/01(月) 18:37:19.33ID:???
ストアド最強!!!|バカの壁| SQL92以降
0238NAME IS NULL
垢版 |
2017/05/01(月) 18:46:32.86ID:???
kantomi@qiita_banned < ストアド!ストアド!
0239NAME IS NULL
垢版 |
2017/05/01(月) 18:53:59.52ID:???
>>235
面倒くさいと思わないならいいんじゃね

>>236
asで名前つけとけばgroup byでは繰り返す必要ないよ
たとえ繰り返しが必要だったとしても概念をその名前で直接扱える状態と
毎回展開しなきゃいけない状態では全く意味が違うんだけどね

インデックスは必要ならはればいい
0240NAME IS NULL
垢版 |
2017/05/01(月) 19:03:28.63ID:???
>>233
算出できる情報を別途カラム作って持たせるのは最終手段
0241NAME IS NULL
垢版 |
2017/05/01(月) 19:04:19.13ID:???
>>180 重み付けの定石
>>182 単年度でしか動かないクソ
>>185 意図が分かりやすい
>>217 ビジネスロジックをDBMSに持たせる派とアプリに持たせる派で戦争勃発
0243NAME IS NULL
垢版 |
2017/05/01(月) 21:25:30.10ID:???
>>234
fiscal_year(year, month)って関数自体はまだなにもオーバーロードしてないだろうが。
0244NAME IS NULL
垢版 |
2017/05/01(月) 21:52:46.85ID:45FTV8QE
>>241のどこが馬鹿なのか論理的に説明できないやついるの?
0245NAME IS NULL
垢版 |
2017/05/01(月) 23:12:56.24ID:???
>>240
分解せずに日付型で持っていればよかったって事だな
以降>>188へ戻る
0246NAME IS NULL
垢版 |
2017/05/02(火) 03:16:15.56ID:???
管理上のオーバーヘッドってのがユーザ側の話なのかシステム側の話なのかしらんが
関数オーバーロードができたとして、それがビューより管理が重いとか信じられん

会計年度が必要ならそう言うビュー作れ、で終わりじゃないのか
0247NAME IS NULL
垢版 |
2017/05/02(火) 08:24:38.84ID:???
一方ロシアは会計年度カラムを追加した
0248NAME IS NULL
垢版 |
2017/05/02(火) 10:00:08.57ID:???
インデックス張るなら、ロシア方式が一番いいよな
トリガーで仕掛けておけば気にしなくて済むし
0249NAME IS NULL
垢版 |
2017/05/02(火) 10:17:39.11ID:???
>>239
> インデックスは必要ならはればいい
本末転倒だな
普通にクエリ書けばインデックス使えるのに、ストアドにしようと思うとさらに何かしないといけなくなる
つか、ストアドの結果にインデックス貼れないDBもあるんじゃね?
0250NAME IS NULL
垢版 |
2017/05/02(火) 10:22:47.67ID:???
>>239
> asで名前つけとけばgroup byでは繰り返す必要ないよ
その手段が使えるDBでは、>>232も同じことが言える

> 毎回展開しなきゃいけない状態では全く意味が違うんだけどね
例えば四半期ごとの集計がほしいとか、移動平均がほしいとかいうことになったら、
そのたびにストアド作るのか?
増殖しまくりだな
0251NAME IS NULL
垢版 |
2017/05/02(火) 10:26:43.28ID:???
ん? >>232 だとインデックス使われないだろ
>>217-218 >>185 のような関数だともっと使われない
>>182 のように or あると、うまく使ってくれるか怪しい
0252NAME IS NULL
垢版 |
2017/05/02(火) 10:38:44.85ID:???
>>251
> ん? >>232 だとインデックス使われないだろ
where書いてないからね
>>232は、集計がしんどいという奴へのレス

>>182 のように or あると、うまく使ってくれるか怪しい
大抵のRDBMSだったらうまく使ってくれるんじゃね?
0253NAME IS NULL
垢版 |
2017/05/02(火) 10:44:41.29ID:???
それより決算月が変わる可能性について考えたほうがいいと思う
0254NAME IS NULL
垢版 |
2017/05/02(火) 10:45:38.57ID:???
>>251
> >>217-218 >>185 のような関数だともっと使われない
こういうバカ避けのためにわざわざ「性能は知らん」って書いてあるのにバカはそれすら理解できないんだな w
インデックス使いたいならdate型にしとけよ
0256NAME IS NULL
垢版 |
2017/05/02(火) 10:51:13.38ID:???
>>254
year, monthにインデックス張ればいいだろ
アホか
0257NAME IS NULL
垢版 |
2017/05/02(火) 11:01:20.42ID:???
ビューのコストが高いというのがparserの話だとしたら、単純なビューなら最近では全く問題にならない
まぁ、大抵の場合、クエリ1回につき+1ms未満だろう。
(さらには、直近のparse結果をcacheしている場合もある)
0258NAME IS NULL
垢版 |
2017/05/02(火) 11:03:21.36ID:???
>>256
> year, monthにインデックス張ればいいだろ

インデックス張っても関数の引数にしちゃったら使われない
0259NAME IS NULL
垢版 |
2017/05/02(火) 15:49:34.57ID:???
>>256
バカってこれだから...
複数の列に張るより単一の方が有利だろう
そんなことも理解できないのかよ w
0260NAME IS NULL
垢版 |
2017/05/02(火) 16:00:26.84ID:???
そんな理由だったらオレもアンタをバカ呼ばわりしていいかな
0262NAME IS NULL
垢版 |
2017/05/02(火) 17:11:25.84ID:???
不利っつっても、比較が1回か2回かって違いくらいしかないだろ。
0263NAME IS NULL
垢版 |
2017/05/02(火) 17:17:06.13ID:???
ここを2つに分けるかどうかの是非はともかく
キーが2つになるから絡むつにしようとかおかしいだろw

まあこのケース、月なんて12通りしか無いんだし複合キーで
0264NAME IS NULL
垢版 |
2017/05/02(火) 18:48:29.70ID:???
>複数の列に張る

こういう言い方しているところを見ると、複合インデックスの仕組みをわかってないんだろう。
0265NAME IS NULL
垢版 |
2017/05/02(火) 18:57:10.84ID:???
yearのインデックスとmonthのインデックスを別々に張りそう
0266NAME IS NULL
垢版 |
2017/05/02(火) 19:11:26.98ID:???
>>250
>その手段が使えるDBでは、>>232も同じことが言える
そんなんわざわざ言わんでもわかっとるがな〜ww

>増殖しまくりだな
増殖して何か問題あるの?
0267NAME IS NULL
垢版 |
2017/05/02(火) 21:48:44.24ID:???
>>246
システム側の話
組織構造なんかも大きく影響するから環境による
導出列はビューを使うっていう規約があってそれに従ってるようなところならオーバーヘッドも少ないだろうね
ただ関数よりビューのほうが管理の厳格度というか管理レベルが高いのは一般的じゃないのかな?
管理レベルが高ければその分のオーバーヘッドはかかる

それに同じような年・月で持ってるテーブルが10個に増えたら10個ビューを追加することになる
そういうのが嫌だからComputed Column的な機能があるDBが多いと思ってる
0268NAME IS NULL
垢版 |
2017/05/02(火) 22:51:26.07ID:???
>>264
お前こそわかってないだろ w
>>180, >>182 みたいに複合インデックスの各々の列を別々に大小比較で使うとインデックス使えないぞ
0269NAME IS NULL
垢版 |
2017/05/02(火) 23:17:09.54ID:???
使われないインデックスと、使えないお前らの脳ミソ達。
0270NAME IS NULL
垢版 |
2017/05/03(水) 00:11:51.74ID:???
>>182は(orは別として)yearとmonthの複合インデックスの教科書的な例だと思うが。
つか、>>180>>182を同列に並べている時点でお里が知れる。
0271NAME IS NULL
垢版 |
2017/05/03(水) 04:36:48.77ID:???
>>267
管理レベルってのがなんだかわからんが
ビューの方がより厳密に適用される分、問い合わせ時のシステム的なオーバーヘッドは小さいだろ
実行計画もより最適化できる
つか、ユーザー側/システム側って切り分けが、どっちも人員の切り分けだと思ってる?

>それに同じような年・月で持ってるテーブルが10個に増えたら
同じものが分散して存在してたら、その時点でテーブル設計が間違ってるわ
0272NAME IS NULL
垢版 |
2017/05/03(水) 07:59:56.11ID:???
馬鹿はなぜ無駄に未来の心配ばかりするのか
0273NAME IS NULL
垢版 |
2017/05/03(水) 09:25:30.95ID:???
>>270
実行計画見てみ
複合インデックスの仕組み知ってたらそんなアホな発想はできないよ
0274NAME IS NULL
垢版 |
2017/05/03(水) 10:39:56.79ID:???
おまえこそ見てみろと言いたいが。

念のためだが、ヘボいオプティマイザがorのせいでスキャン範囲の限定に失敗するのは
「複合インデックスの各々の列を別々に大小比較で使うとインデックス使えない」てのとは
関係ないからな。
0275NAME IS NULL
垢版 |
2017/05/03(水) 11:04:58.97ID:???
>>274
> orのせいで
バカを晒すのはほどほどにしろよ
0277NAME IS NULL
垢版 |
2017/05/03(水) 12:40:47.23ID:???
今どきは>>182でも(year,month)のインデックスがあれば
(そしてそれを使ったほうが速いとDBMSが判断すれば)
使うDBMSのほうが多いと思う

パフォーマンスに関しては昔の定石を今はあまり気にしなくても
良くなっていることが多いので必ず実機で試してから語ったほうがいい
0278NAME IS NULL
垢版 |
2017/05/03(水) 13:06:33.96ID:???
>>276
それはyearを使わずにmonthだけだった場合だな。こんな初歩的な勘違いしてたのか。
0279NAME IS NULL
垢版 |
2017/05/03(水) 13:34:58.40ID:???
>>278
バカはこれだから...
わざわざ
> インデックスの構造をより深く見ていくと、この理由がはっきりします。
って言うところまで引用してるだからその下読めよ
理解できるかどうかは知らんけど w
0280NAME IS NULL
垢版 |
2017/05/03(水) 14:38:41.03ID:???
アホなレス量産してるやつは約1名だけっぽいな
0281NAME IS NULL
垢版 |
2017/05/03(水) 17:44:08.92ID:???
year, monthにインデックスの件だけど、PostgreSQLなら使われるけどなぁ
ほかのDBだと使われなかったりするのか?
0282NAME IS NULL
垢版 |
2017/05/03(水) 17:47:31.47ID:???
create table hoge (year integer, month integer, amount integer);
create index hoge_idx on hoge(year, month);

select year, month, sum(amount)
from hoge where (year = 2017 and month > 3) or (year = 2018 and month < 4)
group by year, month;

実行計画:
https://explain.depesz.com/s/rwx
0283NAME IS NULL
垢版 |
2017/05/03(水) 18:26:59.82ID:???
使われないDBがあると思ってるのは約1名だけだぞ
0284NAME IS NULL
垢版 |
2017/05/03(水) 18:31:37.11ID:???
実行計画見るような人なら当然わかっているだろうけど、統計情報がとられていなかったり
選択されるレコードの割合ががテーブル全体に対して大きい場合はインデックススキャンが
選択されないから注意な。
0285NAME IS NULL
垢版 |
2017/05/03(水) 18:42:36.82ID:???
インデックス使われないマン =
オーバーロードマン =
Computed Columnマン
0286NAME IS NULL
垢版 |
2017/05/03(水) 18:49:07.86ID:???
=管理レベルマン
0288NAME IS NULL
垢版 |
2017/05/03(水) 19:56:46.81ID:???
まさか今どき、インデックスがあれば必ず使うとか思ってるんだろうか
ルールベースとコストベースの違いも分かってない?
0289NAME IS NULL
垢版 |
2017/05/03(水) 20:03:06.22ID:???
「使われない場合もある」に方向転換w
0290NAME IS NULL
垢版 |
2017/05/03(水) 20:30:25.65ID:???
>>285
おいこら
インデックス使われないマンと一緒するなよw
0292NAME IS NULL
垢版 |
2017/05/03(水) 20:49:46.41ID:???
>>291
インデックス使われないマンちぃーす
0293NAME IS NULL
垢版 |
2017/05/03(水) 21:10:30.66ID:/Lg9geb/
お前らが馬鹿なのは使う必要のないインデックスについて延々と話してることだけどな
0294NAME IS NULL
垢版 |
2017/05/03(水) 22:00:09.77ID:???
>>288
「使う場合もある」に方向転換w
0295NAME IS NULL
垢版 |
2017/05/03(水) 22:14:57.26ID:???
>>282
それ >>287 が書いてる通り Bit Map Index Scanだよ
URL読めばわかると思うけど

> ビットマップスキャンは、一度に全てのタプルへのポインタをインデックスから取り出し、
----
インメモリな「ビットマップ」データ構造を使ってソートし
----
> 物理的なタプル位置の順にテーブルのタプルにアクセスします。

つまりyearとmonthに対して個別にインデックス張っときゃソートなんて要らない
要するに >>264-265 をディスってるだけなんだが w
0296NAME IS NULL
垢版 |
2017/05/03(水) 22:20:18.00ID:???
結論

>year, monthにインデックス張ればいいだろ
>アホか
0297NAME IS NULL
垢版 |
2017/05/03(水) 22:20:54.65ID:???
まあ、日付型とか言ってる奴は決算月の考慮どうするんだろうと思うわ
0298NAME IS NULL
垢版 |
2017/05/03(水) 22:51:38.44ID:???
またドヤ顔で恥の上塗り
0299NAME IS NULL
垢版 |
2017/05/03(水) 22:56:01.77ID:???
具体的に説明できない奴がわらわら沸いてるw
0300NAME IS NULL
垢版 |
2017/05/03(水) 23:01:34.87ID:???
>>297
決算月と日付型との間に問題があるなら後学のために披露しては?
それか質問なら>>1読んでからどうぞ
0301NAME IS NULL
垢版 |
2017/05/04(木) 09:47:10.24ID:???
結論だけ言ってて根拠が無ければそれはただの推論
0302NAME IS NULL
垢版 |
2017/05/04(木) 10:19:56.24ID:???
妄想の可能性も...
0303NAME IS NULL
垢版 |
2017/05/04(木) 11:07:26.95ID:???
>>287
データ量が多いというのは1億レコードとかそんな単位?
>>282は100万件だったけど、1000万件でも同じだよ。

>>288
そういう話じゃない。
ストアド作って、where fiscal_year(year, month) = 2017とやると通常はインデックスは使われないが、
普通にクエリ書けば、適切な場面でインデックスが使われるという話だ。

> ルールベースとコストベースの違いも分かってない?
PostgreSQLの話になるが、PostgreSQLにはルールベースのオプティマイザはないよ。

>>295
コメントの意図がわからないんだが。

> つまりyearとmonthに対して個別にインデックス張っときゃソートなんて要らない
それ、monthに対するインデックスの意味ないよね。
0304NAME IS NULL
垢版 |
2017/05/04(木) 11:16:06.46ID:???
>>303
> データ量が多いというのは1億レコードとかそんな単位?
> >>282は100万件だったけど、1000万件でも同じだよ。
マジで仕組みを理解してないんだな w
そっちのデータ量じゃなくてインデックスの方
要するに年と月の数の話

> それ、monthに対するインデックスの意味ないよね。
ないと本気で思ってるなら真面目にもう少し勉強した方がいいと思う
0305NAME IS NULL
垢版 |
2017/05/04(木) 11:33:25.73ID:???
>>304
> マジで仕組みを理解してないんだな w
わかるような単語使いましょう。ちゃんと用意されてるんだから。

> 要するに年と月の数の話
カーディナリね。

> ないと本気で思ってるなら真面目にもう少し勉強した方がいいと思う
どういう意味があるんだ?
0306NAME IS NULL
垢版 |
2017/05/04(木) 13:11:20.76ID:???
>>305
> カーディナリね。
それを言うならカーディナリティな

> わかるような単語使いましょう。
でかいブーメラン乙 w
きちんと理解せずに背伸びするからそう言う間違いをしちゃうんだよ

> どういう意味があるんだ?
普通にインデックスとして使われるだけだが?
なぜmonthは使われないと思ったんだ?
0307NAME IS NULL
垢版 |
2017/05/04(木) 13:46:35.74ID:???
>>306
> それを言うならカーディナリティな
知ってるなら最初から使おうな。

> なぜmonthは使われないと思ったんだ?
使われないから意味ないんだよ。
まぁ、monthを軸にした検索をすれば使われるだろうが、今回の流れとは関係ないね。

俺がコメントを続けた意味が理解できてないようだから、再説明しとこう。

>>295
>>282
> それ >>287 が書いてる通り Bit Map Index Scanだよ
> URL読めばわかると思うけど
これが意味不明なんだが。
bitmap index scanだから何?
0308NAME IS NULL
垢版 |
2017/05/04(木) 14:11:42.70ID:???
脇道の細かい議論しても仕方がないから、論点を絞ろう。

君が主張したいのはこれか?
>>259
> 複数の列に張るより単一の方が有利だろう

それに対する俺の主張は、「year, monthに複合インデックス貼る方が有利」。
理由は、
・インデックスが全くない場合は、seq scanになり、論外
・yearのみにインデックスを張った場合、「2017年度」のデータを参照するとき、2年分のデータを読み1年分のデータを捨てる必要がある
・monthのみのインデックスには意味がない
・year, monthにインデックスを張れば、>>179のような会計年度別集計などの場合にインデックスが使われる(もちろん、使った方がコスト的に有利な場合)

・(おまけ)year, monthにインデックス張っても、where fiscal_year(year, month) = 2017などとするとインデックスが使われなくなる
・(さらにおまけ)PostgreSQLには、関数インデックスという機能があり「fiscal_year(year, month)」に対してインデックスを貼ることができる
・(蛇足)そこまでするなら、普通にクエリ書け
0309NAME IS NULL
垢版 |
2017/05/04(木) 16:35:58.81ID:???
>>307
> 知ってるなら最初から使おうな。
ちゃんとした知識持ってる奴なら >>287 のリンク先読めばわかるし
それでわからんような奴にカーディナリティとか言ってもしょうがないだろ
さすがに中途半端にカーディナリとか言う知ったかさんの存在までは想定しとらん

> 使われないから意味ないんだよ。
なぜ使われないんだ?
に対して「使われないから」って日本語大丈夫か?

> まぁ、monthを軸にした検索をすれば使われるだろうが、今回の流れとは関係ないね。
>> (year=2017 and month>=4) or (year=2018 and month<=3)
で関係ないと考える奴にどう説明しろと?

> bitmap index scanだから何?
>>287 のリンク先読めよ
それでもわからないと言うから >>295 でも説明してる
さらにそれでもわからんと言うならわからない箇所を引用してくれ

すごく中途半端な知識で語ってるようだからどこがわからんのか予測できないし
0310NAME IS NULL
垢版 |
2017/05/04(木) 16:47:15.20ID:???
>>308
> ・year, monthにインデックスを張れば、>>179のような会計年度別集計などの場合にインデックスが使われる(もちろん、使った方がコスト的に有利な場合)
複合インデックスの話だよね?
それならBit Map Index Scanになるから実行時にインデックスデータについてソート処理が走るんだよ?
そこ理解してる?
ちなみに俺は
> インデックス使いたいならdate型にしとけよ
って言ってるから普通にIndex Scanするだけなのでソート処理なんて要らんから
0311NAME IS NULL
垢版 |
2017/05/04(木) 17:13:18.38ID:???
なんでBit Map Index Scanになるのが当然のような言い方なんだか。
0312NAME IS NULL
垢版 |
2017/05/04(木) 17:21:33.21ID:???
>>311
他の方法があると言うなら示してみて
0313NAME IS NULL
垢版 |
2017/05/04(木) 17:22:38.91ID:???
そろそろ結論出して終わりにしてください
結論がまとまらないなら、両論併記で良いと思います
0314NAME IS NULL
垢版 |
2017/05/04(木) 17:28:28.15ID:???
お互い相手のことを馬鹿だと思っているなら
馬鹿相手にムキになっている自分を恥じたほうがいいと思うが
0315NAME IS NULL
垢版 |
2017/05/04(木) 17:48:27.91ID:???
いや既に結論出てるけど理解できない人が食い下がってるだけ
0316NAME IS NULL
垢版 |
2017/05/04(木) 18:23:25.80ID:???
>>180で答え出てるから後は設計スレでしてくれ
閑古鳥鳴いてるからウェルカムだぞ
0317NAME IS NULL
垢版 |
2017/05/05(金) 11:22:05.92ID:???
せめて年月から会計年度を返す関数化してくれ
0318NAME IS NULL
垢版 |
2017/05/09(火) 13:37:10.07ID:???
>>310
> それならBit Map Index Scanになるから実行時にインデックスデータについてソート処理が走るんだよ?
> そこ理解してる?
その「ソート処理」は、計画ノード種別の「ソート」じゃなくて、Bitmap Index Scanのアルゴリズム上、実装コードで
ソートが必要だということじゃないの?
実際、>>282の実行計画には、「ソート」はないわけで。
で、アルゴリズム上、ソートが必要だとして、何か問題でも?

> > インデックス使いたいならdate型にしとけよ
> って言ってるから普通にIndex Scanするだけなのでソート処理なんて要らんから
Index Scanの場合も、aggregateするときに、実装コードでソートが必要な気がするが。
(ソートせずに何回もループしてもいいが、多分ソートするんじゃないかと思う)
0319NAME IS NULL
垢版 |
2017/05/09(火) 13:48:09.40ID:???
ケースバイケース
0320NAME IS NULL
垢版 |
2017/05/09(火) 13:48:27.88ID:???
>>309
> なぜ使われないんだ?
なぜもクソも使わないんだよ。

> >> (year=2017 and month>=4) or (year=2018 and month<=3)
> で関係ないと考える奴にどう説明しろと?
関係ないね。
関係あるというなら、テストデータ作って実行計画出してみな。

> すごく中途半端な知識で語ってるようだからどこがわからんのか予測できないし
俺がお前に言いたい言葉だな。
0321NAME IS NULL
垢版 |
2017/05/09(火) 14:10:30.17ID:???
親切なので、year, monthに個別にindexを張った場合の実行計画を取ってみた。
https://explain.depesz.com/s/UapJ

書き忘れたが、
> インデックス使いたいならdate型にしとけよ
大本の話は会計年度で集計するときの話。
date型なら会計年度を取得して集計する必要があって、そこでストアドやビルトイン関数使うと
日付カラムにindexあっても使われないって話な。

さらに言えば、会計年度カラム追加しろとかいう話なら、今のままで複合インデックスつけて普通に
検索しろってこった。
(何度ループするんだよ)
0322NAME IS NULL
垢版 |
2017/05/09(火) 14:24:55.28ID:???
さらにおまけ。

# \d fuga
テーブル "public.fuga"
列 | 型 | 修飾語
--------+---------+--------
dt | date |
amount | integer |
インデックス:
"fuga_idx" btree (dt)

explain analyze verbose select sum(amount) from fuga where dt between '2013-04-01' and '2014-03-31';

実行計画:
https://explain.depesz.com/s/533s
Bitmap Index Scanになってますが。
0323NAME IS NULL
垢版 |
2017/05/09(火) 14:55:26.36ID:???
これにもレスしとこう。

前提として、seq scanではパフォーマンス的に問題があるレベルのレコード数の場合。
>>316
> >>180で答え出てるから後は設計スレでしてくれ

whereで式を使うと、そのカラムにインデックスがあっても使われない。
> Seq Scan on public.hoge (cost=0.00..30406.00 rows=5000 width=12) (actual time=0.028..253.216 rows=100600 loops=1)
> Output: year, month, amount
> Filter: ((((hoge.year * 100) + hoge.month) >= 201604) AND (((hoge.year * 100) + hoge.month) <= 201703))
> Rows Removed by Filter: 899400
> Execution time: 288.702 ms

なお、PostgreSQLには式インデックスという機能があって、それを作ればインデックスが使われる。
create index hoge_calc_idx on hoge((year*100+month));
> Bitmap Index Scan on hoge_calc_idx (cost=0.00..106.42 rows=5000 width=0) (actual time=13.776..13.776 rows=100600 loops=1)
> Index Cond: ((((hoge.year * 100) + hoge.month) >= 201604) AND (((hoge.year * 100) + hoge.month) <= 201703))
> Execution time: 74.346 ms
0325NAME IS NULL
垢版 |
2017/05/10(水) 10:29:23.99ID:???
>>324
まあ、微粒子レベルで俺が間違ってる可能性があるからな
0326NAME IS NULL
垢版 |
2017/05/10(水) 10:41:42.84ID:???
>>325
お前が>>323なら、おかしいのはお前の相手の方だから心配すんな
>>268からずっとおかしい
相手するだけ無駄
0327NAME IS NULL
垢版 |
2017/05/10(水) 10:55:53.42ID:???
今時、コストベースがどうこうとか言う奴だからな。
10年以上前にちょろっとDB触ったレベルの奴じゃね?
0328NAME IS NULL
垢版 |
2017/05/10(水) 14:06:04.96ID:???
・ストアドにしてオーバーロードしろ
・インデックス使いたいならdate型にしろ
・date型にしないなら個別インデックスにしろ
・Bit Map Indexガー
・ソートガー

全部同じやつでしょ
最初からおかしい
0329NAME IS NULL
垢版 |
2017/05/10(水) 17:35:34.21ID:???
今更というかやっと式インデックスが出てくる脱力感
0330NAME IS NULL
垢版 |
2017/05/10(水) 18:21:15.72ID:???
>>329
式なんか使わずに普通にクエリ書けと何度言ったら
0331NAME IS NULL
垢版 |
2017/05/15(月) 18:17:10.53ID:/ZtiK+kF
Local and global coordinate system
0332NAME IS NULL
垢版 |
2017/05/29(月) 23:01:50.19ID:OpaRYJdt
・Postgresql 8.4

・テーブルデータ
|col_a|col_b|col_c
-----------------
name1 1  0
name1 0  3
name2 0 2
name2 0 2
name3 0 3
name3 0 4


・欲しい結果
|col_a|col_b|col_c
-----------------
name1 1  0
name1 0  3
name3 0 3
name3 0 4

・説明
列col_aの文字列が同じで、col_bとcol_cの数値が一致しないタプルを取り出したいのですが
どのようなSQLでいけるでしょうか?よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています

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