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

SQL Server 2008 R2(メジャービルドバージョン10.50.xxxx)。また、sql-serverでタグ付けしてください。


1
SQL ServerのSLEEP_TASK待機タイプ-それは何を示していますか?
私はSLEEP_TASK前に待機タイプを見たことがありません、そして今日、私はそれらのトンを得ているようです。 私は公式のDBAではなく、DBAの知識があるSQL Server開発者です。先週末、サーバーを10.52.2500.0-R2SP1にアップグレードしました。 オンラインで見つけた情報はすべて、SLEEP_TASKサーバーが何らかの内部プロセスの完了を待っていることを示しています。チェックポイントやゴーストクリーンアップなどのブロッキングプロセスやバックグラウンドプロセスが実行されていないため、少し困惑しています。 この待機タイプを以前に見たことがありますか?

4
より多くのCPUとRAMを割り当てた後のSQL Serverパフォーマンスの低下
仮想Windows 2008 R2サーバーで実行されているSQL Server 2008 R2(10.50.1600)があります。CPUを1コアから4に、RAMを4 GBから10 GBにアップグレードした後、パフォーマンスが低下していることに気付きました。 私が見るいくつかの観察: 実行に5秒未満かかったクエリは、現在200秒以上かかっています。 CPUは、sqlservr.exeを原因として100に固定されています。 4.6百万行のテーブルでのselect count(*)は90秒以上かかりました。 サーバーで実行されているプロセスは変更されていません。唯一の変更点は、CPUとRAMを増やすことでした。 他のSQLサーバーには静的なページングファイルがあり、このサーバーはそれを独自に管理するように設定されています。 以前にこの問題に遭遇した人はいますか? sp_BlitzErikごとに、私は走りました EXEC dbo.sp_BlitzFirst @SinceStartup = 1; これらの結果を与えてくれます。

4
ユーザーストアドプロシージャの名前をsp_で開始するのはまだ間違っていますか?
私の同僚の1人が、SQL Server 2008 R2データベースのストアドプロシージャに名前を付けましたsp_something。これを見たとき、私はすぐに考えました:「それは間違っている!」なぜ間違っているのかを説明するこのオンライン記事のブックマークを検索し始めたので、同僚に説明を提供することができました。 (Brian Moranによる)記事では、ストアドプロシージャにsp_プレフィックスを付けると、SQL Serverがコンパイル済みプランのマスターデータベースを参照することが説明されています。sp_sprocが存在しないため、SQL Serverはプロシージャを再コンパイルします(そのためには排他的なコンパイルロックが必要で、パフォーマンスの問題が発生します)。 次の例は、2つの手順の違いを示すために記事に記載されています。 USE tempdb; GO CREATE PROCEDURE dbo.Select1 AS SELECT 1; GO CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1; GO EXEC dbo.sp_Select1; GO EXEC dbo.Select1; GO これを実行してから、プロファイラーを開き(ストアドプロシージャ-> SP:CacheMissイベントを追加)、ストアドプロシージャを再度実行します。2つのストアドプロシージャには違いがあるはずです。sp_Select1ストアドプロシージャはSP:CacheMiss、Select1ストアドプロシージャよりも1つ多くのイベントを生成します(この記事では、SQL Server 7.0とSQL Server 2000を参照しています)。 SQL Server 2008 R2環境で例を実行すると、SP:CacheMiss両方の手順(tempdbと別のテストデータベースの両方)で同じ量のイベントが発生します。 だから私は疑問に思っています: 例の実行で何か間違ったことをしたことはありますか? 'ユーザーに名前を付けないsproc sp_something' adagiumは、SQL Serverの新しいバージョンでもまだ有効ですか? その場合、SQL Server …

