まえがき
こんにちは、Habrの読者の皆さん!
実現したアイデア、経験、および出版に休息を与えないすべての情報を作成すると、遅かれ早かれ、以前に書かれた情報の流れ全体に論理的なポイントがつきます。 この記事は、私が以前に発表したテキストのゆるい表現とより自由なスタイルでのすべての記事とは異なります。また、MS SQL Serverでのすべての経験のプレゼンテーションも完了します。
この記事は、記事「
T-SQLを使用したデータベースの探索」への追加であり、DBA MS SQL Serverの動作を支援するために作成されたSRV管理データベースとユーティリティプロジェクトについても簡単に説明します。
一般的なDBおよびDBMSの研究に役立つアイデア
埋め込みテーブルのサイズを決定するには、次のビュー[inf]。[VInnerTableSize]を作成できます。
ビューの実装[inf] [VInnerTableSize]USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vInnerTableSize] as
このビューを使用すると、システムテーブルの過剰な成長を避けるために、システムテーブルの成長を制御できます。
システムビュー
[sys]、[Sql_logins]および
[sys]。[Syslogins]を使用すると、頬骨およびWindows入力のログインを取得できます。
MS SQL Serverのインスタンスのエージェントタスクの次のシステムビューも重要です。
1)
[msdb]。[Dbo]。[Sysjobactivity] -アクティブなタスク
2)
[msdb]。[Dbo]。[Sysjobhistory] -タスク実行履歴
3)
[msdb]。[Dbo]。[Sysjobs_view]および
[msdb]。[Dbo]。[Sysjobservers] -タスク
4)
[msdb]。[Dbo]。[Sysjobschedules] -ジョブスケジュール
5)
[msdb]。[Dbo]。[Sysjobsteps] -ジョブステップ
6)
[msdb]。[Dbo]。[Sysjobstepslogs] -ジョブステップのログ記録
また、複数のタスクがどのスケジュールに割り当てられているかを知るには、次のビュー[inf]。[VScheduleMultiJobs]を作成するだけで十分です。
ビューの実装[inf] [VScheduleMultiJobs] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [inf].[vScheduleMultiJobs] as with sh as( SELECT schedule_id FROM [inf].[vJobSchedules] group by schedule_id having count(*)>1 ) select * from msdb.dbo.sysschedules as s where exists(select top(1) 1 from sh where sh.schedule_id=s.schedule_id) GO
このビューは、別のタスクの変更を引き起こさないように、1つのタスクのスケジュールの急激な変更を回避します。
データベースオブジェクトの説明に関する情報を取得するには、詳細プロパティを使用できます(システムビュー
[sys]。[Extended_properties] )。 便宜上、次のビューを作成できます。
1)[inf] [VObjectDescription]:
ビューの実装[inf] [VObjectDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [inf].[vObjectDescription] as select SCHEMA_NAME(obj.[schema_id]) as SchemaName ,QUOTENAME(object_schema_name(obj.[object_id]))+'.'+quotename(obj.[name]) as ObjectName ,obj.[type] as [Type] ,obj.[type_desc] as [TypeDesc] ,ep.[value] as ObjectDescription from sys.objects as obj left outer join sys.extended_properties as ep on obj.[object_id]=ep.[major_id] and ep.[minor_id]=0 and ep.[name]='MS_Description' where obj.[is_ms_shipped]=0 and obj.[parent_object_id]=0 GO
2)親を持つオブジェクトの説明-[inf]。[VObjectInParentDescription]ビューを使用:
ビューの実装[inf] [VObjectInParentDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [inf].[vObjectInParentDescription] as select SCHEMA_NAME(obj.[schema_id]) as SchemaName ,QUOTENAME(object_schema_name(obj.[parent_object_id]))+'.'+quotename(object_name(obj.[parent_object_id])) as ParentObjectName ,QUOTENAME(object_schema_name(obj.[object_id]))+'.'+quotename(obj.[name]) as ObjectName ,obj.[type] as [Type] ,obj.[type_desc] as [TypeDesc] ,ep.[value] as ObjectDescription from sys.all_objects as obj left outer join sys.extended_properties as ep on obj.[parent_object_id]=ep.[major_id] and ep.[minor_id]=obj.[object_id] and ep.[name]='MS_Description' where obj.[is_ms_shipped]=0 and obj.[parent_object_id]<>0 GO
3)パラメーターの説明-[inf]。[VParameterDescription]ビューを使用:
ビューの実装[inf] [VParameterDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [inf].[vParameterDescription] as select SCHEMA_NAME(obj.[schema_id]) as SchemaName ,QUOTENAME(object_schema_name(obj.[object_id]))+'.'+quotename(object_name(obj.[object_id])) as ParentObjectName ,p.[name] as ParameterName ,obj.[type] as [Type] ,obj.[type_desc] as [TypeDesc] ,ep.[value] as ParameterDescription from sys.parameters as p inner join sys.objects as obj on p.[object_id]=obj.[object_id] left outer join sys.extended_properties as ep on obj.[object_id]=ep.[major_id] and ep.[minor_id]=p.[parameter_id] and ep.[name]='MS_Description' where obj.[is_ms_shipped]=0 GO
4)テーブル列の説明-[inf]。[VColumnTableDescription]ビューを使用:
ビューの実装[inf]。[VColumnTableDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vColumnTableDescription] as select SCHEMA_NAME(t.schema_id) as SchemaName ,QUOTENAME(object_schema_name(t.[object_id]))+'.'+quotename(t.[name]) as TableName ,c.[name] as ColumnName ,ep.[value] as ColumnDescription from sys.tables as t inner join sys.columns as c on c.[object_id]=t.[object_id] left outer join sys.extended_properties as ep on t.[object_id]=ep.[major_id] and ep.[minor_id]=c.[column_id] and ep.[name]='MS_Description' where t.[is_ms_shipped]=0; GO
5)ビュー列の説明-[inf]。[VColumnViewDescription]ビューを使用:
ビューの実装[inf] [VColumnViewDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vColumnViewDescription] as select SCHEMA_NAME(t.schema_id) as SchemaName ,QUOTENAME(object_schema_name(t.[object_id]))+'.'+quotename(t.[name]) as TableName ,c.[name] as ColumnName ,ep.[value] as ColumnDescription from sys.views as t inner join sys.columns as c on c.[object_id]=t.[object_id] left outer join sys.extended_properties as ep on t.[object_id]=ep.[major_id] and ep.[minor_id]=c.[column_id] and ep.[name]='MS_Description' where t.[is_ms_shipped]=0; GO
6)DBスキーマの説明-[inf]。[VSchemaDescription]ビューを使用:
ビューの実装[inf] [VSchemaDescription] USE [_] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vSchemaDescription] as select SCHEMA_NAME(t.schema_id) as SchemaName
データベースオブジェクトを文書化するための高度なプロパティを追加または編集するには、サードパーティのユーティリティを使用することをお
勧めします(たとえば、
dbForgeを使用します)。
ただし、これは次のクエリでも実行できます。
説明を変更または削除するには、ストアドプロシージャ
sp_updateextendedpropertyおよび
sp_dropextendedpropertyをそれぞれ使用するだけで十分です。
DBMS全体の調査の一環として、次のシステム表現も役立ちます。
1)
[sys]。[Dm_os_performance_counters] -パフォーマンスカウンターの値
2)
[sys]。[Dm_os_schedulers] -タスクスケジューラ
3)
[sys]。[構成] -
構成情報
4)セッションIDをWindowsスレッドIDにマップするために、次のビュー[inf]。[VSessionThreadOS]を作成できます。
ビューの実装[inf] [VSessionThreadOS] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create view [inf].[vSessionThreadOS] as SELECT STasks.session_id, SThreads.os_thread_id FROM sys.dm_os_tasks AS STasks INNER JOIN sys.dm_os_threads AS SThreads ON STasks.worker_address = SThreads.worker_address WHERE STasks.session_id IS NOT NULL; GO
5)tempdbデータベースファイルの数に関する問題を見つけるには、次のビュー[inf]。[VServerProblemInCountFilesTempDB]を作成できます。
ビューの実装[inf] [VServerProblemInCountFilesTempDB] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create view [inf].[vServerProblemInCountFilesTempDB] as Select session_id, wait_type, wait_duration_ms, blocking_session_id, resource_description, ResourceType = Case When Cast(Right(resource_description, Len(resource_description) - Charindex(':', resource_description, 3)) As Int) - 1 % 8088 = 0 Then 'Is PFS Page' When Cast(Right(resource_description, Len(resource_description) - Charindex(':', resource_description, 3)) As Int) - 2 % 511232 = 0 Then 'Is GAM Page' When Cast(Right(resource_description, Len(resource_description) - Charindex(':', resource_description, 3)) As Int) - 3 % 511232 = 0 Then 'Is SGAM Page' Else 'Is Not PFS, GAM, or SGAM page' End From sys.dm_os_waiting_tasks Where wait_type Like 'PAGE%LATCH_%' And resource_description Like '2:%' GO
6)データをtempdbデータベースに書き込む際の問題を調べるには、次のビュー[srv] [VStatisticsIOInTempDB]を作成できます。
[srv]ビューの実装[VStatisticsIOInTempDB] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create view [srv].[vStatisticsIOInTempDB] as SELECT files.physical_name, files.name, stats.num_of_writes, (1.0 * stats.io_stall_write_ms / stats.num_of_writes) AS avg_write_stall_ms, stats.num_of_reads, (1.0 * stats.io_stall_read_ms / stats.num_of_reads) AS avg_read_stall_ms FROM sys.dm_io_virtual_file_stats(2, NULL) as stats INNER JOIN master.sys.master_files AS files ON stats.database_id = files.database_id AND stats.file_id = files.file_id WHERE files.type_desc = 'ROWS' GO
7)すべてのデータベースの最新のバックアップに関する情報を表示するために、次のビュー[inf] [VServerLastBackupDB]を作成できます。
ビューの実装[inf] [VServerLastBackupDB] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vServerLastBackupDB] as with backup_cte as ( select bs.[database_name], backup_type = case bs.[type] when 'D' then 'database' when 'L' then 'log' when 'I' then 'differential' else 'other' end, bs.[first_lsn], bs.[last_lsn], bs.[backup_start_date], bs.[backup_finish_date], cast(bs.[backup_size] as decimal(18,3))/1024/1024 as BackupSizeMb, rownum = row_number() over ( partition by bs.[database_name], type order by bs.[backup_finish_date] desc ), LogicalDeviceName = bmf.[logical_device_name], PhysicalDeviceName = bmf.[physical_device_name], bs.[server_name], bs.[user_name] FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] ) select [server_name] as [ServerName], [database_name] as [DBName], [user_name] as [USerName], [backup_type] as [BackupType], [backup_start_date] as [BackupStartDate], [backup_finish_date] as [BackupFinishDate], [BackupSizeMb],
8)同様のビュー[inf]。[VServerBackupDB]を作成して、すべてのバックアップに関する情報を取得できます。
ビューの実装[inf] [VServerBackupDB] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [inf].[vServerBackupDB] as with backup_cte as ( select bs.[database_name], backup_type = case bs.[type] when 'D' then 'database' when 'L' then 'log' when 'I' then 'differential' else 'other' end, bs.[first_lsn], bs.[last_lsn], bs.[backup_start_date], bs.[backup_finish_date], cast(bs.[backup_size] as decimal(18,3))/1024/1024 as BackupSizeMb, LogicalDeviceName = bmf.[logical_device_name], PhysicalDeviceName = bmf.[physical_device_name], bs.[server_name], bs.[user_name] FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] ) select [server_name] as [ServerName], [database_name] as [DBName], [user_name] as [USerName], [backup_type] as [BackupType], [backup_start_date] as [BackupStartDate], [backup_finish_date] as [BackupFinishDate], [BackupSizeMb],
9)[inf]として表示される重複行を削除するために、期待値統計(
SQL Server'a Expectation Statistics記事から、
またはどこが痛いかを教えてください )の表示を改善することもでき
ます 。
ビューの実装[inf] [VWaits] USE [ ] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [inf].[vWaits] as WITH [Waits] AS (SELECT [wait_type],
一般的なDBおよびDBMS管理のためのSRV DB
記事を書く前に、SRVデータベースを作成しました。これは、得られた経験と知識を考慮して修正および補足されました。
C#.NETデータベース管理者を支援する他のユーティリティプロジェクトも開発されています。
ここからプロジェクトにアクセスでき
ます 。
ルートには「Description」ファイルがあり、各プロジェクトについて簡単に説明されています。
これらのソリューションはオープンであり、自由に配布されます。
また、コメントとメッセージの形でフィードバックを残してくれたHabrの親愛なる読者のおかげで、SRVデータベースのプロジェクトを改善することができました。 どうもありがとう!
ただし、外部ソースで説明されている既存のアプローチとソリューションは、慎重に分析する必要があることに注意することが重要です。 これらのメソッドは、タスクに対して機能しない場合があります。 例で解決されるタスクと、タスクのパラメーターと条件の違いに特に注意を払う必要があります。負荷、処理される情報の量、頻度、ビジネスタスクの特異性など。 たとえば、40分間機能する手順は1日に1回呼び出すのに適していますが、より高い頻度でプロセスを開始する必要がある場合、このソリューションは機能しない場合があります。
特定のタスクに対する独自のアプローチを見つけたら、共有することを忘れないでください! したがって、新しいタスクのソリューションとアイデアの検索を容易にする「グローバルな知識ベース」を補充します。
まとめ
高度なプロパティの形式での自己文書化など、MS SQL Serverの他のいくつかの有用なシステム表現が検討されました。
思考とアイデア
既にお気付きのように、MS SQL Serverは、グラフテーブル(
MS SQL Server 2017を使用 )およびドキュメント指向データ(XML、MS SQL Server 2016および
JSONを使用 )の形式でNoSQLを十分なレベルで既にサポートしています。
しかし、エドガー・フランク・コッドが20世紀の70年代に指摘したように(情報源[1]による)、リレーショナルモデルでは、単純な関係ではないと考えることができます。 つまり、あるテーブルを別のテーブルに埋め込み、あるテーブルから別のテーブルを継承できます(テーブルはリレーショナルモデルのリレーションであることに注意してください)。 テーブルの継承は、いくつかのDBMS、たとえば同じ
PostgreSQLで実装され
ます 。 しかし、私は投資の実施を見たことはありません。 投資と継承の両方を実装し、これらの複雑な関係を処理するメカニズムを設定すると、JSONおよびXML形式を一般化し、いわゆるNoSQLテクノロジー(プログラミング言語での演算子オーバーロードの類似物ですが、DBMSインデックス、集計、統計を完全にカバーするDBMS)を取得できます、サービスなど)。 さらに、他のすべてのデータモデルを十分にカバーできますが、複雑な関係の特定の拡張と定義を備えた宣言型SQLクエリ言語によって処理されます。
MS SQL Serverの開発速度を見て、いつかは複雑な関係の実現に至り、すべての種類をカバーできることを期待する価値があります。 そして、リレーショナル代数の作成者の希望と先見性が実現され、リレーショナルモデルでは、専門家はさまざまな情報データベースとデータウェアハウスを作成することのまったく異なる側面を発見します。
ソース:
""高負荷のアプリケーション。 プログラミング、スケーリング、サポート」、サンクトペテルブルク:ピーター、2018 Kleppman M. [1]
»
SQL Serverの期待値の統計、またはどこが痛いのか教えてください»
T-SQLを使用したデータベースの探索»
SQLドキュメント»
SQL Server 2016のtempdbの改善»
一時DBの最適化(tempdb)»
T-SQLクリアランス標準»
MS SQL Server DBAのユーティリティ»
DbForge»
PostgreSQL(継承)»
MS SQL Server 2017(グラフ)»
MS SQL Server 2016-2017のJSON