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

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

4
SQL Server 2012の復元ウィザードがフリーズする
2012 dbインスタンスと2008 dbインスタンスを備えたSSMS Express 2012を備えた開発用ラップトップがあります。この構成を1年以上使用しています。突然、復元ウィザードを使用できなくなりました。ウィザードはバックアップファイルを選択しますが、MDFおよびLDFの場所を指定するために左上の[ファイル]オプションを選択すると、ダイアログがハングします。私は修理を試みましたが、運はありません。
20 sql-server 


1
「NOT FOR REPLICATION」オプションを持つ主キー
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行され ました。 私は最近プロジェクトを引き継ぎましたが、ほとんどのテーブルで主キーにプロパティ " NOT FOR REPLICATION" があることを発見しました。 私はDBAではありませんが、ほとんどのデータベースでは、主キーのないレコードは破損していると考えられます。ほとんどの場合、これらのレコードの主キーはどこかで外部キーとして使用されます。 これは以前の開発者(会社で働いていなかった)側のエラーですか、それとも他のロジックが関係していますか?実稼働環境ではレプリケーションさえ使用しないため、これは実際には深刻な問題には影響しませんが、気付いていないこれらのディレクティブをすべて削除する他の副作用があるかどうか疑問に思っていました。 私はこのトピックに関連する多くの検索用語で多くの有用なヒットを見つけていないので、これは私が逆にする必要がある単なる愚かなエラーであることをかなり確信しているので、この質問は本当に私の妄想を和らげることです。

1
このNO JOIN PREDICATE警告に驚かされるべきですか?
パフォーマンスの低いストアドプロシージャの細かな部分をトラブルシューティングしています。手順のこのセクションでは、NO JOIN PREDICATE警告をスローしています select method = case methoddescription when 'blah' then 'Ethylene Oxide' when NULL then 'N/A' else methoddescription end, testmethod = case methoddescription when 'blah' then 'Biological Indicators' when NULL then 'N/A' else 'Dosimeter Reports' end, result = case when l.res is null or l.res <> 1 then 'Failed' …

2
MSSQL $ SQLEXPRESSの破損したNTFSアクセス許可
データベースサーバーを「保護」しています。これを行うために、SQL Expressインストールが作成したフォルダーからいくつかの権限を削除しました。 D:\SQL D:\SQL\Data D:\SQL\Backup etc.. Dataフォルダーのアクセス許可はそのままにしておきましたが、他のユーザーには必要ないと思われるものはすべて削除しました。 データベースをバックアップできなくなりました。バックアップ場所を選択しようとすると、ダイアログにはd:\ SQLフォルダーに何も表示されません。自分でパスを入力すると、次のように表示されます。 サーバー上の指定されたパスまたはファイルにアクセスできません。必要なセキュリティ特権があること、およびパスとファイルが存在することを確認してください。 ... フォルダ許可の問題のようです。同様の方法で構成された別のサーバが「と呼ばれるアカウントの「許可する」権限の束持っているMSSQL$SQLEXPRESS(私は削除さ知っている)」、しかし、そのような何もありませんので、私は、これらのアクセス許可を再度追加することはできませんグループ、ユーザーまたは構築されたが、 -サーバーのセキュリティ原則。 このMSSQL$SQLEXPRESSアカウントにアクセス許可を追加するにはどうすればよいですか?

