ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

Windowsで容量の大きいファイルを探す方法

今回は、タイトルの通りWindowsで容量の大きいファイルを探す方法を調べたのでここにメモします。

ネットを検索してみると今回の要件を解決するにはたくさんの方法があるようですが、個人的に一番使いやすそうだったものを紹介したいと思います。

さっそく実際のやり方ですが、PowerShellで以下のコマンドを入力すると、Cドライブの配下で容量が大きいファイルを上位10個まで表示してくれます。

Get-ChildItem C: -Recurse | Sort-Object Length -Descending | Select-Object -First 10


上記は、Cドライブ配下を検索対象としていますが他のドライブであればここ(上記の例では、"C:")を変更すれば良さそうです。あと、上位10個ではなくてたとえば30個とかであれば最後の"10"を"30"に変更して実行すればOKです。

因みに検索結果に出力されるLengthですが、これの単位はByteです。

検索結果のLength

このやり方でスマートに容量の大きいファイルが探せます。
こういうのは覚えられないので、今後のためにメモしておくことが重要と思います。

今回は簡単ですがここまで。最後までお読みいただきありがとうございました。

Windowsサービスの停止・起動をコマンドで実施する方法

今回は、Windowsサービスの停止・起動をコマンドで実施する方法を調べたので備忘としてここに記載します。

netコマンドでWindowsサービスの停止・起動を行う

早速ですが、Windowsサービスの停止・起動を行うコマンドですが”net”と呼ばれるものがあります。使い方は以下の通りでとっても簡単です。

Windowsサービス起動
net start "<サービス名>"

以下はnetコマンドでのサービス起動の実行例です。例としてTomcat8を起動しています。

netコマンドでサービス起動実行例
Windowsサービス停止
net stop "<サービス名>"

以下はnetコマンドでのサービス停止の実行例です。例としてTomcat8を停止しています。

netコマンドでサービス停止実行例

scコマンドでWindowsサービスの停止・起動を行う

上記までnetコマンドでWindowsサービスの起動と停止を見てきました。実は同じようにWindowsのサービスの起動や停止を行えるコマンドは、もう一つあります。”sc"コマンドと呼ばれるものです。まずはこちらも使い方を見ていきます。

Windowsサービス起動
sc start "<サービス名>"

以下はscコマンドでのサービス起動の実行例です。こちらも例としてTomcat8を起動しています。

scコマンドでサービス起動実行例
Windowsサービス停止
sc stop "<サービス名>"

以下はscコマンドでのサービス停止の実行例です。例としてTomcat8を停止しています。

scコマンドでサービス停止実行例

netコマンドとscコマンドの違いはあるか?

netコマンドとscコマンドの使い方を簡単に紹介しました。通常使う分にはどちらを使っても問題ないと思います。

因みにこれらの違いについてですが、以下サイトを引用させていただきますと、scコマンドは非同期(サービスの起動完了を待たずにコマンド制御が戻る)で、 netコマンドは同期(サービスの起動完了を待ってコマンド制御が戻る)となるようです。
sc start - Windowsコマンド虎の巻

たとえばバッチファイルを作成していて、スクリプトの中でサービス起動(もしくは停止)を完全に待ってから処理をしたい場合などには、同期するnetコマンドを使うといった具合でしょうか。上記違いは一応頭に入れておいたほうが良さそうですね。

GUIWindowsサービスの停止や起動を行う

本題からは逸れますが、まずはコマンドではなくGUIWindowsサービスの停止・起動についても軽く触れておきます。

Windowsのメニューから、Windows管理ツール - サービスを選択します。

メニューからサービス起動

上記押下すると、以下のようなサービス画面が開きます。

GUIでサービス起動

サービスを起動したい場合は、該当のサービスを選択して右クリックから「開始」を押下すればOKです。停止も手順は同じです。

GUIでサービス起動

因みに、上記のサービス画面は「Windows + R」押下し、ファイル名を指定して実行画面を開き「services.msc」を入力してOKを押下するだけで簡単に開けます。

ファイル名を指定して実行でサービスを開く

