データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

1
CPUが100%、実行プランが不良
特定のクエリで使用されている実行プランに問題があるため、CPUスパイクが100%になるという大きな問題があります。私は今、自分で解決するのに数週間を費やしています。 私のデータベース 私のサンプルDBには、3つの簡略化されたテーブルが含まれています。 [データ・ロガー] CREATE TABLE [model].[DataLogger]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [ProjectID] [bigint] NULL, CONSTRAINT [PK_DataLogger] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] 【インバーター】 CREATE TABLE [model].[Inverter]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [SerialNumber] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Inverter] …

2
ファイルが関連付けられていないファイルグループは削除できません
SQL Server 2017 CU3で奇妙なエラーメッセージが発生します。データベースを移行し、ファイルグループを再編成しています。「再編成」とは、オブジェクトの新しいファイルグループにパーティション関数とパーティション構成を作成し、パーティション分割中にインデックスを再構築してからパーティション分割を削除するストアドプロシージャを使用することを意味します。 最後に、いくつかの空のファイルグループを取得しました。それらのファイルは削除されます。また、ファイルグループ自体も削除されます。これはほとんどの場合うまくいきます。ただし、2つのデータベースの場合、ファイルを削除しました... 関連付けられているファイルがないままファイルグループが残っていますが ALTER DATABASE REMOVE FILEGROUP エラー5042をスローします。 ファイルグループ 'xyz'は空ではないため削除できません。 質問 空のファイルグループを削除するにはどうすればよいですか? 私はすでにいくつかの一般的な問題を読みましたが、それらは私のシステムにはありません: チェック済み: SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions; 0行...データベースにパーティションオブジェクトが残っていません UPDATE STATISTICS データベース内のすべてのオブジェクト 無効 ファイルグループのインデックスをチェックします。 SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz' 0行 ファイルグループ内のオブジェクトを確認します。 …

1
SQL ServerはNULLを固定長の列に格納できませんか?
オラクルの公式ドキュメントでこの声明に出くわしました。 Microsoft SQL Serverでは、可変長データ型の列のみがNULL値を格納できます。固定長データ型でNULLを許可する列を作成すると、列は自動的にシステムの可変長データ型に変換されます... SQL Serverのドキュメントでこれについて読んだことも、そのようなことを経験したこともありません。逆に、SQL Serverでは、固定長のデータ型(intやfloatなど、charも)が頻繁に使用され、NULL可能でも非常に効率的に格納されます。 このオラクル声明の背後にある理論的根拠はありますか?!

1
HEAPを再構築するとダウンタイムが発生しますか?
これは少し恥ずかしい質問です。長年これを見逃していたとは思えません。 401ヒープテーブルを持つベンダーサードパーティデータベースがあります。私は最近、Brent Ozarのスクリプトとセットアップsp_BlitzFirstを使用して15分ごとに実行し、待機統計などを収集しました。 明らかになったのは、24時間にわたって実行されるたびにForwarded Recordsを修正するように指示することでした。DMV全体でクエリを実行し、150,000を超える転送されたレコード値を持ついくつかのテーブルを取得した読者に、おそらく何がショックになるでしょう。 これを修正することは、テーブル全体にクラスター化インデックスを作成すること、または実行するための一時的な回避策として理解していますALTER TABLE [tablename] REBUILD。 しかし、私が見つけられなかったのは、これがテーブルをオフラインにするかどうか、およびこのコマンドを実行する前に知っておくべき他の問題があるかどうかです。 2008 R2のEnterprise Editionを使用していますが、この方法で実行すると停止の必要がなくなるのでしょうか。 ALTER TABLE [tablename] REBUILD WITH (ONLINE = ON); 誰かこれについて何か経験がありますか?

