都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心としたマイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の記事も投稿するようにしています。

Azure Charts をためしてみた

最近、中々忙しくて記事が投稿できていません。アップデートも既に....
ryuchan.hatenablog.com

Azure Charts なるものを見つけたので、ちょっと触ってみます。
azurecharts.com

初期画面はこんな感じです。Solution をクリックします。
f:id:koogucc11:20220310204207p:plain

SLA をクリックすると、
f:id:koogucc11:20220310201123p:plain

各 Azure サービスの SLA がグラフィカルに表示されます。
f:id:koogucc11:20220310201336p:plain
f:id:koogucc11:20220310201416p:plain
f:id:koogucc11:20220310201445p:plain

Status をクリックすると、
f:id:koogucc11:20220310201808p:plain

プレビュー、一般提供の状態がわかります。
f:id:koogucc11:20220310202151p:plain

Timeline をクリックすると、
f:id:koogucc11:20220310202032p:plain

どのリージョンにいつサービスが投入されるか確認できます。
f:id:koogucc11:20220310202318p:plain

Region をクリックすると、
f:id:koogucc11:20220310202627p:plain

色々と機能はあるんですが、一つの機能としてリージョン間のサービスの有無などを確認することができます。
f:id:koogucc11:20220310202727p:plain

Solution をクリックすると、
f:id:koogucc11:20220310202855p:plain

Azure のサービスが表示されます。
f:id:koogucc11:20220310202928p:plain

サービスをいくつか選択します。
f:id:koogucc11:20220310203102p:plain

上部のコンボボックスをクリックすると、
f:id:koogucc11:20220310203226p:plain

選択したサービスのアーキテクチャが表示されます。※これが一番お気に入り。
f:id:koogucc11:20220310203322p:plain

Stories は、導入事例、Learning は MS Learn、Relations はドキュメントなどへリンクされています。

いい感じに情報がまとめられていますね。素晴らしい!