まとめ

いかがでしたでしょうか。私自身、普段サービスを起動・停止する際はGUIで実施していたのですがコマンドで実施する方法も何となく知ってたら役に立ちそうかなという思いで調べてみました。

netコマンドはサービスの起動や停止以外にも様々な用途で使うことができます。scコマンドについても、単純サービスの起動・停止だけではなくサービスに関するあらゆる設定を行うことができるみたいですので、詳しく知りたい方は別途確認していただければと思います。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

SQL Server の名前を指定する形式について

先日、SQL Serverの書籍を見ていたところSQL Serverのログイン時にサーバー名を指定するときに接続プロトコルを指定する書式を知りました。具体的には以下のような感じで指定します。

tcp:APPHOST

上記は、記載の通り接続プロトコルTCPを使って接続する書式になります(APPHOSTは、サーバーのホスト名です)。
他にもlpc(共有メモリ)も指定できたりするみたいです。

詳細は以下のMicrosoftのドキュメントをご参照いただければと思います。
SQL Server へのログイン - SQL Server | Microsoft Docs


こんな知識役立たないとは思いつつも、いつか使えると思ってここにメモしておきます。
今回は簡単な記事ですが、ここまで。

最後までお読みいただきありがとうございました。この辺で失礼いたします。

SQL Serverのデータベースの互換性レベルとは?

今回は、SQL Serverのデータベースの「互換性レベル」について調べたことを簡単に備忘として残したいと思います。

互換性レベルとは?

早速、互換性レベルについてですがまずは結論から。

互換性レベルとは、SQL Serverのバージョンごとの互換性を表す仕組みのことのようです。
通常ソフトウェアにはバージョン毎に互換性があったり、なかったりしますがそのような意味と同じようです。たとえば、互換性レベルはバージョンアップやリストア、バックアップに影響するようです。

そして、この互換性レベルごとにサポートされる機能などが変わってくるため、安易に変えてしまうとよくなさそうです。ここらへんの互換性レベルが変わることにより、何が起きるかは公式ページに記載がありますので適宜参照する必要がありそうです。
ALTER DATABASE 互換性レベル (Transact-SQL) - SQL Server | Microsoft Docs


SQL Serverのバージョン毎にサポートされる互換性レベルが決まっています。以下は、各SQL Serverでサポートされる互換性レベルが記載された場所を抜粋したものです。

SQL Server互換性レベルのサポート表

上記の表は以下のページから引用しました。
ALTER DATABASE 互換性レベル (Transact-SQL) - SQL Server | Microsoft Docs

互換性レベルの確認方法

それでは互換性レベルの確認方法を紹介します。

まずは、簡単にGUIで見る方法です。SSMSで該当のデータベースを選択し、右クリック - プロパティを選択します。するとデータベースのプロパティ画面が開きますので、「ページの選択」ペインのオプションを選択すると、画面上部に現在の互換性レベルが確認できます。

データベースのプロパティ - オプション欄

もちろん、SQLでも確認できます。以下のSQLを実行することで確認できます。引数は、確認するデータベース名に置き換えてください。

SELECT compatibility_level  
FROM sys.databases WHERE name = 'AdventureWorks2016';
SQLで互換性レベルを確認する。

互換性レベルの変更方法

あまり実施することはなさそうですが、互換性レベルの変更方法も紹介します。SQLで実施する場合は以下のようになります。SSMSで実施する場合は、先ほど確認した画面で互換性レベルのところがプルダウンになっていて簡単に変更できるようになっています。

ALTER DATABASE AdventureWorks2016
SET COMPATIBILITY_LEVEL = 120;  

まとめ

いかがでしたでしょうか。普段意識することはないかもしれません。データベースの移行とかで必要な知識になりそうですね。ちょっと頭の隅にでもおいておこうと思います。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

RDBの論理削除について

今回は、RDBのテーブル設計においてよく見る「論理削除」について色々とネットや書籍なりで調べたものを自分なりにまとめておこうと思い、記事にしました。

論理削除とは?

まずは簡単に論理削除という言葉の定義から確認します。

