タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

2
SQL Server:すべての列を含むインデックスをカバーしていますか?
私たちのチームは、アプリケーションと関連するデータベースを継承しています。以前の開発者は、すべてのテーブルのすべてのインデックスにINCLUDE句があり、それ以外の場合はキーの一部ではないすべての列を常に追加するというルールを適用しているようです。これらのテーブルには、平均して2〜5個のインデックスまたは一意の制約と外部キーがあります。 アクセスはデフォルトで(常にではないが)すべての列を取得するORMを介して行われるため、データベースでスローされるクエリに関係なく、SELECTのパフォーマンスを向上させることを目的としています。これの副作用は、ストレージ要件の増加(おそらく大幅に増加する)とINSERT / UPDATE / DELETEの追加のオーバーヘッド時間であると予想されます。 問題は、これは賢明な戦略ですか?私たちのチームにはSQL Serverの履歴がありますが、内部の動作について専門家であると考えるメンバーはいません(ただし、この戦略が最適だった場合、今のところデフォルトではないのではないかという質問が出されました)。他にどのような副作用(データベースサーバーのCPU /メモリ/ TempDBの使用など)が予想されますか、または上記の仮定の一部が正しくありませんか? さらに、アプリケーションは、オンプレミスのSQL Server(2012年以降のバージョン)とAzure SQLの両方にインストールできます-この結果として、2つの違い、またはAzureへの追加の副作用に備えておく必要があります。アプローチ?

1
SQLがバッファキャッシュからすべてのページを数分ごとにダンプする
複数のデータベースを実行している単一のSQL2012 SP4ノードがあります。 サーバーには20 GBのメモリが利用可能で、14 GBがSQLに割り当てられています(他にボックスで実行されているものはありません)。 SQLは数分ごとにバッファキャッシュ全体をダンプします。ページの平均余命はゼロになり、バッファキャッシュ記述子はキャッシュに何もないことを示します。 私はリソースモニターの通知を確認しました。通知は数ミリ秒ごとに高/定常/低から跳ね回っています。 RESOURCE_MEMPHYSICAL_HIGH RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW タイムスタンプが数ミリ秒離れています。PLEは基本的に鋸歯状のパターンです。 これは、SQL2012 SP1とこの質問で以前に発生したのを見たことがあります。 バッファーキャッシュ内のSQL Server 2012空きページが使用されていない 私はすでにSP4に更新していますが、同様の問題のようです。 サービスアカウントのLPIMをオンにして、最大メモリ設定をいじってみました。最大メモリを下げると、バッファキャッシュがより頻繁に空になるようです。 次に確認することについてのアイデアはありますか? サーバーのワークロードは文字通り何もありません(ERPシステムでアイテムのリストをスクロールしていますが、キャッシュが再び低下するまでに約40〜50 MBに達します)。 SP1からアップグレードしてこれを修正したので興味深いです。キャッシュが約500MBになりました。それ以来、私は最大メモリ設定を14GBに落としました。 Windowsがパニックに陥り、SQLでのメモリプレッシャーに関する誤った通知をスローしているのではないかと思います。つまり、最大メモリが無制限に設定されているサーバーは問題なく動作しているようですが、数百MBを超えるキャッシュを満たしていないようです。やっと50に... 詳細:尋ねた人のために コア数: 4 データベースサイズ: 80GB エラーログは以下を示します: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 …

