@ledsun blog

無味の味は佳境に入らざればすなわち知れず

データベース

MySQLのロックに関する調査メモ その4

MySQLのロックに関する調査メモ その3 - @ledsun blog の続きです。 SHOW ENGINE INNODB STATUS\Gで出力されるロック情報を眺めていたら意味がわかってきました。 まずテーブルに格納されているレコードの情報です。 select * from mysqlcasual; +----+-----…

MySQLのロックに関する調査メモ その3

MySQLのロックに関する調査メモ その2 - @ledsun blog の続きです。 概念だけ勉強しても理解に限度があります。 実際にロックを起こして観察してみました。 InnoDBのロックの範囲とネクストキーロックの話 - かみぽわーる を参考にしました。 MySQL Shellを…

MySQLのロックに関する調査メモ その2

MySQLのロックに関する調査メモ その1 - @ledsun blog の続きです。 MySQLのロックについて - SH2の日記 のPDFを読みました。 面白かったです。 MySQL(というかInnoDB)の最初のスタート地点が「絶対にファントムリードさせたくない」なようです。 つまり一…

MySQLのロックに関する調査メモ その1

MySQLのロックのついては MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.7.1 InnoDB ロック に書いてあるはずです。 読んでもいまいちよくわかりません。 MySQL/MariaDBとTransactdのInnoDBロック制御詳細 その1 - BizStationブログを合わせて読むとわか…

処理を並列化したらデータベースアクセス速度が低下した謎

ActiveJobとSidekiqで実装されたとある非同期処理を高速化しようと試みています。 入力ファイルからデータを読み取ってDBへ保存する処理です。 事前処理がそれなりにあるのでCPUバウンドな処理とI/Oバウンドな処理が半々ぐらいです。 CPUバウンドな処理は並…

activerecord-importを速くつかう

速度を計測する簡単なスクリプトが手に入りました。 計測しやすくするために、よりシンプルに変更します。 class User < ApplicationRecord class << self def benchmark_bulk_insert # create data instances = [] 1_000.times { instances << new(name: 'n…

ActiveRecordのバルクインサート比較 その2