2
PKインデックスの列の順序は重要ですか?
同じ基本構造を持ついくつかの非常に大きなテーブルがあります。それぞれにRowNumber (bigint)とDataDate (date)列があります。データは毎晩SQLBulkImportを使用してロードされ、「新しい」データはロードされません-その履歴レコード(エンタープライズではなくSQL標準なので、パーティショニングはありません)。 データの各ビットは他のシステムに結び付ける必要があり、各RowNumber/DataDate組み合わせは一意であるため、それが私の主キーです。 SSMS Table DesignerでPKを定義した方法により、RowNumber最初とDataDate2番目にリストされていることに気付きました。 また、私の断片化は常に非常に高い〜99%であることに気付きます。 今、それぞれDataDateが一度しか表示されないため、インデクサーが毎日ページに追加することを期待していますが、実際にはRowNumber最初に基づいてインデックス付けされているので、他のすべてを移動する必要がありますか? RownumberID列ではなく、外部システムによって(悲しいことに)生成されたintです。それぞれの開始時にリセットされますDataDate。 サンプルデータ RowNumber | DataDate | a | b | c..... 1 |2013-08-01| x | y | z 2 |2013-08-01| x | y | z ... 1 |2013-08-02| x | y | z 2 |2013-08-02| x | y | z ... …

2
15秒以上かかるI / O要求
通常、毎週の完全バックアップは約35分で完了し、毎日の差分バックアップは約5分で完了します。火曜日以来、デイリーは完了するのにほぼ4時間かかりました。偶然にも、新しいSAN /ディスク構成を取得した直後にこれが起こり始めました。 サーバーは運用環境で実行されており、全体的な問題はなく、スムーズに実行されていることに注意してください-主にバックアップパフォーマンスに現れるIOの問題を除きます。 バックアップ中にdm_exec_requestsを見ると、バックアップは常にASYNC_IO_COMPLETIONで待機しています。ああ、ディスクの競合があります! ただし、MDF(ログはローカルディスクに保存されます)もバックアップドライブにもアクティビティはありません(IOPS〜= 0-十分なメモリがあります)。ディスクキューの長さも〜= 0です。CPUは2〜3%程度動きますが、問題はありません。 SANはDell MD3220i、6x10k SASドライブで構成されるLUNです。サーバーは2つの物理パスを介してSANに接続され、それぞれがSANへの冗長接続を備えた個別のスイッチを通過します。合計4つのパスで、そのうち2つは常にアクティブです。タスクマネージャーを使用して両方の接続がアクティブであることを確認できます。負荷を完全に均等に分割します。両方の接続が1G全二重を実行しています。 以前はジャンボフレームを使用していましたが、ここでは問題を除外するために無効にしました-変更はありません。他のLUNに接続されている別のサーバー(同じOS + config、2008 R2)があり、問題はありません。ただし、SQL Serverを実行するのではなく、その上でCIFSを共有するだけです。ただし、そのLUNの優先パスの1つは、問題のあるLUNと同じSANコントローラー上にあるため、それも除外しました。 いくつかのSQLIOテスト(10Gテストファイル)を実行すると、問題があるにもかかわらずIOが適切であることが示されているようです。 sqlio -kR -t8 -o8 -s30 -frandom -b8 -BN -LS -Fparam.txt IOs/sec: 3582.20 MBs/sec: 27.98 Min_Latency(ms): 0 Avg_Latency(ms): 3 Max_Latency(ms): 98 histogram: ms: 0 1 2 3 4 5 6 7 8 9 10 11 …

2
SQL Serverインスタンスのルートディレクトリを別のドライブに置くと便利ですか?
SQL Serverのインストール時にデフォルトのパスの多くを変更できることはわかっています。一般的に、インストールを行うと、データフォルダーとログフォルダーを別々のドライブ(通常はDとE)に変更しますが、最近、デフォルト以外のインスタンス名を実行し、mdfファイルとともにDドライブ上にあるインスタンスルートディレクトリを設定しているプレインストールマシン。これは、通常はフォルダーとデータベースファイルだけが含まれる比較的クリーンなドライブに、SQL Serverバイナリも完全にインストールできるようになったことを意味します。 すなわち、私は今次のものを持っています: C:\Program Files\Microsoft SQL Server\ --Base Install D:\Microsoft SQL Server\MSSQL10_50.MyInstance --Instance Binaries D:\Microsoft SQL Server\MSSQL10_50.MyInstance\MSSQL\DATA --Data Files E:\Microsoft SQL Server\MSSQL10_50.MyInstance\MSSQL\LOGS --Log Files 通常、私は次のようなもので実行します: C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\ --Base Install & Default Instance Binaries D:\MSSQL\DATA --Data Files E:\MSSQL\LOGS --Log Files 別のインスタンスバイナリフォルダーが必要な理由は理解できますが、これらすべてのバイナリを別のドライブに配置することがなぜ役立つのかわかりません。 なぜそれが妥当なことなのか、誰にも教えてもらえますか?それとも、まったく違いはありませんか?私にはそれはひどく乱雑に見える...

