これは明らかに遅く非効率だ。この問題はEager Loadingというテクニックを使うことで解決できる。もし最初の注文クエリの一部として後で必要となる顧客とのアソシエーションをすべてロードしておけば、Customerに対するアクセスはただのプロパティへのアクセスになる。こうすれば後のデータベースクエリは不要になり、N+1問題も起こらない。 LightSpeedでは、そのEager Load設定をTrueに変更することで(もしくは手書きコードのエンティティにEagerLoadAttributeを適用することで)、アソシエーションのEager Loadを可能にする。Eager Loadされるアソシエーションをもつエンティティをクエリすると、LightSpeedは追加のSQLを生成して、‘プライマリ’エンティティと同じように関連したエンティティを取得する。 Order.Customerアソシエー
N+1問題とは SQLクエリが 「データ量N + 1回 」走ってしまい、取得するデータが多くなるにつれて(Nの回数が増えるにつれて)パフォーマンスを低下させてしまう問題です。 次のように、何度もクエリが走ってしまい、その度に0.1msほどかかってしまってます。 Processing by PostsController#index as HTML Post Load (0.2ms) SELECT "posts".* FROM "posts" User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id",
ORM使ってて、便利で余裕キメてたらn+1問題を起こしてた。 n+1問題とは 1回目 のselectで、あるテーブルのレコードの集合を取ってきて、更にまた別のテーブルから先ほど取得したレコードデータ使用して n回 selectクエリを発行してしまう現象だ。 うまく説明出来ないので下の具体例書いてみた 解決策(今回の事案の場合) JOIN使ってクエリを一回にまとめる WHERE IN使ってクエリを2回にまとめる のどちらかの対処でクエリ減らす努力をするべきだった。 具体的にどうやってしまったか friendテーブルからplayerのフレンドのレコードの集合を1回引っ張ってきて、そのレコードからまたplayerテーブルへ、フレンドのplayerデータをn回取りに行っている。 sub _get_friends_info { # 自分のフレンド関係データ(player, target)のレコードの
CORS(Cross-Origin Resource Sharing)って何? CORS(Cross-Origin Resource Sharing)は、その名の通り、ブラウザがオリジン(HTMLを読み込んだサーバのこと)以外のサーバからデータを取得する仕組みです。各社のブラウザには、クロスドメイン通信を拒否する仕組みが実装されています。これは、クロスサイトスクリプティングを防止するためです。Aというサイトに訪問したのに、Bというサイトに向けて個人情報を送っていたというのは困りますよね。例えば、オリジンから読み込んだHTML内のJavaScriptでJSONデータを読み込むとしましょう。JSONデータが同じサーバにあれば普通に読み込めますが、別のサーバにある場合は読み込めません。まぁ実際のところはJSONPという仕組みを使ってできちゃったりしますが、抜け道的なやり方で使われていました。CO
065.音の脱落 性質の似た子音が連続して発音されるとき、片方(特に前)の子音が脱落してしまうことがある。ゆっくりと発音しているときには起こらないが、会話など自然なスピードで発音していると頻繁に発生する現象である。単語それぞれの発音を丁寧にしようとするあまり「want to」の「t」を律儀に2回に分けて発音しなくてもかまわない。 この現象に共通しているのは、「2回にわけて発音しにくい」音の並びになっていること。前の子音を発音する「口の構えだけ」作ったら、その構えのまま次の子音を発音してしまうという流れになっているということである。 さらに詳しく(より厳密に)言うならば、本当は [ t ] や [ p ] の連続において、1つが「脱落(消失)しているわけではなく」、「無破裂の子音と破裂のある子音が連続的に発音されている」と言える。すなわち、「want to」の例で言えば、 [ wɑ́nt-t
garbage in, garbage out / ガイゴー / ギーゴー / ガーベジイン・ガーベジアウト コンピュータによる情報処理において、プログラムに組み込まれたロジックに一切間違いがなくとも、与えられたデータ(入力)が誤っていれば、得られる値(出力)は無効なものにしかならないということを示す警句。直訳すれば「ゴミを入れると、ゴミが出てくる」で、FIFOのもじりと思われる。 内容的には「不正な入力からは不正な出力しか得られない」という、コンピュータ技術者にとっては自明のことがらをいったものにすぎないが、GIGOという表現はコンピュータの歴史のごく初期のころから使われてきた。これは「コンピュータは頭がいい」「間違った入力も直してくれる」といった過大な幻想を抱いているコンピュータ初心者に、コンピュータの特性を説明する平易な言い回しとして定着したようだ。 その後、不適当な入力を拒絶するチ
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? これは Enchant の開発者である Vinay Sahni さんが書いた記事「Best Practices for Designing a Pragmatic RESTful API」1を、ご本人の許可を得て翻訳したものです。 RESTful な WebAPI を設計しようとすると、細かなところで長考したり議論したりすると思います。また、他の API に倣ってやってはみたものの、本当にそれでいいのか、どうしてそうしているのか分からない、何てことも少なくはないと思います。 この記事では、そのようなハマリどころについて Vinay さん
KISS の原則 (英: KISS principle) とは、「Keep it simple stupid.」(シンプルで愚鈍にする)、もしくは「Keep it simple, stupid.」(シンプルにしておけ!この間抜け)、もしくは「Keep it short and simple.」(簡潔に単純にしておけ)という内容の、1960年代の米国海軍において言われた、経験的な原理・原則[1]の略語。その意味するところは、設計の単純性(簡潔性)は成功への鍵だということと、不必要な複雑性は避けるべきだ、ということである。 この言葉は、ロッキードスカンクワークスの技術者のケリー・ジョンソン(1910-1990)によって造られた。 この言葉は、一般には Keep it simple, stupid.(シンプルにしておけ!この間抜け) と解釈されるが、ジョンソン自身は「simple」と「stupi
哲学の木が無くなりました! 『哲学の木』 北海道美瑛町 The tree is named as "Philosophy's tree", it was very popular. 残念な事を皆様にお伝えしなければいけません。 長年、それこそ僕が20代の時からずっと好きだった「哲学の木」、この木を撮影したくて美瑛町に何度も通ったその愛すべき木が、とうとう伐採されました。 ちょうど今、世界の観光客に向けて「撮影マナー」に関する啓蒙活動を始めたばかりでしたので、言葉が出ないほど残念で悲しいです。 もちろん、切り倒した農家さんは断腸の思いだった事でしょう。すでにこれまで何年も前から、何度も困惑されている事を発信されていました。 『たかが一本の木、されど一本の木!』 僕も個人的に危機感を感じてこのブログで発信してきました。 『美瑛町の「哲学の木」が切り倒される?』 『CAPA 5月号で写真家のマナ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く