論理削除とは、DELETE文によりテーブルからデータを物理的に削除するのではなく、論理的に削除することを指します。

例えば、以下の会員テーブルを例にして論理削除をみてみましょう。
■会員テーブル

id 名前 削除フラグ
1 田中 0
2 佐藤 0
3 鈴木 1
4 吉田 0

このテーブルには削除フラグと呼ばれるカラムがあります。このカラムの値が"1"であれば削除済、"0"であれば未削除を表すというルールを作ります。上記の例であれば、id=3の鈴木さんは削除済みとなり、他の会員は未削除という状態です。

上記のようなルールの場合には、ある会員を削除したいとなった場合にはこの削除フラグを"1"(削除済)に更新することで論理的に削除した状態を表現します。これが論理削除と呼ばれるものです。

論理削除のメリット

よく言われる論理削除のメリットは以下になると思います。

  • ユーザーからは削除されたように見せるが、実際にはデータが自体は念のため残しておきたいといった要件を満たせる
  • 削除した後に、すぐに戻せる(あくまで論理的に削除しただけなので、削除フラグを更新することで簡単に元に戻せる)

論理削除のデメリット

反対によく言われる論理削除のデメリットは以下になると思います。

  • データ抽出のSQLクエリに削除フラグの条件が必要になる
  • 論理削除すると、データがテーブルに残るのでディスクを圧迫する
  • 論理削除のカラムはカーディナリティが低いので、パフォーマンスが悪い

考察

上記の通り、メリットとデメリットどちらも見てきました。
結局のところ、論理削除は使って良いのかというところですが、これは他でもよく言われていることですが、積極的に使うものではないと思います。
個人的にはデメリットの「データ抽出のSQLクエリに削除フラグの条件が毎度必要になる」がとてもやっかいだと思いました。

抽出条件に必ず削除フラグを付与しなくてはならないのは、かなり面倒ですしパフォーマンスも悪いとなるとやはり色々と問題を抱えていると思います。

それで、論理削除を使わない場合はどうするのかというと、対処法としては削除するデータは別テーブルに移動することが良いと言われています。
例えば、削除済会員テーブルを別途用意して会員テーブルから物理削除したデータを削除済会員テーブルに登録するということです。
そうすることで、元の会員テーブルから削除フラグをなくせて、抽出条件もきれいになるので良いですね。

また、すでに論理削除を運用している場合にはViewを上手く使うことでSQLクエリの抽出条件をシンプルにすることはできます。
ただし、これはあくまでも見かけ上の解決手段となりパフォーマンスをよくすることはできません。

まとめ

論理削除はすでに色々と議論されている話題ですが、その内容を自分なりに理解しながら整理することでより理解を深めることができました。

実際のところ、論理削除を絶対使ってはダメ!!ということではなく、そのメリデメをちゃんと理解して使う分には問題ないというところみたいです(これは多くのことにいえることですが)。
確かに論理削除フラグ便利ですよね。私が今まで見てきた現場でも必ずといって良いほど論理削除フラグを使っていたのですが、あれは場合によってはちょっとまずい設計だったのかなと改めて考えさせられました。

今回も最後までお読みいただきありがとうございました。この辺で失礼いたします。

参考

今回の論理削除について考えるにあたり、以下の資料を参考にさせていただきました。どれもとてもよく考察されていて、なるほどと思うところがたくさんありましたので未読の方は読まれるといいかと思います。PostgreSQLMySQLで説明している資料もありますが、多くの部分が個々のDBMSによらない内容ですので参考になると思います。

SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 | PPT
MySQLで論理削除と正しく付き合う方法 | PPT
PostgreSQLアンチパターン | PPT

SQL Serverのマテリアライズドビューについて

SQL Serverにおけるマテリアライズドビューについて軽くお話していきたいと思います。

マテリアライズドビューについて

まずは、マテリアライズドビューを簡単に紹介します。これは「実体を持つビュー」とよく言われています。通常のビューが実体を持たないのに対して、実体を持つビューであるマテリアライズドビューはどのようなものでしょうか。

