投稿

[SQL Server] DBシステムの動作がモッサリするときはインデックスの断片化が原因かもしれない

イメージ
製造現場からの問い合わせ。 「システムが重たいんだけど」 よくあるやつです。 現在稼働しているシステムは設計が悪く、使っているとどんどんデータが溜まってどんどん動作が重くなる。 なので定期的にデータを別テーブルに退避したり、データベースを圧縮したりしていた。 今回もそんなことかと調べてみると何やら様子が違う。 テーブルの容量やデータベースの大きさからすると重くなるにはまだ早い。むむむ? ▲ディスク使用量とかのレポートを見て回る(この画像はイメージです) いろいろと調べたところ、「インデックスの物理統計」というレポートで、推奨されている操作「再構築」というのが目にとまった。 その中には断片化95%とか恐ろしい数値が。 ▲インデックスが断片化してる。これを再構築せよということか。 (この画像はイメージです) ここでインデックスの断片化と再構築について調べる。 すごく簡単に言うと、Windowsのデフラグのようなことらしい。 インデックスの再構築の際には、データベースへのアクセスを停止しておかないといけないみたいなので注意。 ▲インデックスを再構築します。 ▲スッキリ、断片化0% 普段から酷使されてるテーブルはデータの件数が多い上に断片化がひどい。 そんなテーブルにこそ効果てき面のようで、インデックスの使用量がぐっと減ってスッキリする。 一通り再構築をして現場に聞いてみたら、「めっちゃ動きが軽くてストレスなくサクサクです♪」とのことでした。 よかったよかった。 ※本来はデータが溜まりにくかったり、動作が重くなりにくい設計にするべきだと思います。 また、メンテナンスプランを構築するなどして定期的な自動メンテナンスをした方がいいでしょう。 が、諸事情あってそれもなかなかできなんだよなぁ。

RDP Wrapper のListnerがListeningにならない

イメージ
※安全性検証などいろんなことを端折った完全な備忘録です。  ここに書いてあることで起こったトラブルには何ら責任を負えません。 サブマシンにWindows10 Homeがある。 Homeだとリモートデスクトップのホストになれない。これは不便。 そこを無理やりやるのがRDP Wrapper。たいへん愛用している。 RDP Wrapper  https://github.com/stascorp/rdpwrap/releases ちょっと前からRDP Wrapperの動作がおかしかった。 具体的には、以下のようにListener stateが「Not listening」になっている。 これだとほかのマシンから呼び出せない。困る。 いろいろ調べた結果、Windows10 1703 CreatorsUpdateで発生するらしい。 Creators Updateの時に、Windows10 Homeにおいて、rfxvmt.dllが削除されたとのこと。 親切な人が公開してくれている。 64bit  https://github.com/stascorp/rdpwrap/files/1236856/rfxvmt.zip 32bit  https://github.com/stascorp/rdpwrap/files/1238499/rfxvmt.zip 感謝しつつダウンロードし、解凍してできたdllをC:\Windows\System32に格納してPCを再起動。 無事ほかのPCからアクセスできるようになりました。

[VB.NET] 日付文字列を日付型に変換する方法

VB.NETで日付文字列を日付型に変換する方法 DateTime.Parseメソッドを使用する StringからDateTimeへの変換 <VB.NET> 'DateTime.Parse : 現在のカルチャを使用して変換する Dim d As String Dim dt As DateTime d = "2014/12/24 15:32:12" dt = DateTime.Parse(d) Console.WriteLine(dt) '出力 : 2014/12/24 15:32:12 d = "2014/12/24" dt = DateTime.Parse(d) Console.WriteLine(dt) '出力 : 2014/12/24 0:00:00 <VB.NET> 'DateTime.ParseExact : カルチャを指定して変換する Dim d, c As String Dim dt As DateTime d = "2014/12/24 15:32:12" c = "yyyy/MM/dd HH:mm:ss" dt = DateTime.ParseExact(d, c, Nothing) Console.WriteLine(dt) '出力 : 2014/12/24 15:32:12 d = "20141224153212" c = "yyyyMMddHHmmss" dt = DateTime.ParseExact(d, c, Nothing) Console.WriteLine(dt) '出力 : 2014/12/24 15:32:12 d = "2014年12月24日15時32分12秒" c = "yyyy年MM月dd日HH時mm分ss秒" dt = DateTime.ParseExact(d, c, Nothing) Console.WriteLine(dt) '出力 : 2014/12/24 15:32:12 <VB.NET> '文字列操作

[SQL Server] テーブル一覧や列の一覧を取得する方法

SQL Server 2005以降でテーブル一覧や列の一覧を取得する方法 sys.tablesと sys.columnsを使用する テーブル一覧の取得 SQL Server内のユーザテーブルごとに1行のデータが返ってくる <SQL> SELECT * FROM sys.tables sys.tables (Transact-SQL) (Microsoft) 列一覧の取得 ビューやテーブルなど列を持つオブジェクトの列ごとに1行のデータが返ってくる <SQL> SELECT * FROM sys.columns sys.columns (Transact-SQL) (Microsoft) 特定のテーブルの列名取得 以上を応用して特定のテーブルの全ての列名を取得したいときはこうする <SQL> SELECT t.name,c.name FROM sys.tables t INNER JOIN sys.columns c ON t.object_id=c.object_id WHERE t.name='T_HOGE'

[SQL] COUNTするときに条件指定する方法

ExcelでいうCOUNTIF関数のようなことをSQLで行う SQLのCOUNT関数では条件指定ができないので代わりにSUMとCASEを使う 条件を指定してCOUNTする COL1がOKの件数を調べることができる <SQL> SELECT SUM(CASE WHEN COL1 = 'OK' THEN 1 ELSE 0 END) FROM HOGE GROUPIDごとの全件数と、そのグループに対してCOL1がOKの件数を調べることができる <SQL> SELECT GROUPID,COUNT(*),SUM(CASE WHEN COL1 = 'OK' THEN 1 ELSE 0 END) FROM HOGE GROUP BY GROUPID

[SQL Server] SQL Serverでの結合INSERT

SQL Serverで内部結合や外部結合した結果をINSERTする方法 SQL Serverで結合結果をINSERT <SQL> INSERT INTO T_インサート先テーブル(項目) SELECT 項目 FROM T_結合テーブル1 AS T1 LEFT JOIN T_結合テーブル2 AS T2 ON T1.ID = T2.ID WHERE T2.ID IS NULL

[Access SQL] Access SQLで切り捨てを行う方法

OracleではTRUNC関数を使用して切り捨てを行うが、Access SQLにはTRUNC関数はない 代わりにFIX関数を使用する Access SQLのFIX関数 引数の整数部分のみを返す関数 <SQL> 入力 SELECT 数値 , FIX(数値) FROM HOGE; 出力 数値 FIX(数値) 123 123 123.123 123 456.789 456 ○関連サイト 指定した小数桁で切り捨てる FIX関数