布団が俺を呼んでいる

丘山大一のぶろぐ

SQL Server の 容量を取得する

SQL Server の容量・サイズとは何を指すのか。
よくわからない。
よって、ここに書いてあることもわりと適当。
大体あっているといいなあ。

GUI で見るとき

Management Studio で データベース上で右クリック、
コンテキストメニュー「プロパティ」-「全般」から見るとき。
・サイズ: MDF + LDF ファイルの大きさ。
・使用可能領域:サイズ - (MDF ファイル内で既に使用されている領域 + LDF ファイル内で既に使用されている領域)

コンテキストメニュー「プロパティ」-「ファイル」から見るとき。
・初期サイズ(MB):現在のファイルの大きさ。ファイル単位。上記のサイズ = 初期サイズ(MB)の合計

SQLで確認するとき

SELECT file_id, name, type_desc, physical_name, size FROM sys.database_files ;  
・コンテキストメニュー「プロパティ」-「ファイル」から見るとき。 に相当。

SELECT sum(size) from dbo.sysfiles
もしくは
SELECT CONVERT(numeric(18,2), sum(size)*8192/1048576) from dbo.sysfiles
・コンテキストメニュー「プロパティ」-「全般」から見るとき。 サイズ。 に相当。
・このクエリの「size」 は8KBページ単位なので、おおざっぱに計算してやった方が見やすい。

select CONVERT(numeric(18,2),FILEPROPERTY(file_name(fileid),'SpaceUsed')*8192.0/power(1024.0,2)) from dbo.sysfiles where fileid = 1
・データベースのMDF のうち、使用済の領域。
・除算かませているので若干結果が怪しくなる。

EXEC sp_spaceused
・これまで上記で書いてきた情報をまとめてとれる感じ。(ファイルごとのサイズはとれないけど……)
・使用済の領域についてはコッチの方が正確な気がする。(根拠なし)
・結果セットができるストアド ということもあり、軽く見る分には便利だが他の処理には組み込みにくい。


ところで

「SQL」という単語と「クエリ」という単語がごっちゃになっています。
ゴフ(吐血
分かっているけど使い分けられない。




SQL Server 2016の教科書 開発編

新品価格
¥3,888から
(2016/9/26 21:15時点)

コメントを書く

布団が俺を呼んでいる | Firebird のお勉強 計算時の小数点以下の有効範囲

布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 計算時の小数点以下の有効範囲

SQL上で計算した時の結果がどうにも理解できなくてはまりました。
しかし、同じことを考える人はいるもので。結論はStack overflow に出ています。

以下、ちょっと解説。

計算時の有効桁数具体例
Firebird の 計算時の小数点以下の有効桁数は、「計算に使用した型が持つ有効範囲」を足し合わせたものになります。
……と、こう書いても意味不明なので具体例。

SELECT cast (1/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000000000/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000/999999999999.000000 AS numeric(18,13)) FROM HOGE;
SELECT cast (1E0/999999999999 AS numeric(18,13)) FROM HOGE;

結果は、
0.0000000000000
0.0000000000010
0.0000000000010
0.0000000000010
となります。

1つ目は、分子・分母両方とも小数点以下が存在しません。そのため、計算時の有効桁数は「0 + 0 = 0」です。有効桁数が足りないので、結果表示時にnumeric(18,13)を指定しても、結果は「0.0000000000000」となります。
2つ目は、分子に小数点以下の桁数が存在しています。そのため、計算時の有効桁数は「12 + 0 = 12」です。
3つ目は、分子・分母両方に小数点以下が存在します。そのため、計算時の有効桁数は「6 + 6 = 12」です。
4つ目は、分子に「小数点以下を表示するための記号」である「E0」が指定されているため、計算時の有効桁数はdouble 型となるようです。

テーブルで確認してみる

簡単なテーブルを作成してみます。

CREATE TABLE HOGE(
    KEY_NO integer,
    VALUE_INT integer,
    VALUE_NUMERIC_SHORT numeric(18,1),
    VALUE_NUMERIC_LOMG numeric(18,13)
);
INSERT INTO HOGE VALUES(1,1,99999,99999);
SELECT cast (VALUE_INT /VALUE_NUMERIC_SHORT AS numeric(18,13)) FROM HOGE where KEY_NO = 1;
SELECT cast (VALUE_INT /VALUE_NUMERIC_LOMG AS numeric(18,13)) FROM HOGE where KEY_NO = 1;

結果はこうなります。
0.0000000000000
0.0000100001000

理屈は上記と一緒ですね。

無理矢理計算するなら、さらにCASTをかませるという手もなくはありません。

SELECT cast (VALUE_INT / (cast (VALUE_NUMERIC_SHORT AS numeric(18,13))) AS numeric(18,13)) FROM HOGE
where KEY_NO = 1;

こうすれば、
0.0000100001000
となります。


達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

新品価格
¥2,592から
(2016/8/14 21:47時点)

コメントを書く