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

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

5
IsDeleted(ソフト削除)を強制的に実装する場合の適切なインデックスアーキテクチャは何ですか?
現在、完全に機能する既存のデータベースとアプリケーションがあります。この時点でアーキテクチャを変更することはできません。今日、データベース内の各テーブルには、「IsDeleted」NOT NULL BITフィールドがあり、デフォルトは「0」です。アプリケーションがデータを「削除」すると、IsDeletedフラグが1に更新されます。 私が理解できないのは、各テーブルのインデックスの構成方法です。現在、すべてのquery / join / etcは常にIsDeletedチェックを実装しています。開発者が従わなければならない標準です。そうは言っても、各テーブルのクラスター化プライマリキーインデックスをすべて変更して、プライマリキーとIsDeleted BITフィールドを含める必要があるかどうかを判断しようとしています。また、すべてのquery / join / etcから。IsDeletedチェックを実装する必要がありますが、すべての単一のインデックス(非クラスター化)がIsDeletedフィールドをインデックスの最初のフィールドとして含むべきであるという適切な仮定ですか? もう1つの質問は、フィルター選択されたインデックスに関するものです。「WHERE IsDeleted = 0」などのインデックスにフィルターを適用して、インデックスのサイズを小さくできることを理解しています。ただし、すべての結合/クエリはIsDeletedチェックを実装する必要があるため、(結合/クエリでIsDeleted列が使用されるため)フィルター選択されたインデックスが使用されないようにしますか? 私は、IsDeletedアプローチを変更する能力がないことを忘れないでください。

1
RAWパーティションでのCREATE DATABASEは機能しなくなりましたか?
2つの未加工、つまりフォーマットされていないパーティションを使用してデータベースを作成しようとしています。 Microsoft Docsでは、これを実行できると述べています。次のように、rawパーティションのドライブ文字のみを指定するだけです。 CREATE DATABASE DirectDevice ON (NAME = DirectDevice_system, FILENAME = 'S:') LOG ON (NAME = DirectDevice_log, FILENAME = 'T:') ただし、SQL Server 2017は次のエラーを返します。 メッセージ5170、レベル16、状態4、行1 ファイル 'S:'は既に存在するため作成できません。ファイルパスまたはファイル名を変更して、操作を再試行してください。 メッセージ1802、レベル16、状態4、行1 CREATE DATABASEが失敗しました。リストされている一部のファイル名を作成できませんでした。関連するエラーを確認してください。 ドキュメントの適切な部分には次のように記載されています。 ファイルがrawパーティションにある場合、os_file_nameは既存のrawパーティションのドライブ文字のみを指定する必要があります。各rawパーティションに作成できるデータファイルは1つだけです。 そして、はい、ドライブS:とT:はどちらも私のシステムに存在する未フォーマットのrawパーティションです: DISKPART>詳細パーティション パーティション4 タイプ:ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 非表示:いいえ 必須:いいえ 属性:0000000000000000 バイト単位のオフセット:999934656512 ボリューム### LtrラベルFsタイプサイズステータス情報 ---------- --- ----------- ----- ---------- ------- ---- ----- …

1
SQL Serverボックスのボリュームを拡張するにはどうすればよいですか?
ここにあるシステム運用者(またはこの経験を以前に経験したことのある人)に対する質問があります。 私の会社は、運用中の既存のSQL Serverボックスに追加のディスク領域を割り当てたいと考えています。ボリュームの拡張(ディスクの管理の「ボリュームの拡張...」)をオンラインで実行できるのか、またはSQL Serverサービスをシャットダウンする必要があるのか​​疑問に思っています。 これを行うためにSQL Serverサービスを停止する必要がある理由、または日中にこの操作を実行するだけでよいのですか? システム仕様が関連する場合に備えて。これは、Windows 2012 R2およびSQL Server 2008 R2を実行する実際のボックス(仮想化なし)です。 ありがとう!