4
EF Code Firstは、すべての文字列にnvarchar(max)を使用します。これによりクエリのパフォーマンスが低下しますか?
Entity Framework Code Firstを使用していくつかのデータベースを作成しています。アプリは正常に動作しており、一般的にCode Firstでできることにはかなり満足しています。私は必然的にプログラマーであり、DBAは2番目です。私はデータベースで何をしたいのかをC#でさらに説明するためにDataAttributesについて読んでいます。私の質問は、これらのnvarchar(max)文字列をテーブルに入れることでどのようなペナルティを食べるのかということです(下の例を参照)。 この特定のテーブルにはいくつかの列があります。C#では、次のように定義されています。 [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string Name { get; set; } public string Message { get; set; } public string Source { get; set; } public DateTime Generated { get; set; } public DateTime Written { get; set; } …

3
合理的なバッファプールサイズを評価する決定論的な方法は何ですか?
私はmax server memory (mb)設定が適切かどうかを理解するための健全な方法を考え出そうとしています(どちらか低いか高いか、そのままの状態を維持する必要があります)。max server memory (mb)オペレーティングシステムなどのためのスペースを確保するために、常に十分に低くする必要があることを認識しています 私が見ている環境には数百のサーバーがあります。RAMは各サーバーに割り当てられたGBごとにコストがかかるため、バッファープールの現在のサイズが適切かどうかを判断するために使用できる信頼できる式が必要です。環境全体が仮想化され、VMに割り当てられた「物理」RAMは簡単に上下に変更できます。 現在見ている特定のSQL Serverインスタンスには、1,100,052秒のPLEがあります。これは、12.7日(サーバーが稼働している時間)に相当します。サーバーの最大サーバーメモリ設定は2560MB(2.5GB)で、そのうち1380MB(1.3GB)のみが実際にコミットされます。 Jonathan Keheyias(投稿)によるものとPaul Randal(投稿)によるもの、および他のいくつかを含むいくつかの項目を読みました。ジョナサンは、4GBのバッファプールあたり 300未満のPLEの監視が低すぎると主張しています。上記のSQL Serverインスタンス300 * (2.5 / 4) = 187では、ターゲットPLEが300未満の非常に低いターゲットPLEになります。このインスタンスは290GBのSQL Serverデータ(ログファイルを含まない)を持ち、統合テストにのみ使用されます。過去12日間がこのサーバーの典型的な使用法を代表していると仮定すると、max server memory (mb)設定を下げることができると思います。 スケールのもう一方の端には、294のPLEを持つ別の統合テストサーバーがあり、そのサーバーのmax server memory (mb)設定は1 GBのみです。このサーバーには、ログを含まないSQL Serverデータが224MBしかなく、一部のBizFlowデータベースが実行されています。このサーバーは、より高いmax server memory (mb)設定の恩恵を受ける可能性があります。 あまりにも多くのメモリが割り当てられている可能性のあるターゲットの良い出発点は、次のものを見ることです。 SELECT RamMB = physical_memory_in_bytes / 1048576 , BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576 , …