マテリアライズドビューは簡単に言えば、テーブルの「ある時点の断面」を切り取ったデータを持つビュー、というイメージが合っていると思います。実体を持っているため、実体を持たないビューへの問い合わせより素早くデータを取得できることになるようです。

また、通常はビュー自体にインデックスを付与することはできませんが、マテリアライズドビューにはインデックスを付与することができます。実体を持つビューということなので、ほぼテーブルと同じような扱いになります。

SQL Serverでマテリアライズドビューを定義する?

それでは、マテリアライズドビューについて簡単に説明しましたので実際にSQL Serverでどのように定義して使うかを紹介しようと思います。

しかし、実はSQL Serverではマテリアライズドビューが実装されていないようです。。少しネットを見てみましたが、OraclePostgreSQLでは、実装されているようでした。

Microsoftのドキュメントにマテリアライズドビューがあるので、てっきり使えるのかなと思いましたが以下キャプチャにある通り、適用対象が「Azure Synapse Analytics」のみとなっています。ですので、通常のSQL Serverでは使えないということだと思います。

Microsoftのドキュメント

それでは、SQL Serverでマテリアライズドビューみたいな機能が欲しい場合はどうするか?ですが、どうやらネットで調べている限りはインデックス付きビューを使ったりするそうです。

通常は、ビューにインデックスを付与することはできませんが、SQL Serverではインデックスを付与できたりするみたいです。ただし、やや使い方が難しそうなのでドキュメントを熟読する必要がありそうでした。

おわりに

いかがでしたでしょうか。ちょっと拍子抜けした記事となってしまいました。SQL Serverでマテリアライズドビュー使えないようなのでやや驚きました。SQL Serverで実装していないことから、そこまでマテリアライズドビューに対して需要がなかったりするのでしょうか。

確かに特に使わなくても、他の機能で代用できたりできるためいわゆる必須機能ではないので実装していないのでしょうか。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

SQL Serverのインデックスの再編成のやり方

タイトルの通り、SQL Serverにおけるインデックスの再編成のやり方について方法を確認したいと思います。
SQL Serverではインデックスの再編成のやり方としては”再構築”と呼ばれるものと”再編成”と呼ばれるものがあります。どちらも目的は同じで、インデックスの断片化を解消することですがその処理の具体的な内容が異なるようです。

以下では実際にそれぞれ簡単にインデックスの再編成のやり方を見ていきます。

インデックスの再構築

まずは、インデックスの再構築から簡単に紹介します。こちらは後程紹介する再編成と比較して、より本格的な再編をするためのコマンドになります。

あるインデックスを指定してインデックスの再構築をする場合は、以下のコマンドを実行します。

ALTER INDEX <インデックス名> REBUILD;

テーブル名を指定してそのテーブルのすべてのインデックスを再構築する場合は、以下のコマンドを実行します。

ALTER INDEX ALL ON <テーブル名> REBUILD;

インデックスの再編成

次はインデックスの再編成を紹介します。先ほどは紹介した再構築と比べて簡易な再編を行うことができます。

あるインデックスを指定してインデックスの再編成をする場合は、以下のコマンドを実行します。

ALTER INDEX <インデックス名> REORGANIZE

どちらをどのように使い分ければよいか?

これについては、やや古いですがMicrosoftのブログにそれぞれの特徴やその使い分けるタイミングについて記載がありました。とてもわかりやすく参考になりましたので、以下掲載させていただきます。
docs.microsoft.com

おわりに

いかがでしたでしょうか。簡単にですが、SQL Serverにおけるインデックスの再編成のやり方を記載しました。
今回は主にコマンドのみを紹介しましたが、本来であればその実行するタイミングなどを詳しく紹介したかったのですがまだまだ勉強中ですので今後の課題として後に取っておきます。。

実は、上記のコマンドを使わないでもたとえば一度インデックスを削除してもう一度作成しても問題ありません。
ただし、もし再作成時にエラーが発生してしまうと新たに作成するまでは当然ながらインデックスがない状態ですので注意したほうがよさそうです。

今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。