Azure のアップデートをメモ代わりに興味あるところをザックリとまとめてみる (2022年1月分)

 ここ最近、記事書くのを完全にサボっておりました。ボチボチ復活していこうかと思います。近頃、Azure Update が必要なことが多いので、メモ程度に纏めておこうかと思います。すべてのアップデートではないですが、ざっと箇条書き風に纏めていきます。

  • Azure Site Recovery support for ZRS Managed Disks
    azure.microsoft.com
    ASR は、ZRS マネージドディスクをサポートするようになったようです。ZRS マネージドディスクを使用する仮想マシンを選択したセカンダリーリージョンにレプリケートし、保護することができます。プライマリリージョンが ZRS マネージディスクと判断すると、セカンダリリージョンに ZRS マネージディスクを作成するようです。可用性はかなり向上しそうですね。
  • Azure Backup releases new updates for hybrid backups
    azure.microsoft.com
    • Resource Guard を使用したマルチユーザー承認 (プレビュー)
      https://docs.microsoft.com/ja-jp/azure/backup/multi-user-authorization
      バックアップフローに承認という概念を組み込むことができるみたいですね。バックアップを保護するにはいい機能ですね。最近、ランサムウェアでバックアップまでやられたという病院もありました。
      www.topics.or.jp
      "バックアップ管理者がコンテナーに対して重要な操作を実行する場合は、Resource Guard へのアクセスを要求する必要があります。 バックアップ管理者は、セキュリティ管理者に連絡して、このような操作を実行するためのアクセス権の取得の詳細を確認できます。 これは、Azure Active Directory Privileged Identity Management (PIM) または組織が要求する他のプロセスを使用して行います。"
      PIM だと P1 が必要になってしまうのか?
  • Multitasking in the cost analysis preview
    azure.microsoft.com
    リソースのコストを見る箇所で、タブで切り替えて参照できるようになったみたいです。
  • Azure Key Vault increased service limits for all its customers
    azure.microsoft.com
    リージョンあたりのコンテナーごとに、10 秒間に許可される最大トランザクション数が 4000 に増加されました。あれ、日本語はアップデートされてない...英語は 4000 になってます。
    f:id:koogucc11:20220205145517p:plain
  • Azure Kubernetes updates
    • FIPS enabled node pool in Azure Kubernetes
      azure.microsoft.com
      FIPS 140-2 が有効になっている Linux ベースのノード プールを作成できます。セキュリティを強化し、FedRAMP 準拠の一部としてセキュリティを満たすことができるようです。(日本では関係ないですね。)
    • Ultra disks support on AKS
      azure.microsoft.com
      Ultra Disk がサポートされました。
    • Containerd support for Windows in AKS
      azure.microsoft.com
      Windows サーバー コンテナーのコンテナー化をサポートするようになりました。これは、Kubernetes バージョン 1.20 以降で使用できます。
    • Azure Kubernetes support for upgrade events
      azure.microsoft.com
      新しいイベントにより、Azure ポータルまたは CLI を使用してアップグレードの状態をより簡単に表示できます。
    • Kubernetes version alias support in AKS
      azure.microsoft.com
      パッチ番号を指定する必要がないようにセットアップを簡略化しています。たとえば、Kubernetes 1.20.1 の代わりに Kubernetes 1.20 を指定できます。正確なパッチ番号を指定しないことで、選択したマイナー バージョンの最も高いパッチ バージョンに自動的に配置されます。
  • Managed Certificate support for Azure API Management
    azure.microsoft.com
    Azure API Management のマネージド証明書がサポートが、パブリック プレビューになりました。これにより、Azure API Management によってプロビジョニング、管理、自動更新された証明書を使用できます。
  • Azure Monitor
    • Azure Monitor log alerts new version
      azure.microsoft.com
    • A new and improved alert rule creation experience
      azure.microsoft.com
      ウィザード形式で設定できるようになりました。ずっと、プレビューポータルで使用していたため、一瞬何が変わったの?と混乱してしまいました笑
  • Azure Static Web Apps enterprise-grade edge
    azure.microsoft.com
    下記の機能が追加されます。
    • 118 以上のエッジロケーション
    • DDoS 攻撃に対する予防的保護
    • end-to-end のIPv6接続とHTTP/2プロトコルのネイティブサポート
  • Multiple custom BGP APIPA addresses for active VPN gateways
    azure.microsoft.com
    アクティブ/アクティブ VPN ゲートウェイのすべての SKU が、各インスタンスに対して複数のカスタム BGP APIPA アドレスをサポートするようになりました。自動プライベート IP アドレス指定 (APIPA) アドレスは、VPN 接続の BGP IP アドレスとして一般的に使用されます。
  • Azure Backup - オートメーションの更新 - 2021 年
    azure.microsoft.com
    • Recovery Services CLI の一般提供開始: Azure Backup の CLI コマンドが最新の CLI 標準を使用するように更新され、その一般提供が開始されました。大きな変更は行われておらず、お客様はパブリック プレビュー期間中と同様の方法で、コマンドを使用することができます。また、パラメーター セットの拡張機能 (たとえば、コマンドで ARM ID を直接使用する機能) を利用して、スクリプトの作成エクスペリエンスを簡素化することもできます。
    • バックアップ コンテナー ワークロードの PS/CLI サポート: Azure Backup に、バックアップ コンテナーでサポートされているワークロード (PostgreSQL Server の Azure Databases、Azure BLOB、Azure Disk など) に対応した PowerShellCLI のサポートが含まれるようになりました。
    • バックアップ コンテナー ワークロードに対する Terraform のサポートPostgreSQL DB バックアップ、BLOB バックアップ、Disk バックアップ用の Terraform モジュールが公開されました。
    • Azure Backup 用の Bicep テンプレート: Bicep は、宣言型の構文を使用して Azure リソースをデプロイするドメイン固有言語 (DSL) です。簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。Azure Backup ユーザーが Bicep のメリットを利用できるように、Azure VM バックアップ、BLOB バックアップ、Disk バックアップ用の Bicep サンプル テンプレートが公開されました。
    • PS/CLI での新機能のサポート: アーカイブ ストレージ、CMK のユーザー割り当て ID、マネージド ディスク復元用の MSI 認証など、この期間に一般提供が開始された新機能のほとんどに対し、PS/CLI サポートが追加されました。
    • Bicep テンプレートはいいですね。

アップデートではないですが、下記の記事も気になります。Azure DDoS Protection 優秀な結果を残してますね。
azure.microsoft.com

Microsoft は 1 件の 3.47 Tbps の攻撃を軽減、さらに 2.5 Tbps を超える攻撃も 2 件
昨年 10 月、Microsoft は、Azure に 2.4 テラビット/秒 (Tbps) の DDoS 攻撃があり、Microsoft がその軽減に成功したことを報告しました。その後、Microsoft はより大規模な攻撃を 3 件軽減しています。11 月に、Microsoft は、3.47 Tbps のスループットと、アジアでの Azure のお客様を対象としたパケット レート 3 億 4,000 万パケット/秒 (pps) の DDoS 攻撃を軽減しています。これは、史上最大の攻撃であったと考えています。

Azure Update は一カ月に一回だと、手抜きになるし、またすぐ記事書かなくなりそうなので、週一にしようかな。あ、2/1 から 2/6 の分をもう記事にしないと!(サボる気がするw)

また、スキー場いくので、そろそろレンタルやめてちゃんと道具買おうかな。けど、最近あんまりいかないから、ウェア、グローブとゴーグルだけでもいい気がする。

Summary of SQL Server tuning - Part 3 - (How much performance does it improve?)

