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

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

2
条件付きINSERTおよびSELECTよりもOUTPUTを使用したMERGEの方が良いでしょうか?
多くの場合、「存在しない場合は挿入」という状況が発生します。Dan Guzmanのブログには、このプロセスをスレッドセーフにする方法に関する優れた調査があります。 文字列をから整数に単純にカタログする基本的なテーブルがありSEQUENCEます。ストアドプロシージャでは、値の整数キーが存在する場合は取得するか、値の整数キーをINSERT取得してから結果の値を取得する必要があります。dbo.NameLookup.ItemName列には一意性の制約があるため、データの整合性は危険にさらされていませんが、例外は発生しません。 それはIDENTITYそうではないので、私は得ることができず、特定の場合にSCOPE_IDENTITYは値がありますNULL。 私の状況INSERTでは、テーブルの安全性だけを扱う必要があるため、次のMERGEように使用するのがより良い方法かどうかを判断しようとしています。 SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item ON f.ItemName= new_item.val WHEN MATCHED THEN UPDATE SET …

4
SQL Server FILESTREAMを使用する場合の(部分的な)バックアップを小さく保つ
FILESTREAMバックアップが不要な1TB近くのデータを含むデータベースがあります(データが削除された場合、数時間で自動的に再作成されるため、重要ではありません)。ほとんどのデータは数日ごとに変更されるため、差分バックアップではサイズを抑えることはできません。 私は、私はリカバリモードを設定することにより、必要な方法で作業のバックアップを持っていたFull別の作成、FILEGROUPためにFILESTREAMのみ「プライマリ」のバックアップを取って、FILEGROUP。これが原因で発生した問題は、ログファイル(バックアップされる)にFILESTREAMデータが含まれるために不必要に大きくなることでした。 SIMPLEリカバリモードは特定FILEGROUPのsのバックアップを実行する私の能力を奪うので、私もそれがオプションになるとは思わない。 私の考えは、FILESTREAMデータを別のデータベースに移動するだけですが、今では参照整合性を失い、他の多くの問題も確実に継承しています。 Simpleリカバリモードで部分的なバックアップを作成する方法はありますか(FILESTREAMテーブルを読み取り専用に設定せずに)?そうでない場合、私の問題に対する他の健全な解決策はありますか?

1
SQL Serverは、テーブルのIDENTITY VALUEを物理的にどこに保存しますか?
誰かが私にこの方向を正しい方向に向けてくれることを望んでいます。これが私のこれまでの成果です。 SELECT * FROM sys.identity_columns"last_value"を与えるシステムビューですが、そのビューの定義は内部関数を使用しますIdentityProperty(colName, 'LastValue')-したがって、それは行き止まりです(そこでシステムテーブルからプルしません)。 インターネットのどこでも(私が見た)DBCC IDENT_...コマンドを使用して値を明らかにすることを提案していますが、それでも実際に保存されている場所については暗闇の中に残ります。 そこで、DBCC PAGE(TestDB,1,1325,3)テストハーネスデータベースに対して個々のページを検索し、RESEEDコマンドを使用して値10と12の間で再シードすることにしました。 これを行うには、私は上の進値に気づいたIAM: Header、IAM: Single Page AllocationsとIAM: Extent Alloc Status Slot 1すべてが変わりました。(また、bUse1の値は、それ自体で徐々に変化しますが、とにかく定期的に変化することに気付きました)。 だからもう一つの行き止まりと私はすべてのアイデアからです。他にどこで検索できますか? 私はSQL Server 2014を実行しています。内部知識に対する飽くなき渇望がありますが、これほど理解しにくいものはまだありません。理論的には(絶対値)がどこかに保存され、(ほぼ間違いなく)位置を特定できるはずなので、私の注意を引きました。内部的に保存されたデータ/メタデータの場所を発見する私の探求において、この特定の値は私が特にとらえどころのないものとして私を打つ。私は誰かが一緒に来て私に言うことを推測/望んでいます、あなたはそれを手に入れることができますがDBCC PAGE、間違った場所を見ていました。