3
実動テーブルへの列の追加
SQL Server 2008 R2の大規模な運用テーブルに列を追加する最良の方法は何ですか?オンラインのMicrosoftの本によると: ALTER TABLEで指定された変更はすぐに実装されます。変更がテーブル内の行の変更を必要とする場合、ALTER TABLEは行を更新します。ALTER TABLEは、テーブルのスキーマ変更ロックを取得して、最後に非常に短いSCH-Mロックを必要とするオンラインインデックス操作を除き、変更中に他の接続がテーブルのメタデータを参照しないようにします。 (http://msdn.microsoft.com/en-us/library/ms190273.aspx) 数百万行の大きなテーブルでは、これには時間がかかる場合があります。停止することが唯一の選択肢ですか?このような状況に対処する最善の方法は何ですか?

2
Eager Spoolが示す問題
現在SQL Server 2008 R2で実行中 UPDATEステートメントのパフォーマンスを向上させようとしています。showplanにEager Spool操作がポップアップ表示されます。スプール操作についての私の理解は非常に基本的です-更新中にテーブルの一時ストレージを作成します。 また、熱心なスプールは実行時間を大幅に短縮する一方で、多くの場合、テーブル構造やクエリステートメントの根本的な問題を示しています。 私の質問は非常に簡単です:クエリプランにEager Spoolが表示された場合、最初に対処すべき問題は何ですか? システムのすべての部分を分析してパフォーマンスを向上させます。どこから始めればよいかについてのガイダンスを探しています。

2
テーブルがそれ自体を参照するときにすべての循環参照を見つけるクエリを作成する方法は?
次のスキーマ(名前が変更されています)がありますが、変更することはできません。 CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); つまり、各レコードは別のレコードの子です。レコードParentIdがに等しい場合、そのIdレコードはルートノードと見なされます。 すべての循環参照を検索するクエリを実行したい。たとえば、 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); クエリは返す必要があります Id | Cycle 2 | 2 …

7
値が最後に変更された時間を見つけようとする
ID、値、および日付を持つテーブルがあります。この表には多くのID、値、および日付があります。 レコードはこのテーブルに定期的に挿入されます。IDは常に同じままですが、ときどき値が変更されます。 IDと値が変更された最新の時間を提供するクエリを作成するにはどうすればよいですか?注:値は常に増加します。 このサンプルデータから: Create Table Taco ( Taco_ID int, Taco_value int, Taco_date datetime) Insert INTO Taco Values (1, 1, '2012-07-01 00:00:01'), (1, 1, '2012-07-01 00:00:02'), (1, 1, '2012-07-01 00:00:03'), (1, 1, '2012-07-01 00:00:04'), (1, 2, '2012-07-01 00:00:05'), (1, 2, '2012-07-01 00:00:06'), (1, 2, '2012-07-01 00:00:07'), (1, 2, '2012-07-01 00:00:08') …

2
COUNT句をOVER句とともに使用できますか?
次のクエリのパフォーマンスを改善しようとしています。 UPDATE [#TempTable] SET Received = r.Number FROM [#TempTable] INNER JOIN (SELECT AgentID, RuleID, COUNT(DISTINCT (GroupId)) Number FROM [#TempTable] WHERE Passed = 1 GROUP BY AgentID, RuleID ) r ON r.RuleID = [#TempTable].RuleID AND r.AgentID = [#TempTable].AgentID 現在、私のテストデータでは約1分かかります。このクエリが存在するすべてのストアドプロシージャに対する変更への入力は限られていますが、おそらくこの1つのクエリを変更することができます。または、インデックスを追加します。次のインデックスを追加してみました。 CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed) また、実際にクエリにかかる時間は2倍になりました。NON-CLUSTEREDインデックスでも同じ効果が得られます。 効果なしで次のように書き直してみました。 WITH …

1
ライブprodテーブルのvarcharの長さを変更する
現在、実稼働アプリで使用されているMS SQL Server 2008 R2 DBサーバーがあります。 アプリの新しい拡張機能varchar(100)では、テーブルの列の長さを増やす必要があります。 現在のデータに影響を与えずに、prod DBのこの既存の列の長さを増やすことはできますか? サービスの中断を避けるために、この変更は営業時間外に完了する必要がありますか?

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