忍者ブログ

2024.05.21
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


2009.11.01
11月ですね。
たまにはSEぽいことも書きましょうか。

1.SQL Server Express Edition
先日、現地のDBが溢れました。
領域フル、これ以上1行も書けないって状況です。

環境は、Windows Server 2003 上にIISのWebサーバ、
そのアクセスログをSQL Serverに保存しています。

問題だったのは、SQL ServerがExpress Editionであり、
DB領域の上限が4GBという制限があることでした。

MSの製品概要には以下の記述があります。
スケーラビリティとパフォーマンス
サポートしている CPU は 1 つだけですが任意のサーバーにインストールできます。
アドレス指定可能な RAM は 1 GB です。
4 GB のデータベース サイズ(★)

参考:Microsoft SQL Server 2005 Express Edition データシート

最後の1文、「4 GB のデータベース サイズ」ということは、
それを超えると拡張しませんよ」ってことです。

痛たたたた…。
それを現地で、しかも運用開始後
1年以上経過してから気付くってのも間抜けですね。

適切なログローテートの仕組みさえ備えていれば、
通常は起こりえないことです。

仕方ないので、300万件を超える現地テーブルに対し、
CSV形式でデータを保存した後、TRUNCATEを投げました。
初めての経験です、現地DBにTRUNCATE…。
それがどれほど恐ろしいことか…。
(参考:ユーザーの伝票明細テーブルを間違ってTRUNCATEした。 ROLLBACKも効かない。:アルファルファモザイク - 2ちゃんねるスレッドまとめブログ)

運用計画はしっかり立てましょう。

--
2.LIKEと=の挙動差異
これも現地で気付いたことです。

次のSQLの違いについてです。
1)SELECT * FROM hoge WHERE ID = 'A'
2)SELECT * FROM hoge WHERE ID LIKE 'A'
2)はワイルドカードの無いパターン検索です。
どちらもIDが「A」というデータを検索するSQLに見えます。

が、結果が異なりました。

環境は、Windows Server 2003 上の
SQL Serve Enterprise Editionです。

検索結果ですが、以下のようになります。
1)「A」、「 A」、「A 」、「 A」…
2)「A」のみ

不思議ですが、1)のSQLは複数の結果を返します。
1)の場合、「A」の前後に空白が存在するデータも
検索結果に入ってしまっています。

SQLサーバでは、"="は
「前後の空白をTRIMして検索する」らしいです。

猫目が物を知らなかっただけですが、
そもそも同じ検索処理で異なるSQLを書いてはいけない、
ということですね。

え、結末?
直しましたよ、その場でストアドプロシージャを。
コソーリと、ね。
PR

●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

●この記事へのトラックバック
忍者ブログ [PR]
プロフィール
HomePage:

最新の記事
最新のコメント
(01/17)
(05/06)
(03/02)
(03/01)
(03/01)

最新のトラックバック

フリーエリア