2
この実行計画を説明できますか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 このことに出会ったとき、私は他の何かを研究していました。いくつかのデータを含むテストテーブルを生成し、さまざまなクエリを実行して、クエリを記述するさまざまな方法が実行プランにどのように影響するかを調べていました。ランダムテストデータの生成に使用したスクリプトは次のとおりです。 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('t') AND type in (N'U')) DROP TABLE t GO CREATE TABLE t ( c1 int IDENTITY(1,1) NOT NULL ,c2 int NULL ) GO insert into t select top 1000000 a from (select t1.number*2048 + t2.number …

1
単純なループの結果、ASYNC_NETWORK_IOが待機するのはなぜですか?
次のT-SQLは、SSMS v17.9を搭載したマシンで約25秒かかります。 DECLARE @outer_loop INT = 0, @big_string_for_u VARCHAR(8000); SET NOCOUNT ON; WHILE @outer_loop < 50000000 BEGIN SET @big_string_for_u = 'ZZZZZZZZZZ'; SET @outer_loop = @outer_loop + 1; END; とのASYNC_NETWORK_IO両方に応じて、532ミリ秒の待機を蓄積sys.dm_exec_session_wait_statsしsys.dm_os_wait_statsます。ループの反復回数が増えると、合計待機時間が長くなります。wait_completed拡張イベントを使用すると、いくつかの例外を除いて、約43ミリ秒ごとに待機が発生することがわかります。 さらに、ASYNC_NETWORK_IO待機の直前に発生する呼び出しスタックを取得できます。 sqldk.dll!SOS_DispatcherBase::GetTrack+0x7f6c sqldk.dll!SOS_Scheduler::PromotePendingTask+0x204 sqldk.dll!SOS_Task::PostWait+0x5f sqldk.dll!SOS_Scheduler::Suspend+0xb15 sqllang.dll!CSECCNGProvider::GetBCryptHandleFromAlgID+0xf6af sqllang.dll!CSECCNGProvider::GetBCryptHandleFromAlgID+0xf44c sqllang.dll!SNIPacketRelease+0xd63 sqllang.dll!SNIPacketRelease+0x2097 sqllang.dll!SNIPacketRelease+0x1f99 sqllang.dll!SNIPacketRelease+0x18fe sqllang.dll!CAutoExecuteAsContext::Restore+0x52d sqllang.dll!CSQLSource::Execute+0x151b sqllang.dll!CSQLSource::Execute+0xe13 sqllang.dll!CSQLSource::Execute+0x474 sqllang.dll!SNIPacketRelease+0x165d sqllang.dll!CValOdsRow::CValOdsRow+0xa92 sqllang.dll!CValOdsRow::CValOdsRow+0x883 sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x15d sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x638 sqldk.dll!ClockHand::Statistic::RecordClockHandStats+0x2ad …
19 sql-server  ssms 

2
Windows OS QuantumとSQL OS Quantum
簡単な質問 SQL Server Quantum(4 ms)とServer OS Quantum(通常:187.5 ms)はどのように同期しますか? 簡単な質問の説明 184ミリ秒のOSクォンタム(46の完全なSQLクォンタムに対応)が使用された後、OSクォンタムには3.5ミリ秒の時間が経過してから、スケジュールを別のプロセスに引き渡す必要があります。SQL OSはクォンタム(4ミリ秒)を開始し、3.5ミリ秒後、OSクォンタムは、スケジュールを生成する前に0.5ミリ秒残っている現在のSQL OSスレッドを停止することを決定しました。今、何が起きた? OS Quantumの詳細 次のいくつかのセクションでは、OSクォンタムに関してこれまでに発見したことと、クォンタムの継続時間を計算する方法について説明します。OSの「クォンタム」の持続時間は「ティック」に基づいており、「ティック」自体の持続時間は「クロック間隔」に基づいており、通常は15.625000ミリ秒です。しかし、少し詳しく説明させてください... ダニ ブログの記事Know Know Thy Tickで、著者Jimはクロック間隔(別名「ティック」)の基本とその目的について説明しています。 「ほとんどのx86マルチプロセッサのクロックインターバルは約15ミリ秒です」などと読んだとき、クロックの値、つまり「ティック」のインターバルを決定せざるを得ません。幸いなことに、この引用を読んだ本であるWindows Internals Fourth Editionは、私の悩みを解決するための参考資料となります。...前述の本の著者であるMark Russinovichは、彼のWebサイトでユーティリティClockResを利用できるようにしてくれました。このユーティリティを実行すると、x86マルチプロセッサPCのクロック間隔が15.625000ミリ秒であることがわかりました。興味深いが、私の好奇心はもっと知りたい。 量子 記事の著者は、2番目の記事で説明を続けています。 それ... もちろん、ティック間隔が重要である本当の理由は、それがスレッドのスケジューリングに影響することです。Windowsスケジューラーは、各スレッドに実行する「量子」時間を与えてから、同じ優先度レベルの別のタスクの実行を許可します。スケジューラーがスレッドに割り当てるクォンタムは、ティック間隔の倍数です。特定のスレッドに選択された特定のクォンタム値は、この記事で説明したいところを少し超えています。 OK とりあえず、XPeのフォアグラウンドスレッドのデフォルトのクォンタム値を調べてみましょう。この場合、Windowsスケジューラは18または6ティック間隔のクォンタムを割り当てます。(はい、クォンタムをティック間隔に変換するには、3で除算する必要があります。ただし、複数の理由は、スケジューラーがスレッドを一時停止させる操作を行うためにスレッドを「チャージ」できるようにするためです。) クロック間隔(ティック)は約15.625000ミリ秒であり、デフォルトのクォンタムが18であるWindowsデスクトップOSでは6ティックまたは93.750000ミリ秒(18/3 * 15.625000ミリ秒)になることがわかっています。 Windows Server OSでは、デフォルトのクォンタムは異なります。「プロセッサのスケジューリング」設定が「バックグラウンドサービス」に設定されている この設定は、「システム設定|詳細(タブ)|パフォーマンス(セクション)|設定...」で確認できます。「パフォーマンスオプション|詳細(タブ)|プロセッサスケジューリング」が開きます。 デフォルトのクォンタム設定は、36(バックグラウンド)から36(フォアグラウンド)です。量子はより大きく、したがってより長くなります。これは、WindowsデスクトップOSの18(6ティック)クォンタムフォアグラウンド設定の93.750000ミリ秒の2倍の量であり、バックグラウンドサービス用に設定されたサーバーOSでは約187.500000ミリ秒です。 観察/説明 サーバーまたはデスクトップで「バックグラウンドサービス」から「アプリケーション」に設定を変更すると、レジストリのHKLM \ SYSTEM \ CurrentControlSet \ Control \ PriorityControl \ …
19 sql-server 

1
INSERTのOUTPUT句の順序に依存しても安全ですか?
この表が与えられた場合: CREATE TABLE dbo.Target ( TargetId int identity(1, 1) NOT NULL, Color varchar(20) NOT NULL, Action varchar(10) NOT NULL, -- of course this should be normalized Code int NOT NULL, CONSTRAINT PK_Target PRIMARY KEY CLUSTERED (TargetId) ); わずかに異なる2つのシナリオで、行を挿入し、ID列から値を返します。 シナリオ1 INSERT dbo.Target (Color, Action, Code) OUTPUT inserted.TargetId SELECT t.Color, t.Action, t.Code …

4
SQL再帰は実際にどのように機能しますか?
他のプログラミング言語からSQLに移行すると、再帰クエリの構造はかなり奇妙に見えます。一歩ずつ歩いていくと、バラバラになっているようです。 次の簡単な例を考えてみましょう。 CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; それを見てみましょう。 最初に、アンカーメンバーが実行され、結果セットがRに格納されます。したがって、Rは{3、5、7}に初期化されます。 次に、実行はUNION ALLを下回り、再帰メンバーが初めて実行されます。Rで実行されます(つまり、現在手元にあるRで実行されます:{3、5、7})。この結果は{9、25、49}になります。 この新しい結果はどうなりますか?既存の{3、5、7}に{9、25、49}を追加し、結果のユニオンRにラベルを付け、そこから再帰を続行しますか?または、Rをこの新しい結果{9、25、49}のみに再定義し、後ですべての結合を行いますか? どちらの選択も意味がありません。 Rが{3、5、7、9、25、49}であり、再帰の次の反復を実行すると、{9、25、49、81、625、2401}になり、 {3、5、7}を失った。 …

3
明確なフローの強制
このようなテーブルがあります: CREATE TABLE Updates ( UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, ObjectId INT NOT NULL ) 基本的に、IDが増加するオブジェクトの更新を追跡します。 このテーブルのコンシューマーはUpdateId、特定のから順に特定の100個のオブジェクトIDのチャンクを選択しますUpdateId。基本的に、中断した場所を追跡し、更新をクエリします。 私はクエリのみ書き込むことによって最大限に最適なクエリプランを生成することができましたので、これは興味深い最適化問題であることがわかってきましたが起こる私はインデックスのためにやりたいが、ないが保証する私が欲しいもの: SELECT DISTINCT TOP 100 ObjectId FROM Updates WHERE UpdateId > @fromUpdateId @fromUpdateIdストアドプロシージャのパラメーターはどこにありますか。 次の計画: SELECT <- TOP <- Hash match (flow distinct, 100 rows touched) <- Index seek UpdateId使用されているインデックスのシークにより、結果は既に素晴らしく、必要な更新IDの最低から最高まで並べられています。そして、これはフロー別の計画を生成します。それは私が望むものです。しかし、順序は明らかに動作を保証するものではないため、使用したくありません。 このトリックにより、同じクエリプランが得られます(ただし、冗長なTOPがあります)。 WITH …

2
TVPを読み取り専用にする必要がある理由、および他のタイプのパラメーターを読み取り専用にできない理由
このブログによると、関数またはストアドプロシージャのOUTPUTパラメーターは、パラメーターでない場合は本質的に値渡しであり、パラメーターである場合は本質的に参照渡しの安全なバージョンとして扱われOUTPUTます。 最初は、TVPの宣言を強制する目標は、TVPをパラメーターREADONLYとして使用できないことを開発者に明確に知らせることであると考えましたが、OUTPUT非TVPをとして宣言できないため、さらに処理が必要READONLYです。たとえば、次は失敗します。 create procedure [dbo].[test] @a int readonly as select @a メッセージ346、レベル15、状態1、プロシージャテスト パラメーター "@a"はテーブル値パラメーターではないため、READONLYとして宣言できません。 以来統計が保存されていない TVPにDML操作を防止することの理論的根拠は何ですか? OUTPUT何らかの理由でTVPをパラメーターにしたくないことに関連していますか?

3
負荷の下での挿入パフォーマンスの向上:なぜですか?
非常に非正規化されたテーブルへの挿入を実行するコードがあります。テーブルには、〜100〜300 +の範囲の列数があります。これは、Windows Server 2008上で実行されるSQL Server 2008 R2です。 各挿入は、同じトランザクションの下のいくつかのテーブルへの挿入で構成されます。一部の挿入はNHibernateによってバッチ処理されますが、一部は挿入できませんが、それらはすべて同じトランザクションの下にあります。 挿入を実行するコードを繰り返し呼び出して、たとえば500回挿入を実行すると、平均で約360ミリ秒になります。 奇妙なことに、4つのプロセス(Windows Server 2008の4つの異なるコマンドプロンプトから同じexeを実行)を使用してテストコードを同時に実行すると、呼び出しごとの挿入パフォーマンスが大幅に向上します。バーストは90ミリ秒(ほぼX4の高速)になります。コードから挿入時間を測定しています。 4つのプロセスは互いに何も知らないので、これはSQL Serverと関係があると考えていますが、その理由はまったくわかりません。なぜこれが起こっているのか、挿入がそれほど頻繁ではないときに同じパフォーマンスを得ることができる構成があるかどうかを知りたいです。 dbレベルで何が起こっているかを理解するためのSQL Server監視方法に関する提案も同様に歓迎します。


2
LOB_DATA、遅いテーブルスキャン、およびいくつかのI / Oに関する質問
列の1つがXMLデータで、XMLエントリの平均サイズが約15キロバイトのかなり大きなテーブルがあります。他のすべての列は、通常のint、bigint、GUIDなどです。具体的な数値を得るために、テーブルの行数が100万で、サイズが最大15 GBであるとします。 私が気づいたのは、すべての列を選択したい場合、このテーブルからのデータ選択が本当に遅いということです。私がする時 SELECT TOP 1000 * FROM TABLE ディスクからデータを読み取るのに約20〜25秒かかります-結果に順序を付けませんが。コールドキャッシュを使用して(つまり、後にDBCC DROPCLEANBUFFERS)クエリを実行します。IO統計の結果は次のとおりです。 スキャンカウント1、論理読み取り364、物理読み取り24、先読み読み取り7191、lob論理読み取り7924、lob物理読み取り1690、lob先読み読み取り3968 最大15 MBのデータを取得します。実行計画には、予想どおりクラスター化インデックススキャンが表示されます。 クエリ以外にディスクでIOが実行されていません。また、クラスター化インデックスの断片化が0%に近いことも確認しました。これは一般消費者向けのSATAドライブですが、SQL Serverは〜100-150 MB / minよりも速くテーブルをスキャンできると思います。 XMLフィールドが存在すると、ほとんどのテーブルデータがLOB_DATAページに配置されます(実際、テーブルページの約90%がLOB_DATAです)。 私の質問は-LOB_DATAページはサイズだけでなく、テーブルに多くのLOB_DATAページがある場合にSQL Serverがクラスター化インデックスを効果的にスキャンできないため、低速スキャンを引き起こす可能性があると考えるのは正しいですか? さらに広く-そのようなテーブル構造/データパターンを持つことは合理的であると考えられていますか?Filestreamを使用する際の推奨事項では、通常、フィールドサイズがはるかに大きくなるため、実際にはそのような道を行きたくありません。私はこの特定のシナリオに関する良い情報を実際に見つけていません。 私はXML圧縮を検討してきましたが、クライアント上またはSQLCLRで行う必要があり、システムに実装するにはかなりの作業が必要になります。 圧縮を試みましたが、XMLは非常に冗長であるため、(ac#アプリで)XMLを20KBから〜2.5KBに圧縮し、VARBINARY列に格納して、LOBデータページの使用を防ぎます。これにより、テストでSELECTが20倍高速化されます。

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