Railsコンソールで実行するとログが出てきて面白いです。 読みやすくするためにデータ件数を3件、試行回数を1回にして実行します。 user system total real sql TRANSACTION (0.1ms) begin transaction (0.2ms) INSERT INTO users (name, created_at, update…

PostgreSQLのインデックスが肥大化するとInsertがおそくなる

先月末からJSONファイルからDBに一括取り込みする処理の高速化をしています。 activerecord-importを使っていたので、つぎの方法を試しました。 activerecord-importに渡すデータ生成のチューニング ActiveRecordインスタンスからハッシュに変更 ActiveRecor…

activerecord-importのチューニング(失敗編)

データベースへのデータ取り込みを速くしたいです。 すでにactiverecord-importを使っているので、これが速くできると嬉しいです。 GitHub - zdennis/activerecord-import: A library for bulk insertion of data into your database using ActiveRecord. Th…

PostgreSQLのcreateuserで作ったユーザーのパスワードって何になるんだろうか?

PostgreSQLのユーザー作成 - @ledsun blog でPostgreSQLのユーザーを作成しました。 パスワードを指定しませんでした。 このとき作成したユーザーにはどのようなパスワードが設定されるのでしょうか? ユーザー名と同じになるのでしょうか?それとも乱数で初…

PostgreSQLのユーザー作成

Railsアプリケーションの開発環境を構築するときに時々はまります。 ローカルにインストールされているPostgreSQLを使うとアプリケーションごとにPostgreSQLのユーザーが微妙に違うことがあります。 例えばpostgresというユーザーがないと次のようなエラーが…

Ruby on Railsを前提としたナチュラルキーとサロゲートキーの話

若手のWeb系プログラマとナチュラルキーとサロゲートキーの話をしました。 適当なこと言ってないか不安になったのて、調べ直しました。 DB データのサロゲートキー | knooto おおむね SI 系は自然キー派、Web 系はサロゲートキー派の傾向がある とても同意で…

既存のRailsプロジェクトからカラム情報を取得する(成功)

config/database.ymlを直接読み込むと"pool"=>"<%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %>"という謎の情報が取得され、正しいデータベースへの接続情報が得られません。 <%=と%>はeRubyスクリプトです。 Railsアプリケーションなdatabase.ymlは厳密には…

既存のRailsプロジェクトからカラム情報を取得する(原因)

既存のRailsプロジェクトなので、rails consoleで使用しているデータベースへの接続情報を見れば原因がわかるはずです。 ~ bin/rails console Running via Spring preloader in process 24178 Loading development environment (Rails 6.1.3.2) irb(main):00…

既存のRailsプロジェクトからカラム情報を取得する(失敗)

一般的なRailsアプリケーションはconfig/database.ymlにデータベースへの接続情報があります。 これをつかってすでに存在しているデータベースからカラム情報を取得してみましょう。 必要なライブラリを読み込んでirbを起動します。 ~ irb -r 'active_record…

論理削除フラグという名の死亡フラグ

RDB - DELETE_FLAG を付ける前に確認したいこと。 - Qiita 論理削除が云々について - mike-neckのブログ Kazuho's Weblog: 論理削除はなぜ「筋が悪い」か 流行っているので乗っかります。 結論 「データ制約の強力さと集合としての表現力を捨てながら、Relat…

ubuntuにdebパッケージインストールしたMySQL5.6をアンインストールする

前回インストールしたMySQLを設定ファイルとデータを含めて削除します。 mysqlコマンドのパスを消す sudo rm /etc/profile.d/mysql.sh 自動起動設定を消す 起動していれば終了します。 ps -ef|grep mysql sudo /etc/init.d/mysql stop 自動起動の設定を消し…

MySQL5.6をubuntuにdebパッケージインストール

apt-get でインストールできないので公式debパッケージからMySQL5.6をインストールする方法。 dpkg -i だけではダメで、ユーザやらの設定も必要。 ダウンロード Download MySQL Community Server で Platform に Debiun Linux を選択すると mysql-5.5.23-deb…

Web+DBの入力値の型変換まとめ

Webの画面から入力された値をどう型変換してDBに格納するかをまとめました。 サーバ言語はC#、RDBはSQLServer。 概要 html JavaScript C# SQLServer textarea string string nvarchar text string string 後述 password string string/byte[]*1 varbinary ch…

SQLServerをコチョコチョしてサーバからファイルを取ってくる

bcpユーティリティとOPENROWSETを次のように組み合わせると、SQLServerを経由してファイルコピーできます。-Uの後ろがログインユーザ名です。 つまり、SQLServerにログインできるサーバからなら既知のファイル*1を取得できます。とは言ってもSQLServerの権限…

ただのプログラマがSQLマスターになるために「これだけは知っておきたいデータベースの常識」

誰が読むべきか WEBアプリケーションの実装経験が2年あり、日常的にSQLを書きます。複雑なロジックでなければSQLを書くことは苦にしません、複雑なロジックも先輩プログラマと相談しながらSQLに起こすことができます。しかしRDBがなんなのかよくわかりません…

T-SQLのエラー処理方針

T-SQLのエラー処理方針をまとめてみました。 1.更新の無いストアドはエラー処理をしない。 SELECTするだけのストアドは、エラー処理をせずにそのまま例外を上に投げると呼び出し側でTRY-CATCHしやすいです。 2.SQLServerエージェントから呼び出すストアドはu…

テーブル一覧を取得するSQL

SQLサーバでDB内に作成したテーブルの一覧を取得したい場合は次のようなSQLで取得できます。 SELECT NAME FROM sysobjects WHERE xtype = 'U' ORDER BY NAME その他sysobjectsから取れるものは次のページが参考になります。 http://csharp.yaminabe.info/200…