1
インデックス列の非常に大きなテーブルからのSELECT TOP 1は非常に遅いですが、逆順ではありません(「desc」)
強力なサーバーでSQL Server 2014を実行している約1 TBの大規模データベースがあります。数年はすべてうまくいきました。約2週間前に、次のような完全なメンテナンスを行いました。すべてのソフトウェアアップデートをインストールします。すべてのインデックスを再構築し、DBファイルを圧縮します。ただし、実際の負荷が同じ場合、特定の段階でDBのCPU使用率が100%から150%増加するとは予想していませんでした。 多くのトラブルシューティングを行った後、非常に単純なクエリに絞り込みましたが、解決策が見つかりませんでした。クエリは非常に簡単です。 select top 1 EventID from EventLog with (nolock) order by EventID 常に約1.5秒かかります!ただし、「desc」を使用した同様のクエリには常に約0ミリ秒かかります。 select top 1 EventID from EventLog with (nolock) order by EventID desc PTableには約5億行があります。データ型がbigint(Identity列)EventIDのプライマリクラスター化インデックス列(ordered ASC)です。上部のテーブルにデータを挿入する複数のスレッド(より大きなEventID)があり、下部からデータを削除する1つのスレッド(より小さなEventID)があります。 SMSSでは、2つのクエリが常に同じ実行プランを使用することを確認しました。 クラスター化インデックススキャン。 推定および実際の行番号は両方とも1です。 推定および実際の実行回数は両方とも1です。 推定I / Oコストは8500です(高いようです) 連続して実行した場合、クエリコストは両方で同じ50%です。 インデックス統計を更新しましたがwith fullscan、問題は続きました。インデックスを再構築しましたが、問題は半日消えたようですが、戻ってきました。 IO統計をオンにしました: set statistics io on 次に、2つのクエリを連続して実行し、次の情報を見つけました。 (最初のクエリについては、遅いクエリ) テーブル「PTable」。スキャンカウント1、論理読み取り407670、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。 (2番目のクエリ、高速クエリの場合) …

1
CHECKDBがメモリ最適化テーブルを持つデータベースのトランザクションログファイルを読み取るのはなぜですか?
tl; dr:CHECKDBがメモリ最適化テーブルを持つユーザーデータベースのトランザクションログを読み取るのはなぜですか? CHECKDBは、データベースの1つ(特に、インメモリOLTPテーブルを使用するデータベース)をチェックするときに、ユーザーデータベースのトランザクションログファイルを読み取っているようです。 このデータベースのCHECKDBはまだ妥当な時間内に終了するため、ほとんどの場合、動作に興味があります。ただし、このインスタンス上のすべてのデータベースのCHECKDBの期間は間違いなく最長です。 Paul Randalの叙事詩「あらゆる角度からのCHECKDB:すべてのCHECKDBステージの完全な説明」を見ると、データベースの一貫性のあるビューを取得するために、SQL 2005より前のCHECKDB がログを読み取っていたことがわかります。ただし、これは2016年なので、内部データベーススナップショットを使用します。 ただし、スナップショットの前提条件の 1つは次のとおりです。 ソースデータベースにMEMORY_OPTIMIZED_DATAファイルグループを含めることはできません ユーザーデータベースにはこれらのファイルグループのいずれかがあるため、スナップショットがテーブルから外れているように見えます。 CHECKDBドキュメントによると: スナップショットを作成できない場合、またはTABLOCKが指定されている場合、DBCC CHECKDBはロックを取得して必要な整合性を取得します。この場合、割り当てチェックを実行するには排他的なデータベースロックが必要であり、テーブルチェックを実行するには共有テーブルロックが必要です。 さて、スナップショットの代わりにデータベースとテーブルのロックを行っています。しかし、それでもトランザクションログを読み取る必要がある理由は説明されていません。それで何が得られますか? シナリオを再現するために、以下のスクリプトを提供しました。それは使用していますsys.dm_io_virtual_file_statsログファイルの読み取りを識別するためします。 ほとんどの場合、ログの小さな部分(480 KB)を読み取りますが、それよりもはるかに多く(48.2 MB)を読み取ります。私の実稼働シナリオでは、CHECKDBを実行する深夜に、毎晩ほとんどのログファイル(2 GBファイルのうち約1.3 GB)を読み取ります。 スクリプトでこれまでに得た出力の例を次に示します。 collection_time num_of_reads num_of_bytes_read 2018-04-04 15:12:29.203 106 50545664 またはこれ: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:25:14.227 1 491520 メモリ最適化オブジェクトを通常のテーブルに置き換えると、出力は次のようになります。 collection_time num_of_reads num_of_bytes_read 2018-04-04 15:21:03.207 0 0 CHECKDBがログファイルを読み取るのはなぜですか?そして特に、なぜログファイルのはるかに大きな部分を時々読むのですか? 実際のスクリプトは次のとおりです。 -- let's …