Also today, I am translating the old Japanese post to English while watching "HAKONE EKIDEN". Which does get first prize, Soka-Univ. or Komazawa-Univ? I am looking forward to know the result. In this time, I try to translate following post.
ryuchan.hatenablog.com

I've been slacking a bit on writing my blog lately. I'd like to resume it again. This is a supplement to post on “
Summary of SQL Server Tuning - Part 1 - (Examine indexes) - 都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo
"

Let's start with a quick way to see how many indexes are missing for a query that executing the against database. Let's issue the following query in SQL Server Management Studio (just a simple count...).

SELECT DB_NAME(database_id) as [Database name],
       count(*) as [Number of expected indexes that do not exist]
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140525/20140525090601.png

Depending on the number of outputs, a sad reality awaits. Because the indexes have not been created, it is possible to grasp the current situation where the DBMS is under a tremendous load. It is difficult to know what to do with just this, so I add “avg_user_impact” to query that used on “Summary of SQL Server Tuning - Part 1 - (Examine indexes) - 都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo". This is the percentage improvement in performance when an index is created.

USE AdventureWorks2012
SELECT gs.avg_user_impact AS [Predicted query performance improvement rate],
       gs.last_user_seek AS [Time of last seek],
       id.statement AS [Table name] ,
       id.equality_columns AS [Column that can be used for equality predicates],
       id.inequality_columns AS [Column that can be used for inequality predicates] ,
       id.included_columns AS [Column required as included columns],
       gs.unique_compiles AS [Number of compilations and recompilations],
       gs.user_seeks AS [The number of seeks generated by the query]
 FROM  sys.dm_db_missing_index_group_stats AS gs
       INNER JOIN sys.dm_db_missing_index_groups AS ig
			ON gs.group_handle = ig.index_group_handle
       INNER JOIN sys.dm_db_missing_index_details AS id
			ON ig.index_handle = id.index_handle
 WHERE id.[database_id] =DB_ID() Order By gs.last_user_seek ASC

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140525/20140525092400.png