1
「警告:操作により、残留I / Oが発生しました」とキールックアップの比較
SQL Server 2017実行プランでこの警告を見てきました: 警告:操作によりIOが残りました[sic]。実際に読み取られた行数は(3,321,318)でしたが、返された行数は40でした。 SQLSentry PlanExplorerからのスニペットは次のとおりです。 コードを改善するために、SQL Serverが関連する行にアクセスできるように、非クラスター化インデックスを追加しました。これは正常に機能しますが、通常は(大きな)列が多すぎてインデックスに含めることができません。次のようになります。 インデックスのみを追加し、列を含めない場合、次のようになります。インデックスを強制的に使用すると、 明らかに、SQL Serverは、キールックアップは残りのI / Oよりもはるかにコストがかかると考えています。(まだ)多くのテストデータを含まないテストセットアップがありますが、コードが運用環境に入ると、より多くのデータを処理する必要があるため、何らかの非クラスター化インデックスが必要だとかなり確信しています。 SSDで実行する場合、キールックアップは本当に高価ですが、私は(多くのインクルード列を含む)全脂肪インデックスを作成する必要がありますか? 実行計画: https : //www.brentozar.com/pastetheplan/?id=SJtiRte2Xこれは、長いストアドプロシージャの一部です。を探しIX_BatchNo_DeviceNo_CreatedUTCます。

2
列が非決定的であるため、計算列を永続化できません
このタイプの質問が行われたのはこれが初めてではありません。 しかし、次のシナリオで永続的な計算列が「非決定的」に作成されるのはなぜですか。答えはいつも同じでしょ? CREATE TABLE dbo.test (Id INT, EventTime DATETIME NULL, PosixTime INT NOT NULL) GO DECLARE @EventTime DATETIME = '20181001 12:00:00' DECLARE @GPSTime INT = DATEDIFF(SECOND, '19700101', @EventTime) INSERT INTO dbo.Test(Id, EventTime, PosixTime) VALUES (1, @EventTime, @GPSTime) , (2, NULL, @GPSTime) GO SELECT * FROM dbo.test GO ALTER TABLE dbo.test …

1
Azure SQL(SQL Server)データベースが一度に一定期間データIOで過負荷になるのはなぜですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、データベース管理者のスタック交換のトピックになるようにします。 6か月前に閉鎖。 S2エディション(50 DTU)でAzure SQLデータベースを実行しています。サーバーの通常の使用では、通常、約10%のDTUがハングします。ただし、このサーバーは定期的にデータベースのDTU使用率を85〜90%に数時間送信する状態になります。その後、突然、通常の10%の使用量に戻ります。 この過負荷状態の間、アプリケーションからのサーバーに対するクエリは、まだ高速に動作しているようです。 サーバーをS2 =>何からでもスケーリングできます(たとえば、S3)=> S2。サーバーがハングしている状態をすべてクリアするように見えます。しかし、数時間後、同じ過負荷状態のサイクルが繰り返されます。私が気付いたもう1つの奇妙なことは、このサーバーをS3プラン(100 DTU)で24時間年中無休で実行した場合、この動作は観察されなかったことです。データベースをS2プラン(50 DTU)にダウンスケールした場合にのみ発生するようです。S3プランでは、私は常に5-10%DTU使用率で座っています。明らかに十分に活用されていません。 不正なクエリを探してAzure SQLクエリレポートをチェックインしましたが、実際に異常なものは見られず、期待どおりにリソースを使用してクエリが表示されます。 ここでわかるように、使用法はすべてData IOからのものです。ここでパフォーマンスレポートを変更して、MAXごとの上位のデータIOクエリを表示すると、次のようになります。 これらの長期にわたる要求を見ると、統計の更新が指摘されているようです。私のアプリケーションから実際には何も実行されていません。たとえば、クエリ16302には次のように表示されます。 SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000] FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM …

2
このクエリ/実行プランからCPU使用率が高くなっている原因は何ですか?
.NET Core APIアプリを強化するAzure SQLデータベースがあります。Azure Portalでパフォーマンス概要レポートを参照すると、データベースサーバーの負荷(DTU使用量)の大部分がCPUからのものであり、具体的には1つのクエリが原因であることがわかります。 ご覧のように、クエリ3780は、サーバーのほぼすべてのCPU使用率の原因です。 クエリ3780(下記参照)は基本的にアプリケーションの核心であり、ユーザーから頻繁に呼び出されるため、これは多少意味があります。また、必要な適切なデータセットを取得するために必要な多くの結合を伴う、かなり複雑なクエリでもあります。クエリは、次のようなsprocから取得されます。 -- @UserId UNIQUEIDENTIFIER SELECT C.[Id], C.[UserId], C.[OrganizationId], C.[Type], C.[Data], C.[Attachments], C.[CreationDate], C.[RevisionDate], CASE WHEN @UserId IS NULL OR C.[Favorites] IS NULL OR JSON_VALUE(C.[Favorites], CONCAT('$."', @UserId, '"')) IS NULL THEN 0 ELSE 1 END [Favorite], CASE WHEN @UserId IS NULL OR C.[Folders] IS NULL …