5
WHERE句の100,000を超えるエントリが原因のSQL Serverエラー8632
私の問題(あるいは少なくとも、エラーメッセージは)非常によく似ているクエリプロセッサの内部リソースを使い果たした-非常に長いSQLクエリを。 私の顧客は、正確に100,000エントリのwhere-clauseを含むSQL select-queryを使用しています。 クエリはエラー8632とエラーメッセージで失敗します 内部エラー:式サービスの制限に達しました。クエリで潜在的に複雑な式を探し、それらを単純化してみてください。 このエラーメッセージが正確に100,000エントリでスローされることは非常に奇妙であるため、これが設定可能な値であるかどうか疑問に思います。これは事実ですか?そうであれば、この値をより高い値に増やすにはどうすればよいですか? 上のMSDN、そこにクエリを再書き換えるための提案ですが、私はこの問題を回避したいと思います。 一方、私が話しているエントリのリストには自然数が含まれていることがわかりました。それらのかなりの数は連続しているように見えます( 13,15,16,17,18,19,20)。 これにより、SQLのwhere句は次のようになります。 where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20) これを次のように変換できます。 where (entry between 1 and 3) OR (entry between 6 and 10) OR (entry between 12 and 13) OR (entry between 15 and 20) これは次の方法で短縮できますか? where entry in (1,...,3,6,...,10,12,13,15,...,20) ...または同様のものですか?(私はそれがロングショットであることを知っていますが、それはソフトウェアの更新をより簡単で読みやすくするでしょう) 参考までに、where-clauseのデータは計算の結果であり、別のテーブルで行われます。最初にそのテーブルのエントリが読み取られ、最初にフィルタリングされ、次に追加の処理が行われます(使用することは不可能です) SQL)、その追加処理の結果はより多くのフィルタリングであり、その結果はwhere-clauseで使用されます。SQLで完全なフィルタリングを記述することは不可能であったため、前述の方法が使用されています。where-clauseの内容は処理ごとに変わる可能性があるため、動的なソリューションが必要であることは明らかです。

3
IF EXISTSでクエリをラップすると非常に遅くなる
私は以下のクエリを持っています: select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) 上記のクエリは3秒で完了します。 上記のクエリが値を返す場合、ストアドプロシージャを終了する必要があるため、次のように書き直しました。 If Exists( select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) ) Begin Raiserror('Source missing',16,1) Return …

2
SQL ServerがPERSISTED列を定義と一致しないデータで埋めることは合法ですか?
計算列の奇妙な値に関するこの質問をフォローしていPERSISTEDます。そこでの答えは、この振る舞いがどのようになったかについていくつかの推測をします。 私は次を求めています:これは完全なバグではありませんか?されているPERSISTED列は、今までにこのように動作することが許可されていますか? DECLARE @test TABLE ( Col1 INT, Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1 INSERT INTO @test (Col1) VALUES (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)), (ABS(CHECKSUM(NEWID()) % 5)) SELECT * FROM @test --shows impossible …

2
すべての子供の合計を見つける再帰的CTE
これは、再帰T-SQLクエリ(おそらくCTE)を使用して検索したいアセンブリツリーです。以下の結果が期待されます。任意の部品について、アセンブリごとの合計金額を知りたい。 つまり、「Rivet」を検索すると、直接の子の数だけでなく、アセンブリ内の各レベルの合計数を知りたいのです。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 現在、直接の親を取得できますが、CTEを拡張してこの情報を上にロールアップできるようにする方法を知りたいです。 With …


3
更新列がインデックスにない更新ステートメントに対するインデックスの影響
私はインデックスが遅くなると人々が言うのを常に見ますupdate、deleteそしてinsert。これは、まるで絶対的なものであるかのように、ブランケットステートメントとして使用されます。 データベースを調整してパフォーマンスを向上させている間、私はこの規則に論理的に矛盾していると思われるこのような状況に出くわします。 SQL Serverでは、他のほとんどのDBMSを使用すると考えられますが、インデックスは指定した特定の列に基づいて作成されます。挿入と削除は常に行全体に影響を与えるため、インデックスに影響を与えることはありませんが、更新はもう少しユニークに見えます。特定の列にのみ影響します。 インデックスに含まれていない列があり、それらを更新する場合、そのテーブル内の他の列にインデックスがあるために、それらは遅くなりますか? たとえば、私のUserテーブルには、1つまたは2つのインデックス、Identity / Auto Incrementカラムであるプライマリキー、および場合によっては外部キーカラム上の別のインデックスがあります。 電話番号や住所など、インデックスのない列を直接更新すると、どちらの状況でもこのテーブルのインデックスが他の列にあるため、この更新は遅くなりますか?更新している列はインデックスにないため、論理的には、インデックスを更新しないでください。どちらかと言えば、WHERE句でインデックスを使用すると、速度が向上すると思います。