1
肥大化したシステムテーブルのパフォーマンスを改善できますか?
背景: 多数のVIEWと非常に多数のSYNONYMを持つ多数のデータベースがあります。たとえば、1つのデータベースには1万個以上のVIEWと2百万個以上のSYNONYMがあります。 一般的な問題:(および一般的なシステムテーブル) を含むクエリはsys.objects遅くなる傾向があります。関係sys.synonymsするクエリは氷河期です。パフォーマンスを改善するために何ができるか疑問に思っています。 特定の例 このコマンドは、サードパーティツールによって実行されます。アプリとSSMSの両方で遅い: exec sp_tables_rowset;2 NULL,NULL 私の質問: この実行を高速化するにはどうすればよいですか? 試したこと:この出力が得られた 場合SET STATISTICS IO ON: (2201538行が影響を受けます)テーブル 'sysobjrdb'。スキャンカウント1、論理読み取り28、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み0。テーブル 'sysschobjs'。スキャンカウント1、論理読み取り53926、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。 基になるシステムテーブルの統計を更新できました。これは、SQL 2008 R2以降の環境で機能しました。 UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN また、インデックスメンテナンスを実行することもできました。これは、SQL 2012以降の環境で機能します。たとえば、実行中sp_help 'sys.sysschobjs'はテーブルのインデックスを識別し、そこからこれらのコマンドを作成して実行します。 ALTER INDEX clst ON sys.sysschobjs REORGANIZE ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE ALTER INDEX nc2 …