1
FILESTREAMファイルグループを使用したSQLサーバーデータベースのバックアップと復元
私はSQL Serverを使用しており、2つのファイルグループを持つ巨大なデータベースがあります。 プライマリ:大きなファイル(1MB +)を除くすべてのデータが含まれます FILESTREAM(読み取り/書き込み):大きなファイルが含まれています 現在、バックアップシナリオは次のとおりです。 毎週金曜日に完全バックアップ(午前2時)を取得します 金曜日を除く毎日、差分バックアップ(午前2時)を取得します。 データベースが大きく、リモートサーバーで運用されているため、データベースをローカル環境に移動してテストデータベースを(毎週)作成する場合は常に、プライマリとファイルストリームの両方を使用する必要があります。 ファイルストリームを無視して、プライマリファイルグループを取得するだけで済むように、バックアップと復元の方法を変更できるようにしたいと考えています。このようにして、毎週、ファイルストリームを想定するすべての情報ではなく、プライマリファイルグループのみを取得します。 多くの問題があり、ファイルにアクセスするとすべてのファイルストリーム参照が失われる可能性があると思います。バックアップを実行するときにすべてのファイルストリーム列のコンテンツを変更できるか、またはテスト環境でホストされている別のファイルストリームを使用できるかどうか知りたいのですが。また、一部のファイルグループのみの段階的復元について聞いたことがありますが、その実行方法には多くの疑問があります。 質問1:このシナリオはありますか? 質問2:完全バックアップを1つだけにし、差分バックアップ/トランザクションログをテスト環境に持ってくるのは良い考えですか? 質問3:バックアップと復元のシナリオを改善できますか? 私はすべての推奨事項に耳を傾けています。ケースの例がある場合は、T-SQLクエリを表示してください。

1
重複なしでテーブルから返された重複レコード
私のシステムで作業を分散するために使用されるビジーキューテーブルをクエリするストアドプロシージャがあります。問題のテーブルにはWorkIDの主キーがあり、重複はありません。 クエリの簡略版は次のとおりです。 INSERT INTO #TempWorkIDs (WorkID) SELECT W.WorkID FROM dbo.WorkTable W WHERE (@bool_param = 0 AND ((W.InProgress = 0 AND ISNULL(W.UserID, -1) != @userid_param AND (@bool_filtered = 0 OR W.TypeID IN (SELECT TypeID FROM #Types AS t))) OR (@bool_param = 1 AND W.InProgress = 1 AND W.UserID != @userid_param) OR …

2
本番環境のテーブルから列を削除する
2つのテーブル間の関係をm:1からm:nに変更する必要がある状況があります。 したがって、これら2つのテーブルの間に相互参照テーブルを作成する必要があります。 すべての既存のデータを「子」テーブルから相互参照テーブルに移行した後、子テーブルの元の外部キー列を削除することは悪い考えでしょうか? そこに置いておくと、基本的に技術的な負債があります。しかし、私はdbaではなく、テーブルから列を削除することの意味をよく理解していません。(私はそれが可能であることを知っていますが、それは悪い考えですか?私のデータベースはそれを嫌いますか?) ありがとう

5
Intellisense SSMS 2017のオートコンプリート。どこに行きますか?
最近、新しい開発ボックスを入手し、Visual Studioをインストールしました。SSMSをインストールしました。いくつかのプロシージャとテーブルの作成を開始しました...インテリセンスのヘルプはありません。 なぁ? すべてのボックスがチェックされています。私は正しいDBにいます。テーブルが存在しない場合、赤い波線が表示されますが、オブジェクト名を補完するためのフライアウトはありません。私のグーグルで2017のインテリセンス機能が大幅に改善されたことがわかるので、間違いなく私は何かを台無しにしました。 2018年11月6日更新 オートコンプリートを許可するものと許可しないものについてはまだ非常に不安定であるように思われるため、キャッシングが犯人であると言って自分の回答を削除しました。以前のバージョンのSMSSに戻って、このバージョンまで慣れ親しんだような結果を得ることができます。 私は、Azure Data Studioを日常的なものに使い始めました。それは超すごいです。QoLの多くの改善。サーバー管理のための十分な機能にさえ近づいていませんが、一般的なproc書き込みとデータ分析にははるかに優れています。