3
データベース防災[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 データベースが250GBを超えています。サードパーティのツールを使用して、スケジュールされたバックアップを作成します。 スケジュールデータベースバックアップは、SQL Serverデータベースを破損から保護する最良の方法ですか?または、他の何かをお勧めできますか?

3
SQL Serverがインデックスを無視するのはなぜですか?
CustPassMaster16列のテーブルがありCustNum varchar(8)、その1つがであり、indexを作成しましたIX_dbo_CustPassMaster_CustNum。SELECTステートメントを実行すると: SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678' インデックスを完全に無視します。これは、CustDataMasterもう少し多くの列(55)を持つテーブルがあり、そのうちの1つが混乱しているためですCustNum varchar(8)。IX_dbo_CustDataMaster_CustNumこのテーブルのこの列()にインデックスを作成し、実質的に同じクエリを使用します。 SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678' そして、作成したインデックスを使用します。 この背後に特定の理由はありますか?なぜインデックスを使用しますが、インデックスを使用しCustDataMasterませんCustPassMasterか?列数が少ないためですか? 最初のクエリは66行を返します。2番目の場合、1行が返されます。 また、追加のメモ:CustPassMaster4991レコードがあり、CustDataMaster5376レコードがあります。これがインデックスを無視する理由になりますか?CustPassMasterまた、同じCustNum値を持つ重複レコードもあります。これは別の要因ですか? この主張は、両方のクエリの実際の実行計画の結果に基づいています。 CustPassMaster(未使用のインデックスを持つもの)のDDLは次のとおりです。 CREATE TABLE dbo.CustPassMaster( [CustNum] [varchar](8) NOT NULL, [Username] [char](15) NOT NULL, [Password] [char](15) NOT NULL, /* more columns here */ [VBTerminator] [varchar](1) NOT NULL …

1
未使用のインデックスの削除-予期しない危険性の評価
7月にサーバーが最後に再起動されて以来蓄積されているDMV統計によると、数百の未使用のインデックスを持つ非常に大きなデータベースがあります。DBAの1人が次の警告文を作成しましたが、私には意味がありません。 インデックスを削除する前に、クエリオプティマイザーがこのインデックスの存在を必要とする可能性があるため、一意性制約が適用されていないことを確認する必要があります。 インデックスが作成されるたびに、そのインデックスに関連する統計もSQL Serverに作成されます。クエリはインデックスを使用していない可能性がありますが、統計を使用している可能性があります。そのため、インデックスを削除した後、特定のクエリパフォーマンスが非常に悪くなるという状況が発生する場合があります。SQL Serverは、統計の使用統計を保持しません。データベースで「統計の自動作成」機能を有効にしていますが、クエリオプティマイザーが不足している統計を作成する前に、すべてのパラメーターを内部で満たす必要があるかわかりません。 #1に関しては、SQL Serverは実際にインデックスのシークを行って、挿入/更新が行われる前に一意性を判断するため、インデックスは使用されていないようには見えません。 #2に関して、これは本当に可能ですか? ちなみに、インデックスを使用しないという場合、シークもスキャンもありません。
16 sql-server  index 

1
sysadmin以外のドメインユーザーが所有するSQL AgentジョブからSSISパッケージを実行する
大規模なSSIS展開の一部として、問題なく(SQL Serverエージェント経由で)夜間に実行される2つのSSISパッケージがあります。すべてがWindows認証を使用しており、スケジュールされたジョブはsysadmin(私も)によって所有され、SQL Serverエージェントサービスアカウントとして実行されます。 そのため、データは基本的にsource system ~> transit db ~> staging ~> NDS一晩で処理されます。 私はハンドル、気に2つのSSISパッケージtransit db ~> stagingとstaging ~> NDSデータの特定のセットのために、それぞれの部品。 ドメインユーザー(sysadmin以外)が何かを実行し、source system興味深いデータをにプッシュするtransit dbため、勤務時間中にこの更新されたデータをフェッチして更新する方法が必要NDSです。この人にとって最も簡単な方法は、そのETLは、マクロ対応のExcelブックのボタンをクリックすることで、ODBCを介してSQL Serverに接続し(Windows認証を使用)、ストアドプロシージャを実行します。 ストアドプロシージャは次のようになります。 create procedure dbo.UpdateMaterialInventory as begin execute msdb.dbo.UpdateMaterialInventory; end [msdb]の「姉妹」ストアドプロシージャは次のようになります。 create procedure dbo.UpdateMaterialInventory with execute as 'SqlAgentProxy' as begin execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory'; end この[SqlAgentProxy]ユーザーは、ドメインユーザーのログインから[msdb]で作成したWindowsユーザーでexecute、このUpdateMaterialInventoryプロシージャへのアクセス許可を付与しました。これにより、ドメインユーザーににexecute許可を与える必要がなくなりますmsdb.dbo.sp_start_job。 SQL AgentジョブNDS-ManualMaterialInventoryはドメインユーザーが所有し、2つのステップがあり、それぞれ[SQL Server Integration …

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