1
sys.objects列[タイプ]奇妙な値 'ST'
sys.objectsの[Type]列に奇妙な(文書化されていない)値が表示されます。以下に示すように、値は「ST」です(注、dbo.Recordはユーザーテーブルです)。 この「ST」値の意味を誰かが知っていますか?(これはSQL Server 2014 Developer Editionにあります)

1
MERGEデッドロック防止
私たちのデータベースの1つに、複数のスレッドによって集中的に同時にアクセスされるテーブルがあります。スレッドはを介して行を更新または挿入しますMERGE。行を時々削除するスレッドもあるので、テーブルデータは非常に不安定です。アップサートを実行するスレッドは時々デッドロックに悩まされます。この問題は、この質問で説明されている問題に似ています。ただし、違いは、私たちの場合、各スレッドが1行だけを更新または挿入することです。 簡略化されたセットアップは次のとおりです。テーブルは、2つの一意の非クラスター化インデックスを持つヒープです。 CREATE TABLE [Cache] ( [UID] uniqueidentifier NOT NULL CONSTRAINT DF_Cache_UID DEFAULT (newid()), [ItemKey] varchar(200) NOT NULL, [FileName] nvarchar(255) NOT NULL, [Expires] datetime2(2) NOT NULL, CONSTRAINT [PK_Cache] PRIMARY KEY NONCLUSTERED ([UID]) ) GO CREATE UNIQUE INDEX IX_Cache ON [Cache] ([ItemKey]); GO 典型的なクエリは DECLARE @itemKey varchar(200) = 'Item_0F3C43A6A6A14255B2EA977EA730EDF2', @fileName nvarchar(255) …

1
IAMページについて:エクステント間隔
Itzikの本「Querying Microsoft SQL Server 2012」を読んでいるほか、インターネットでさまざまな教育資料を読んだり見たりしています。私の意図は、データベースの内部がどのように機能するかを理解することです。 IAMページについて解決できなかったことに少し疑問があります。私は理解の非常に早い段階にいるので、それをよりよく理解している人たちからの追加の助けが必要かもしれません。 第15章の「インデックスと統計の実装」では、IAMページの例として次の画像が表示されます。 同じ範囲に関連する16ページと思われるものを赤い矢印で確認できます。そんなことがあるものか?著者/編集者の間違いですか?または、より可能性の高いもの:私が正しく理解していないものはありますか? 私が持っている他の質問は、ページ間隔に関連しています。なぜ隣接していないのですか?最後のエクステントを例にとると、IDが336から22642のページ、またはその前のページが296から328のページをカバーします。

