備忘録

2017/01/29 下山川(安針塚-下山川-葉山-逗子)

京急安針塚駅~安針塚~下山川~葉山~JR逗子駅の20km弱を散歩しました。

安針塚駅
9:45 京急安針塚駅。カーブにある駅で、電車が停車する時傾いています。駅北にはスーパーとか少し店があるようだけど、南には何もなし。
横須賀港
10:03 駅からずっと南下。途中から歩行者専用の道路になり、暗峠ばりの急勾配。頂上付近には塚山公園があり、そこの展望台から北側の横須賀港を見る。船の種類はわからないが軍艦がいますね。
安針塚説明
10:07 安針塚の説明。もっと情報をのっけてくればよいのにね。全文はこちらのサイトにテキストで書いてあります。
安針塚
10:09 安針塚
安針塚から葉山方面に抜ける道
10:11 安針塚から葉山方面に抜ける道。鎌倉の切通しみたいな感じのところもあります。基本、整備された山道です。
下山川上流
10:17 安針塚から山道を歩いて舗装のある道路に出たところ。本町山中有料道路沿いで、もう少し上流に行くと源流点らしい。
下山川中流
10:40 不動橋手。鴨がお休み中です。
下山川 星山橋観測所
11:38 この日の水位は0.13m。氾濫注意水位は2.3m。1m位になれば下ろうと思えばいけるかも。台風の時じゃないとダメでしょうけど。
下山川河口
12:23 葉山御用邸をぐるっと回って河口まででる。河口も水はちょろちょろ。正門にしか警備の人(警官?)がいないと思ってたが、裏にもも結構いるんですね。
この日は暖かくマリンスポーツをやっている人がたくさんいました。
SUP(スタンドアップパドルボート)という、サーフボードの上に立ってシングルブレードで漕ぐ人が多かった。
シーカヤックは少し。SUPは波のあるところでは辛そうだと見ていて思った。
海水に手を入れてみたが、やはり海は川に比べ大分あったかい。
森戸大明神 由来
12:59 森戸大明神というのがあったので寄ってみた。頼朝がどうのこうのと書いてありました。
森戸大明神
12:59 カップルが、神社は写真撮らない方が良いんだってという話をしていました。
そういうもんなのかね~。そもそも、神社ができたころに写真なんてものは存在しなかったから、そんな風に言われるようになってから100年も経っていないだろうからどうでもいいね。
そもそも、神だの仏だの信じないし。どういう歴史があるか興味があって行くだけだから。

13:55にJR逗子駅に到着。駅の近くにスーパーでもあれば、魚系のお土産を買って帰ろうと思ったがなかったので止めた。

XX番線の電車もあわせてご利用ください

同じ方向に行く電車で複数のホームから発車できる駅がある。
1番線の電車が発車しそうになって「2番線の電車もあわせてご利用ください」という放送がよくある。
1番線、2番線の順で発車するから、もう1番線の電車は使わず、2番線のに乗ってって言いたいのだと思われる。

そうかそうか、両方使えってか?
両方使うには、1番線の電車に乗って、途中で電車を止めて降り、次に来た2番線の電車を止めて乗り込むことを推奨しているのね。
こんなことやっても、威力業務妨害で訴えるなよ。

放送するなら、
「2番線の電車"を"ご利用ください」とか「2番線の電車のと利用もあわせてご検討ください」
でしょ。

指定した精度より小さい桁に値を設定すると四捨五入される

create table T ( C number(3));
insert into t values (123.5);
select * from t;
としたとき、123が取れると思ったが、124となった。
指定した精度より下は無視されるのが正しいと思うが。。
マニュアルを見ると四捨五入の例があった。

入力:7,456,123.89
指定:NUMBER(9,1)
格納方法 :7456123.9

試したら、TIMESTAMPも精度を指定でき、同じような動きになった。

SELECT FOR UPDATE対象が別セッションで更新され、条件に合わなくなったらどうなるか?

1.セッションA で SELECT FOR UPDATE
  副問い合わせで最大値を求めそれを取得。値が10,20とあったら、20のレコードをロックされる。
2.セッションB で同条件で SELECT FOR UPDATE
  同じく値20のレコードを待つ。
3.セッションA で、2.の条件に合わない
  20→0と値を変更しコミット。
4.セッションB ではどうなるか?

値10のレコードが取れるか?データなしとなるか?
結果は、データなしとなる。
まあ、考えればわかる。
10を返そうとするには、副問い合わせを再実行しないといけない。
下手すれば無限ループ。

以下、試した結果。


-- ↓準備
create table T ( C number);
insert into t values (10);
insert into t values (20);
commit;
-- ↑準備

-- ↓セッションA
select * from t
where c = (select max(c) from t)
for update;
-- ↑セッションA

-- ↓セッションB
SQL> select * from t
2 where c = (select max(c) from t)
3 for update;
-- ↑セッションB

-- ↓セッションA
update t set c=0 where c = 20;
commit;
-- ↑セッションA

-- ↓セッションB
レコードが選択されませんでした。
-- ↑セッションB

データ0件なのに検索が遅い

ブログに始めてのコメントがあったので、久しぶりに再会。

開発環境で0件なのにSELECTが遅いことがあったので、結果はほぼ想像できていたが調べてみた。

  1. V$SQLから遅いSQLのSQLIDを探す

  2. SELECT a.SQL_ID, a.SQL_TEXT, a.* FROM V$SQL a WHERE a.SQL_TEXT LIKE '%なんたら%';


  3. 実行計画を見る

  4. SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('見つけたSQL_ID'));


  5. 使っているオブジェクトがぶっ壊れていないか調べる

  6. SELECT a.STATUS, a.* FROM ALL_OBJECTS a WHERE a.OBJECT_NAME = 'テーブル名なりインデックス名';


  7. セグメントのサイズを調べる
  8. SELECT TRUNC(a.BYTES/1024/1024/1024, 2) "サイズ(GB)", a.* FROM DBA_SEGMENTS a WHERE a.SEGMENT_NAME = 'テーブル名なりインデックス名';


    0件なのにデカイことがここでわかる。

無駄にデカイからFULL SCAN時にそのセグメントを舐め回さないといけないから遅かった。
なぜでかいか?マニュアルのこの辺りを見ると良いかと。

  • オンラインでセグメントを縮小する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。

  • TRUNCATE TABLEの構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照してください。


再編成かtruncateをせよってこと。
開発環境のユーザにDROP TABLE権限がなく、TRUNCATEができなかったからセグメントが広がりっぱなしだったんでしょう。
DROP TABLE権限をつけるのは躊躇するだろうから、TRUNCATE権限っていうのがあれば良いんだけどね。
前のページ 次のページ

FC2Ad