4
結合の最大値を選択するクエリ
ユーザーのテーブルがあります: |Username|UserType|Points| |John |A |250 | |Mary |A |150 | |Anna |B |600 | とレベル |UserType|MinPoints|Level | |A |100 |Bronze | |A |200 |Silver | |A |300 |Gold | |B |500 |Bronze | そして、各ユーザーのレベルを取得するためのクエリを探しています。以下の線に沿ったもの: SELECT * FROM Users U INNER JOIN ( SELECT TOP 1 Level, U.UserName FROM Levels L …


1
COLUMNS_UPDATEDを使用して、特定の列のいずれかが更新されているかどうかを確認する方法
42列のテーブルと、これらの列のうち38列が更新されたときに何らかの処理を行うトリガーがあります。したがって、残りの4列が変更された場合、ロジックをスキップする必要があります。 私が使用することができUPDATE()関数と一つの大きな作成IF条件を、より短い何かをすることを好みます。COLUMNS_UPDATEDを使用すると、特定の列がすべて更新されているかどうかを確認できますか? たとえば、列3、5、および9が更新されているかどうかを確認します。 IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; したがって、20列3との5値、および1列の値9は2番目のバイトの最初のビットに設定されているためです。ステートメントを変更するORと、列3および/ 5または列9が更新されているかどうかが確認されますか? OR1バイトのコンテキストでロジックを適用するにはどうすればよいですか?

1
UNPIVOT(ループ結合)でバッチモードを使用する方法は?
次の形式のクエリがあります。 SELECT ... FROM ColumnstoreTable cs CROSS APPLY ( SELECT * FROM (VALUES ('A', cs.DataA) , ('B', cs.DataB) , ('C', cs.DataC) ) x(Col0, Col1) ) someValues これは、Columnstore-backedサブクエリ(ColumnstoreTable)からすべての行を取得し、それらの行を乗算します。これは本質的にUNPIVOTです。実際のクエリはこれよりも大きくなります。クエリのこの部分は、他の処理に送られます。 ここでの問題は、これCROSS APPLYが合理的な選択であるループ結合として実装されていることです。残念ながら、ループ結合はバッチモードをサポートしていません。 クエリのこの部分はパフォーマンスが非常に重要であり、バッチモードで実行するとパフォーマンスに非常に有益であると思われます。 バッチモードから移行しないように、このクエリを書き換えるにはどうすればよいですか? の代わりに一時テーブルを使用してみましたVALUESが、ハッシュ結合に等価結合条件がないという事実は変わりませんでした。

4
総訪問数を計算する
重複する日に注意して顧客の訪問数を計算するクエリを作成しようとしています。itemID 2009の開始日が23日、終了日が26日であるため、アイテム20010がこれらの日の間である場合、この購入日を合計カウントに追加しません。 シナリオ例: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 2015-01-27 5 0 20014 2015-01-29 2015-01-30 2 2 OutPutは7 …

4
データベースの復元ウィザードがSSMS 2014で開かない
Windows Server 2012 R2を実行している開発マシンで、SQL Serverを2012から2014にアップグレードしました。 SQL Server Management Studio 2014を使用すると、データベースを右クリックしてTasks -> Restore -> Database...も何も実行されません。データベースの復元ウィザードが期待どおりに表示されません。 イベントビューアーにはエラーやクラッシュはありません。カーソルは砂時計にもなりません。 T-SQLを使用した復元は正常に機能し、戻ってSSMS 2012を使用すると正常に機能します。SSMS 2014でウィザードを機能させる方法についてのアイデアはありますか? SSMSの両方のバージョンのSQL Serverの同じインスタンスに接続していますが、管理者としてSSMSを実行しようとしました。 Service Pack 1です。 Microsoft SQL Server Management Studio 12.0.4100.1 Microsoft Analysis Services Client Tools 12.0.4100.1 Microsoft Data Access Components (MDAC) 6.3.9600.17415 Microsoft MSXML 3.0 5.0 6.0 Microsoft Internet Explorer 9.11.9600.18125 …

4
不明なデータベースの理解を開始する場所
だから、タイトルはそれを要約しています。 28個のテーブルと86個のストアドプロシージャを備えたSQL Serverデータベースがあり、リバースエンジニアリングする必要があります。一部のテーブルは決して使用されず、すべてのprocも使用されるわけではないことを確信しています。 最大の問題は、このDBで使用するために作成されたすべてのWindowsサービス、およびすべてのソフトウェアとデータベースのドキュメントが失われ、システム全体を設計した人物がどこにも見つからないことです。 関係を理解するのに役立つER図を作成できましたが、データベース管理の経験がないため、どこから始めるべきかわかりません。 また、この種の質問がここで質問されることを意図していない場合は申し訳ありません。

1
SSISパッケージでトランザクションを作成する際の問題
トランザクションを使用する必要があるパッケージで作業していますが、現在次のエラーが発生しています: SSIS package "CATS-Package.dtsx" starting. Information: 0x4004300A at Data Flow Task, SSIS.Pipeline: Validation phase is beginning. Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container. Error: 0xC001401A at CATS-Package: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not available.". …

2
本番環境からテストデータベース内のいくつかのテーブルのみを更新する最良の方法は何ですか?
SQL Server 2008R2には、非常に大規模な運用データベースと非常に大規模なテスト環境データベースがあります。両方のデータベースのテーブル構造は似ていますが、ユーザー/ログイン/権限/ロールが異なります。 テストデータベース内のいくつかのテーブルだけを月に1回程度、実稼働から定期的に更新する必要があります。 私がこれを行うことを計画している現在の方法は BCPユーティリティを使用して、本番から必要なテーブルのエクスポートを取得します。 bcpエクスポートファイルをテストサーバーにコピーします テストで更新しているすべてのテーブルのインデックスと制約を無効にします テストデータベーステーブルを切り捨てる BCPを使用して、テストデータベーステーブルにデータをロードし直します。 テストでインデックスを再構築し、制約を再度有効にします これはすべて、このような小さなタスクには少し複雑すぎるようです。また、多くのやり直しが生成されるようです(t-logで)これを行うより良い方法はありますか? 私がこれを行う別の方法は、実稼働環境からテスト環境にバックアップを復元することですが、私が抱えている問題は、完全バックアップが非常に大きくなり、すべてのテーブルを更新する必要がなく、数回だけ更新する必要があることです- -また、運用データベースのユーザーとセキュリティはテストとは異なります。データベース全体を復元すると、運用データベースのセキュリティ設定によって上書きされます。

3
SQLバックアップで「バックアップ整合性の検証」をオフにすることの影響/リスクを理解する
現在、環境内のSQL Server 2005/2008 / 2008R2 / 2012サーバーでのバックアップには標準のメンテナンスプランを使用しており、[バックアップの整合性の確認]ボックスは常にオンになっています。 バックアップの一部は非常に長時間実行されるため、このオプションをオフにすることをお勧めしますが、管理者はこの変更の影響とリスクを文書化する必要があります。 このオプションの使用と履歴を理解していますが、(私の意見では)発生する可能性のあるエラーが検証中ではなくバックアップステップ中に発生する場合、バックアップジョブの時間を2倍にする必要はありません。 私が間違っている?ストリーミングテープなどではなくディスクにバックアップする場合、これをオフにすることは最小限のリスクですか?(必要に応じて、ネットワーク経由でEMC DD-800バックアップアプライアンスにバックアップします。) これをオフにしても安全な場合の公式のMS推奨事項はありますか? 環境内のすべてのバックアップで「検証」を実行していますか?それらをスポットチェックしますか? 編集:明確にするために、メンテナンスプランで[バックアップの整合性の検証]をチェックすると、SQLは各バックアップの直後に各データベースで完全な復元を行います。これは、元のバックアップと同様にデータ/ IOを集中的に使用し、(基本的に)バックアップジョブの全体的な時間を2倍にします。これは、ありません(私の知る限り、ウィザードで行うことができない)、バックアップの「チェックサム」オプションを有効にすると同じ。

2
WHEREクエリは、より困難な比較(つまり、varchar)を実行する前に、単純な比較(つまり、ビット)をチェックしますか?
複合WHERE句を含むクエリを作成する場合、たとえば: SELECT * FROM MyTable WHERE BitField = 1 AND VarcharField = 'asdf' また、そのbit比較を含めると、比較で除外されるのと同じフィールドが除外されるだけですvarcharが、そのbitフィールド比較が存在するとパフォーマンスが向上しますか?

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