2
複数のユーザーが一時テーブルでストアドプロシージャを同時に実行できないのはいつですか?
最近TechNetで読んだ一時テーブルに関するドキュメントについて質問があります。そのページの一時テーブルセクションの4番目の段落は、次のようになります。 名前付き制約を使用して一時テーブルが作成され、一時テーブルがユーザー定義のトランザクションのスコープ内で作成される場合、一時テーブルを作成するステートメントを実行できるのは一度に1人のユーザーだけです。たとえば、ストアドプロシージャが名前付きの主キー制約を持つ一時テーブルを作成する場合、そのストアドプロシージャを複数のユーザーが同時に実行することはできません。 私は、インデックス化された一時テーブルを使用する少数のストアドプロシージャを大幅に利用する環境で作業しており、ユーザーが次の処理が始まる前に実行が完了するのを待たなければならないという問題に遭遇したことはありません。それが今後も続くことを願っていますが、この警告が適切に理解されていないと問題になる可能性があることを懸念しています。 具体的には、次の点については不明です。 これはグローバル一時テーブルにのみ適用されますか、それともローカル一時テーブルにも適用されますか?(後者の場合のように)セッションの外部に表示されないテーブルが別のセッションの同時実行を妨げるのは奇妙に思われます。 「名前付き制約」とは何ですか?すべての制約に名前が付いているわけではありませんか(システムで生成された場合でも)。これは、ユーザー定義のエイリアスを持つ制約を参照していますか?これは私には言い回しのように思えます。 「複数のユーザー」は実際には複数のセッションを意味しますか?これらの手順は、単一のサービスアカウントを使用してアプリケーションから呼び出されるため、スクリプトへの呼び出しの99.9%はその単一のアカウントによってDBに対して行われます(そして、管理者がバックエンドでときどき呼び出す可能性があるのではないかと心配しています)。サービスアカウントが複数のセッションで同時にsprocを実行できる場合、この問題は私の目的には当てはまりません。

3
作成時にデータベース照合を変更するトリガー
トリガーを作成して、作成時にデータベースの照合を変更しようとしていますが、トリガー内で使用するデータベース名をキャッチするにはどうすればよいですか? USE master GO CREATE TRIGGER trg_DDL_ChangeCOllationDatabase ON ALL SERVER FOR CREATE_DATABASE AS declare @databasename varchar(200) set @databasename =db_name() ALTER DATABASE @databasename COLLATE xxxxxxxxxxxxxxxxxxx GO 明らかに、これは機能していません。

6
ストアドプロシージャを並列で実行する
同じストアドプロシージャを、異なるパラメーターを使用して複数回同時に実行しようとしています。 SQL 2014を使用しています これは、手順が完了するまでに約7時間かかるためです。実際には同じプロセスを何度も実行します。したがって、たとえば、ブランチごとに新しいデータベースとテーブルを構築する場合があります。 ストアドプロシージャを分解して、ブランチごとに実行し、各クエリを並行して実行できるようにしたいと思います。私はこれを個別のクエリウィンドウで実行することでテストしましたが、ほぼ80%速く実行されます。 誰かが私にクエリを並行して実行するためのダミーガイドを教えてもらえますか?

1
SQL Serverクエリストアはパラメーター値をキャプチャしますか?
SQL Server 2016で導入された新しいクエリストアは素晴らしいです。これは、以前のプロファイラーツールで行っていた処理の多くを置き換えるのに最適です。ただし、リソースを大量に消費するクエリへの個々の呼び出しに関連するパラメータ値をキャプチャして、それを傍受する方法は見つかりませんでした。これは可能ですか? Query Storeは個別の呼び出しよりも集計データを扱うことを理解しているので、ここでは運が悪いのではないかと思います。遅いクエリを見つけたとき、最も遅い呼び出しの1つに関連付けられたパラメータも持つとトラブルシューティングに便利です。最新の優れたツールを使用してこれを行う方法を知りたいのですが。(プロファイラーの使用をお見逃しなく!) セキュリティの観点から、Query Storeはプロファイラーよりもロックダウンされていますか?集計を計算するには、あるレベルで個々の呼び出しからデータをキャプチャする必要があると思います。それのいずれかが格納されているかどうかはわかりません。


2
ID列をINTからBIGINTに変更する
主キーでもあるID列を持つテーブルがあります。現在、5000万行あり、identity列の最高値は148,921,803です。テーブルには多くのがあり、そのテーブルDELETEでINSERTS実行されるため、値が高くなります。 私たちは、からのデータ型を変更したいINTとBIGINT多くの行を追加するための準備します。PK列への参照がないことに注意してください。 最小限のダウンタイムでこれを行うための最良の方法は何ですか?2つのオプションがあります。 PKをドロップして列を変更します。または ここで説明するように、copy-drop-renameメソッド:

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