1
最大サーバーメモリの変更は、プランキャッシュをクリアし、(明らかに)メモリ設定を変更する以外に何をしますか?)
32 GBのRAMと4つのコア、60〜80の同時接続でSQL Server 2012 SP3を実行し、主にアドホックなワークロードで、SQL Serverプロセス(CPU)が急上昇し、予測できない時間に1日に1回または2回急上昇し続けています。スパイクの根本的な原因の特定に取り組んでいます。それまでの間、最大メモリ設定の変更(アップまたはダウン)が、CPUの負荷を通常に戻す唯一の方法であることがわかりました。 ログを確認し、StackExchange(https://dba.stackexchange.com/a/183276)を検索すると、最大メモリ設定を変更することにより、プランキャッシュがフラッシュされていることがわかります。ただし、DBCC FREESYSTEMCACHE( 'SQL Plans')を介してプランキャッシュをフラッシュすると、CPU負荷は通常に戻りません。 最大メモリ設定を変更すると、天候に関係なく問題が解決するため、問題は最大サーバーメモリ設定に直接関連しているようには見えません。そのため、メモリ設定を変更する他のことを理解し、その情報を使用してCPUスパイクの根本的な原因を特定しようとしています。

1
SSMSの「未接続」クエリウィンドウを元の接続に再接続する
必要なサーバー名を手動で選択せずに、そのクエリで使用された元の接続に「接続されていない」クエリウィンドウを再接続する簡単な方法はありますか?SQLエディターのツールバーの[接続]ボタンをクリックするか、右クリック-> [接続]-> [接続...]をクリックすると、サーバー名はデフォルトで、その特定のクエリウィンドウで使用された最後の接続ではなく、そのSSMSセッションで使用された最後の接続になります。 。 1日の終わりにラップトップを家に持ち帰ると、開いているすべてのウィンドウは、次に使用するときに接続されないように設定されます。理想的には、すべてを元の接続に再接続できるようにしたいのですが、一度に1つのクエリでも可能かどうかはわかりません。

3
100 GBテーブルにクラスター化インデックスを作成する方法
約30億行のディスク容量約104 GBを占めるヒープテーブルがあります。このテーブルの[ WeekEndingDate]列にクラスター化インデックスを作成しようとしています。データファイルには約200 GBの空き容量があり、tempdbには約280 GBの空き容量があります。 私は2つの異なる方法を試しました。最初に、次のコマンドを使用してテーブルに直接インデックスを作成しました。 CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY ON WT_FOLD_HISTORY (WeekEndingDate ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON, IGNORE_DUP_KEY = OFF , ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) 私は両方のそれを試してみましたSORT_IN_TEMPDB = ONとOFF。使用するONとtempdbがOFFいっぱいになり、データドライブがいっぱいになります。 他の方法は、必要なインデックスで新しい空のテーブルを作成し、ヒープから新しいテーブルにレコードを挿入することでした。データドライブがいっぱいになった後も、これは失敗しました。 何をすべきかに関するその他の提案。私が読んだほとんどのことは、インデックスを作成するときにワークスペースとして使用するには、テーブルの約1.2倍のサイズが必要だと述べています。私はそれよりはるかに多く持っていますが、それでも失敗します。任意の提案をいただければ幸いです。 これが私の元のヒープテーブル構造です。 CREATE TABLE [dbo].[WT_FOLD_HISTORY]( [WeekEndingDate] …

3
特定の数式に基づいて欠落している最小の要素を特定する
数百万行のテーブルから欠落している要素を見つけることができる必要があり、BINARY(64)列の主キーがあります(これは計算に使用する入力値です)。これらの値はほとんど順番に挿入されますが、削除された以前の値を再利用したい場合があります。削除されたレコードをIsDeleted列で変更することはできません。現在の行の前に何百万もの値がある行が挿入される場合があるためです。つまり、サンプルデータは次のようになります。 KeyCol : BINARY(64) 0x..000000000001 0x..000000000002 0x..FFFFFFFFFFFF したがって、0x000000000002との間にすべての欠損値を挿入すること0xFFFFFFFFFFFFは実行不可能であり、使用される時間とスペースの量は望ましくありません。基本的に、アルゴリズムを実行する0x000000000003と、最初の開始点であるが返されることが期待されます。 私はC#でバイナリ検索アルゴリズムを考え出しました。これは、位置の各値についてデータベースにクエリを実行し、iその値が予期されているかどうかをテストします。コンテキストについては、私のひどいアルゴリズム:https : //codereview.stackexchange.com/questions/174498/binary-search-for-a-missing-or-default-value-by-a-given-formula このアルゴリズムは、たとえば、100,000,000アイテムのテーブルで26-27 SQLクエリを実行します。(それほど多くはないように見えますが、非常に頻繁に発生します。)現在、このテーブルには約50,000,000行あり、パフォーマンスが顕著になりつつあります。 私の最初の代替の考えは、これをストアドプロシージャに変換することですが、それには独自のハードルがあります。(私はBINARY(64) + BINARY(64)アルゴリズムや他の多くのものを書かなければなりません。)これは苦痛ですが、実行不可能ではありません。また、に基づく変換アルゴリズムの実装を検討しましたROW_NUMBERが、これについては非常に悪い直感があります。(A BIGINTはこれらの値に対して十分な大きさではありません。) 私はのためにアップしてる他の Iのように、提案本当にこれは、可能な限り迅速にする必要があります。C#クエリで選択された唯一の列に値するのはであり、他の列KeyColはこの部分には関係ありません。 また、価値のあるものとして、適切なレコードをフェッチする現在のクエリは次の行に沿っています。 SELECT [KeyCol] FROM [Table] ORDER BY [KeyCol] ASC OFFSET <VALUE> ROWS FETCH FIRST 1 ROWS ONLY <VALUE>アルゴリズムによって提供されるインデックスはどこにありますか。私もまだBIGINT問題を抱えていませんが、問題はOFFSETありません。(現在、50,000,000行しかないということは、その値を超えるインデックスを要求しないことを意味しますが、ある時点でBIGINT範囲を超えることになります。) いくつかの追加データ: 削除から、gap:sequential比率は約1:20です。 テーブルの最後の35,000行には、> BIGINTの最大値があります。

2
SQL Server 2012 SP3でのメモリ不足の問題
SQL ServerのOOMエラーが定期的に発生しました。SQLServerが自動的にシャットダウンし、常に夜間に発生し、誰も使用しておらず、SQLエージェントジョブも実行されていませんでした。 ここに典型的なエラーがあります: 2017年8月17日19:31:17、spid100、不明、このクエリを実行するには、リソースプール '内部'にシステムメモリが不足しています。 2017年8月17日19:31:17、spid100、不明、エラー:701重要度:17状態:123。 08/17/2017 19:31:17、spid112、Unknown、Error:18056 Severity:20 State:29.(Params :)。フォーマット中にエラーが発生したため、エラーは簡略モードで出力されます。ETW通知などのトレースはスキップされます。 サーバー情報は次のとおりです。 10GB MIN SQLサーバーメモリ 21GB MAX SQLサーバーメモリ サーバー上に4つのDBのみ サイズはそれぞれ1〜2 GBです Tempdbのサイズが1 GBを超えることはありません(10 GBに自動拡張するように設定) インデックスはすべて低フラグであり、統計が更新されます バージョン: Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 …

1
SQL Server 2016にはまだsqlmaint.exeが含まれていますか?
文書によると、(非推奨のデータベースエンジンは、SQL Serverの2016年に機能)、sqlmaint.exeまだ(強調鉱山)利用可能であるべきです: このトピックでは、SQL Server 2016で引き続き利用できる、非推奨のSQL Serverデータベースエンジン機能について説明します。これらの機能は、SQL Serverの将来のリリースで削除される予定です。 ... ツール:sqlmaintユーティリティ... それは間違いなくされて表示されていない上廃止される機能のリスト。 しかし、sqlmaint.exe最近インストールしたSQL Server 2016 Expressシステムでは見つかりません。以前のバージョンでは、と同じフォルダにありましたsqlserver.exe。 ドキュメントは間違っていますか?または、ファイルの場所が移動しましたか?または、インストールプロセス中に何かを見逃しましたか? (注:この問題を再現するコメントに励まされて、私はこのためのMicrosoft Connectエントリを作成しました。これはUserVoiceに移行されました。)

1
varbinary(max)からデータをnullにした後でDBを縮小する最良の方法は?
varbinary(max)型のフィールドに大量のデータが格納されたデータベースがあります。ある時点で、すべての行ではなく、ほとんどの行のデータをパージできます。私たちの計画は、そのフィールドをnull可能にし、不要になったときにデータをnullにすることです。それができたら、DBのサイズを小さくしたいと思います。これを達成するための最良の方法は何ですか? 現在の設定でスペースを再利用する良い方法がない場合、私が持っているアイデアの1つは、メインテーブルへのキーとデータフィールドの2つの列だけを持つ別のテーブルにデータフィールドを移動することです。次に、不要になった行を削除するだけです。(そして、何らかの縮小を行います。)ただし、これは、既存のフィールドを単にnull可能にするよりも、はるかに難しい変更です。 注:データベースファイルのサイズを小さくすることはあまり気にしていませんが、新しく解放されたスペースが再利用可能になることは気にします。 DBサイズの90%以上がこの1つのフィールドです。私はすでに3TBです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.