2020-02-01から1ヶ月間の記事一覧
アナライズとか実行計画をとる、統計情報をとる など現場で結構聞くと思いますが、そもそもなんでとるんでしょうかね? ざっくりいうと、SQL文というのはselect対象のテーブルを参照する前に、 テーブルにどれくらいデータが入っているのかが蓄えられている…
deleteやdropしてもじつはDBの容量はあかないってことを知ってましたか? ゴミ箱領域に蓄えられて、完全に消えたりはしないんですよね。 ゴミ箱の確認 SELECT * FROM RECYCLEBIN; ゴミ掃除 PURGE RECYCLEBIN; 理屈は抜きで!
PostgreSQLにはすべてのテーブルを同時にアナライズする方法があるみたいですね。 ANALYZE; と実行するといけるそうな。 理屈は抜きで!
Oracleと違って単純ですね。 ANALYZE テーブル名; とりあえず、統計情報取っといてや、アナライズかけといて と言われたらこうしましょう。 理屈は抜きで!
前回とちょっと違うのですが、 アナライズ構文から並列度を加えたものがこちらです。 exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ユーザ名', tabname => 'テーブル名' DEGREE=>'DBMS_STATS.AUTO_DEGREE'); 理屈は抜きで!
意外とアナライズの構文ってすっとでてこないですね。 Oracleではこちら exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ユーザ名', tabname => 'テーブル名'); 実はこの中にいろんなチューニングテクニックが入っていたりして。。。 理屈は抜きで!
存在しないことを確認って結構やることありますが、 なるべく使わないようにしましょう。 existsを使う、または、 not existsで代用 このほうがよいです。 理屈は抜きで!
データが重複してもいいのであれば、unionではなく、 union allを使いましょう。 集約なくすのは、チューニングの基本かも 理屈は抜きで!!
in句の中身って意外と気にしないかもしれませんが、 よく当たる順番にin句の中を書くと速くなりますよ。 理屈は抜きで!!
単純ですが、is nullはやめましょう。。。 EXISTSでどうにか乗り切りましょう。 理屈は抜きで!!
大なり小なりでこの間を抽出したいときありますね =< >=とかで囲んだりしますが、 betweenのほうが速くなります。 理屈は抜きで!
集約っていたる所で使うんですよね 注意することは、order byよりも、distinctを使った方が速いってことです! 理屈は抜きで!
今DBにどんなテーブルが作成されているか確認したいときありますね。 そんなときはこれです。 PostgreSQL版 select * from pg_stat_user_tables; 理屈は抜きで!!
今DBにどんなテーブルが作成されているか確認したいときありますね。 そんなときはこれです。 Oracle版 select * from V$USER_TABLES; テーブル容量まで見れるので何かと便利 理屈は抜きで!!
一つのテーブルにINDEXが複数作成されている場合、「このINDEXを指定したい」というときがありますね。そんなときのヒント句の書き方です。PostgreSQL版 /*+ IndexScan(テーブル名 インデックス名) */ 理屈は抜きで!
一つのテーブルにINDEXが複数作成されている場合、このINDEXを指定したいときがありますね。そんなときのヒント句の書き方です。Oracle版 /*+INDEX(テーブル名 インデックス名)*/ 理屈は抜きで!
以前にhashjoinをするのがはやいと言いましたが、たまにネスデッドループのほうが速い場合もあります。 ネスデッドループは行同士を一行ずつ結合する方法です。 ヒント句はこれです。PostgreSQL版です下のa bはそれぞれテーブル名です /*+NestLoop(a b)*/ 理…
以前にhashjoinをするのがはやいと言いましたが、たまにネスデッドループのほうが速い場合もあります。 ネスデッドループは行同士を一行ずつ結合する方法です。 ヒント句はこれです。 Oracle版です下のa bはそれぞれテーブル名です /*+USE_NL(a b)*/ 理屈は…
件数を確認するときって、countを使いますが、 count(*)ってなにげなく使ってませんか? ()の中は1を指定したほうがよいです。 select count(1) from テーブル名; って感じです。 理屈は抜きで!
存在チェックって、なにかとやりますよね。 そんな時は、以前紹介したlimitを使って、1件でも存在したら1を返却するようにしましょう。 こんな感じです! select 1 from テーブル名 limit 1; 理屈は抜きで!
存在チェックって、なにかとやりますよね。 そんな時は、以前紹介したrownumを使って、1件でも存在したら1を返却するようにしましょう。 こんな感じです! select 1 from テーブル名 where rownum < 1; 理屈は抜きで!
実行計画ってよくわからないですよね。。。 おそいなあと思ったときに、INDEXの検索方法が「INDEX RANGE SCAN」で検索しているかどうかを確認してください。 「TABLE ACCESS FULL」、「INDEX UNIQUE SCAN」、「INDEX SKIP SCAN」だった場合、INDEXを見直した…
存在チェックをするときに、inner joinを使っていませんか? 存在チェックだけだったら、inner join ではなく、where句の中でexistsで対応しましょう!! 理屈は抜きで!
前回ビューにはINDEXが作成出来ないと言いましたが、マテリアライズド・ビューならINDEX作成できます! 更新がおそくなったりするのが厄介なんですけどね。。 理屈は抜きで!
ビューって便利ですね ですが、あいつの検索はINDEXが使えないので、遅いことがしばしば、、 性能を考えるなら、ビューは消しましょう! 理屈は抜きで!