The result was an improvement of 83.09%. I think we need to create indexes, but it is necessary to think about it carefully because it can cause performance degradation and capacity increase when updating tables (Be especially careful with the included column....). By adding this column, I think it will be an indicator of which indexes should be prioritized. Good luck and improve your query performance (If I had properly added this in my previous post, I wouldn't have needed to add it....).

Ginger is a really useful website to check my grammar!!
www.getginger.jp

Summary of SQL Server Tuning - Part 2 - (Filtered Index)

Happy New Year to all! I am translating the old Japanese post while watching "Hakone Ekiden". This year, Tokai Univ. team is quite strong. Next, I try to translate following post.
ryuchan.hatenablog.com

Today, I suddenly realized that the "SQL Server Tuning" series ended with "Part 1” lol. So I thought it would be a good idea to end with Part 1, so I'd like to put together Part 2 (Too random ….). In this post, I explain about "filtered index". This feature added in SQL Server 2008.

A filtered index, for example, if the contents of one field of a table are mostly NULL, can create an index that contains only records where the value of that field is not NULL (The filter condition is like what you would specify in a Where clause.).

Let's try with the usual “AdventureWorks" database. The target table is “Sales.SalesOrderDetail".
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415040851.png

Create an index on the “CarrierTrackingNumber" column.
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415041111.png

The number of rows in the Leaf level is "121317", which matches the total number of rows.
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415081730.png

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415082921.png

Similarly, create an index on the “CarrierTrackingNumber" column. However, in this time, set the filter condition to "CarrierTrackingNumber IS NOT NULL".
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415042123.png

The number of rows in the Leaf level is "60919", which is the same as the number of rows excluding the null records.
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415081911.png

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20140415/20140415082903.png

By using "filtered index", you can perform an efficient search that matches certain conditions. Also, since the number of physical rows stored in the index will be reduced, the I / O load will be reduced, and the speed will be improved.

However, it is quite difficult to design an index that takes the business perspective and it requires a lot of its experience.

Ginger is a really useful website to check my grammar!!
www.getginger.jp

Summary of SQL Server Tuning - Part 1 - (Examine indexes)

Happy New Year to all! I decided to translate old Japanese version posts to English for studying English in this year. First of all, I try to translate following post.
ryuchan.hatenablog.com

I would like to summarize the tuning of SQL Server. First, let's look at how to extract queries that don't use indexes, SQL Server tuning makes heavy use of dynamic management views that start with "dm_*". At this time, mainly use the following three tables to find queries that don't use indexes.

  • sys.dm_db_missing_index_group_stats
    Get information about the missing index group.
  • sys.dm_db_missing_index_groups
    Table required to JOIN sys.dm_db_missing_index_group_stats and sys.dm_db_missing_index_details.
  • sys.dm_db_missing_index_details
    Get detailed information about the missing indexes.

You can use the following query to find the missing index. (Using the usual AdventureWorksDB.)

USE AdventureWorks2012
SELECT gs.last_user_seek AS [Time of last seek],
       id.statement AS [Table name] ,
       id.equality_columns AS [Columns that can be used for equality predicates],
       id.inequality_columns AS [Columns that can be used for inequality predicates] ,
       id.included_columns AS [Columns required as included columns],
       gs.unique_compiles AS [Number of compilations and recompilations],
       gs.user_seeks AS [Number of seeks generated by the query.]
 FROM  sys.dm_db_missing_index_group_stats AS gs
       INNER JOIN sys.dm_db_missing_index_groups AS ig
			ON gs.group_handle = ig.index_group_handle
       INNER JOIN sys.dm_db_missing_index_details AS id
			ON ig.index_handle = id.index_handle
 WHERE id.[database_id] =DB_ID() Order By gs.last_user_seek ASC


After executing some queries without indexes, the above query will look like the below. I explain how to improve the area in the red frame.
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20130923/20130923124748.jpg

  • Last seek time
    2013-09-23 03:42:41.773
  • Table name
    [AdventureWorks2012]. [Purchasing]. [PurchaseOrderHeader].
  • Columns that can be used for equality predicates
    [RevisionNumber].
  • Columns that can be used for inequality predicates
    NULL
  • Columns required as inclusive columns
    [PurchaseOrderID], [Status], [EmployeeID], [VendorID], [ShipMethodID], [OrderDate], [ShipDate], [SubTotal], [TaxAmt], [Freight], [TotalDue], [ModifiedDate].
  • Number of compilations and recompilations
    1
  • Number of seeks generated by the query
    2

From the above results, it can be determined that the RevisionNumber column, which has no index is specified in the WHERE clause. In addition, you can see that the following included columns are required.

[PurchaseOrderID], [Status], [EmployeeID], [VendorID], [ShipMethodID], [OrderDate], [ShipDate], [SubTotal], [TaxAmt], [Freight], [ TotalDue], [ModifiedDate]

Therefore, you can solve this problem by executing the following query.

CREATE NONCLUSTERED INDEX IX_PurchaseOrderHeader_RevisionNumber
ON [Purchasing].[PurchaseOrderHeader] ([RevisionNumber])
INCLUDE ([PurchaseOrderID],[Status],[EmployeeID],[VendorID],[ShipMethodID],[OrderDate],[ShipDate],[SubTotal],[TaxAmt],[Freight],[TotalDue],[ModifiedDate])

After executing the above query, if you run the script again, you will get the following result. The problematic rows have disappeared. A proper index has been created.

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20130923/20130923130127.jpg

However, even without this kind of examination, it is possible to handle by checking the execution plan of SQL Server Management Studio during daily development. When the execution plan is displayed, if there are not enough indexes, they will be displayed as shown in the red frame below.

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20130923/20130923132105.jpg

Right-click on the red frame to display the menu as shown below. Click "Missing Index Details..." from the menu.

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20130923/20130923132224.jpg

As shown in the figure below, CREATE INDEX statement will be generated.

http://cdn-ak.f.st-hatena.com/images/fotolife/k/koogucc11/20130923/20130923132428.jpg

The generated query is shown below. It also shows what percentage improvement, etc. (In this example, it seems to improve by 83.0941%.)

/*
Missing Index Details from SQLQuery1.sql - SQLSERVERTEST.AdventureWorks2012 (SQLSERVERTEST\sqlservertest (53))
The Query Processor estimates that implementing the following index could improve the query cost by 83.0941%.
*/

/*
USE [AdventureWorks2012]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [Purchasing].[PurchaseOrderHeader] ([RevisionNumber])
INCLUDE ([PurchaseOrderID],[Status],[EmployeeID],[VendorID],[ShipMethodID],[OrderDate],[ShipDate],[SubTotal],[TaxAmt],[Freight],[TotalDue],[ModifiedDate])
GO
*/

Be sure to check your queries in SQL Server Management Studio on a regular basis.

Ginger is a really useful website to check my grammar!!
www.getginger.jp

年末に記事書いてみる / I'll write an article at the end of the year.

The year is almost over. There weren't many articles this year, either. Next year will be a year of new challenges, so I will try my best to write articles next year. Have a happy new year, everyone!

Following article is still being read. Tuning is an eternal issue.
ryuchan.hatenablog.com

 今年ももうすぐ終わりです。今年も記事数少なかったなぁ。来年はまた新たな挑戦の年になるので、来年こそ記事頑張って書いていきたいと思います。皆様、良いお年を!

 この記事が未だに読まれているなぁ。チューニングは永遠の課題ですね。
ryuchan.hatenablog.com