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

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

1
SQL Server 2016データベースをSQL Server 2017に一時的に移動してから元に戻す。出来ますか?
SQL Server 2016インスタンスからデータベースのバックアップを作成し、2017年のインスタンスに復元して作業を行う場合。 次に、2017年のインスタンスからそのデータベースを反転してバックアップし、それを使用して2016年のインスタンスの元のバージョンを上書きできますか?

1
このRX-Xロックが拡張イベントに表示されないのはなぜですか?
問題 シリアライズ可能な分離の下で、RX-Xロックを引き起こすクエリのペアがあります。ただし、拡張イベントを使用してロックの取得を監視すると、RX-Xロックの取得は表示されず、リリースされるだけです。それはどこから来たのですか? 再現 私のテーブルは次のとおりです。 CREATE TABLE dbo.LockTest ( ID int identity, Junk char(4) ) CREATE CLUSTERED INDEX CX_LockTest --not unique! ON dbo.LockTest(ID) --preload some rows INSERT dbo.LockTest VALUES ('data'),('data'),('data') ここに私の問題のバッチがあります: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN INSERT dbo.LockTest VALUES ('bleh') SELECT * FROM dbo.LockTest WHERE ID = SCOPE_IDENTITY() --ROLLBACK …

1
物理的なcheckdbのみが失敗していますが、完全なcheckdbは正常に完了しています
physical_onlyオプションを指定してcheckdbを実行していますが、次のような複数のエラーで失敗します。 メッセージ8965、レベル16、状態1、行1 テーブルエラー:オブジェクトID 1557580587、インデックスID 1、パーティションID 72057594088456192、割り当てユニットID 72057594177454080(行データ型)。ページ(1:13282192)、スロット3、テキストID 6370769698816の行外データノードは、ページ(0:0)、スロット0で参照されますが、スキャンでは表示されませんでした。メッセージ8965、レベル16、状態1、行1 テーブルエラー:オブジェクトID 1557580587、インデックスID 1、パーティションID 72057594088456192、割り当てユニットID 72057594177454080(行データ型)。ページ(1:13282192)、スロット5、テキストID 6370769764352の行外データノードは、ページ(0:0)、スロット0で参照されますが、スキャンでは表示されませんでした。 CHECKDBは、テーブル 'TableX'(オブジェクトID 1557580587)で0の割り当てエラーと5255の一貫性エラーを検出しました。CHECKDBは、データベース 'DatabaseX'で0の割り当てエラーと5255の一貫性エラーを検出しました。repair_allow_data_lossは、DBCC CHECKDB(DWH_LAND)によって検出されたエラーの最小修復レベルです。 ただし、完全なcheckdbは成功します。 CHECKDBは、データベース 'DatabaseX'で0の割り当てエラーと0の一貫性エラーを検出しました。DBCCの実行が完了しました。DBCCがエラーメッセージを出力した場合は、システム管理者に連絡してください。 TableXには約20万行があり、クラスター化された列ストアインデックスがあります。 次のバージョンのSQL Serverを使用しています: Microsoft SQL Server 2017(RTM-CU13)(KB4466404)-14.0.3048.4 心配する必要がありますか?

2
推定実行計画を表示すると、CXPACKET、PAGELATCH_SH、およびLATCH_EX [ACCESS_METHODS_DATASET_PARENT]の待機が生成されます
にmax degree of parallelism設定し2、にcost threshold for parallelism設定した4 vCPU VMでMicrosoft SQL Server 2016 SP2-CU6(13.0.5292.0)を実行しています50。 朝、SELECT TOP 100クエリの推定実行プランを表示しようとすると、大量の待機が発生し、推定プランをレンダリングする操作に数分、多くの場合5〜7分の範囲で時間がかかります。繰り返しますが、これはクエリの実際の実行ではなく、推定実行プランを表示するプロセスです。 sp_WhoIsActivePAGEIOLATCH_SH待機またはLATCH_EX [ACCESS_METHODS_DATASET_PARENT]待機のいずれかが表示され、操作中にポールランダルのWaitingTasks.sqlスクリプトを実行すると、待機が表示されるCXPACKETワーカースレッドでPAGEIOLATCH_SH待機が表示されます。 *リソースの説明フィールド= exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen ワーカースレッドは、statsテーブル全体をメモリに格納しているように見えます(Paul Randalのクエリから表示されるこれらのページ番号および後続のページ番号は、statsテーブルのクラスタ化キーに戻ります)。プランが戻ってくるstatsと、さまざまなレコードが残っているだけでキャッシュからテーブルの大部分が失われた後でも(同様のクエリからのシーク操作のためにプルされたと仮定します)、基本的に1日の残りの時間は瞬時です。 クエリが実際にSCAN演算子を使用するプランで実行されている場合、この初期動作を期待しますが、上記のリンクされたプランに示されているように、SEEKオペレーターに到達するためだけに実行プランを評価するときにこれを行うのはなぜですか?ここでのパフォーマンスを向上させるために何ができますか(営業時間前にこのステートメントを実行してデータを適切にキャッシュする以外に)。一対のカバリングインデックスが有益であると考えていますが、実際に動作の変更を保証しますか?ここで、ストレージとメンテナンスウィンドウの制限内で作業する必要があります。クエリ自体はベンダーソリューションから生成されるため、この時点で他の提案(より良いインデックス付け以外)を歓迎します。

1
古いバージョンを含むSQL Server 2017は、8kのディスクセクターサイズをサポートしていますか?
ディスク(回転メディアだけでなく、非回転メディア[SSD、NVMeなど]を含むように大まかに言います)ドライブは、基礎となるフォーマットとハードウェアで進化し続けています。これの一部は、512バイトの物理セクターサイズから4kの物理セクターサイズへの「拡張」であり、ディスク上のレイアウト(512n、512e、4kn)を変更します。 この次の進化は、8kの物理セクターサイズを使用することです。これは、一部のメーカーが生産と生産のセットアップを開始しています。この次のステップを考えると、8kセクターサイズのディスクはWindowsでサポートされていますか?SQL Serverはセクターサイズを考慮しますか?

1
アップグレード後のSQL呼び出しの処理中のSET NOCOUNTエラー
新しいサーバーと更新されたバージョンのMicrosoft SQL Serverを使用してテスト環境をアップグレードしていますが、問題が発生しています。 新しいサーバーでは、一部のストアドプロシージャを実行すると、古いコードに「オブジェクトが閉じられているときは操作が許可されません」が表示されます。このメッセージは古いサーバーには表示されませんでした。追跡するSET NOCOUNT ON;と、ストアドプロシージャに追加することで問題を解決できます。 データベースのデフォルトを調べましたが、デフォルトに関連する異なる設定(SQL Server 2008とSQL Server 2014)はありませんでした。 SET NOCOUNT ON1000のストアドプロシージャに追加する必要なく、これをグローバルに解決するには、どの設定を検討する必要がありますか?

2
「sa」パスワードを変更するには、SQLを再起動する必要がありますか(混合モードで)?
SQL "sa"アカウントが使用されるべきでない方法で使用されていることを発見したため、すべてのSQLインスタンスでsaパスワードを変更しています。 (SQL 2005〜2017のサーバーは混合認証モードで実行されています。すべてのユーザーとアプリケーションは、ドメインアカウントまたは非sa SQLアカウントを使用して接続する必要があります。監視していますが、他のアプリ、ユーザー、または非-saアカウントを使用した内部spid。) いくつかの質問: Q1:saパスワードを変更するには、SQLの再起動が必要ですか? saアカウントのパスワードを変更した後、SQLサービスの再起動が必要であると言ういくつかの参照を見つけました。 DBA SE:saパスワードの変更 SQLAuthority:Management Studioを使用したSAログインのパスワードの変更 本当?または、認証モードを変更する場合にのみ?または、私が日常的にsaとしてログオンする場合のみ? このSQL Server Centralスレッドは、変更すると既存のSQLエージェントジョブなどに影響を与える可能性があることを示唆しています。それは心配ですか?または、誰かがSAアカウントをSSISパッケージなどにハードコーディングした場合にのみ? (重要な場合は、SQLサービスとSQLエージェントサービスにドメインアカウントを使用し、SSISパッケージまたはPowerShellスクリプトを呼び出すジョブにドメインプロキシアカウントを使用します。) Q2:saパスワードを「通常の」方法で変更できますか? 他のアカウントと同じようにリセットできますか?SSMSを使用するか、より可能性が高い: ALTER LOGIN sa WITH PASSWORD = 'newpass'; または、シングルユーザーモードまたは計画的なダウンタイムを必要とするモードに入る必要がありますか?(「sa」として接続しているときではなく、ドメインアカウントから実行していることに注意してください。) Q3:このパスワードのローテーションを定期的に実行する必要がありますか?または、問題が見つかった場合のみ? これは推奨される「ベストプラクティス」ですか?

2
1000ページの制限に達するオンラインページの復元
(I / O障害により修正された)破損に苦しんでいるデータベースを回復しようとする仕事をしました。私は、データベースまたはデータベースに含まれる内容に詳しくありません。 古い(最大3週間)フルバックアップと一連のトランザクションログが与えられました...しかし、トランザクションログが欠落しているため、特定の日付までしか回復できません。2.5週間分のデータが失われています(このデータベースには常に多くのデータが追加されています)。 また、破損したデータベースのコピー(アクセス可能ですが、多くのページが破損/欠落しています)のコピーも提供されています。 私は典型的なDBCC CHECKDBコマンドを試してみました(まだありrepair_allow_data_lossません。他に何も機能しない場合、それは私の最後の手段になります)。 多くの人がデータベースに出入りした後(dbは1.5テラバイトの小さな怪物で、私がすることはすべて遅くて時間がかかります)、破損したページの最後の正常なバックアップからオンラインページの復元を試みました。 それを行うためにRESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'、DBCC CHECKDB出力から多くのコマンドを作成するスクリプトを作成しました(基本的には正規表現と異なる)...これまでのところ、これは1000ページの制限に達したと言った時点まで機能しました復元コマンドごとにファイルごと(このデータベースには8つのファイルがあります)。 そのため、「オンライン復元を完了する」ように求められますが、それを行う方法に途方に暮れています...私はテールログまたは最初の完全バックアップよりも完全なものを持っていないので、基本的に、残りのページで試行を続けるために復元を完了する方法がわかりません。 私は試してみましたRESTORE DATABASE <foo> WITH RECOVERYが、それでもうまくいきませんでした、私は持っていないログを要求します。 誰かがここから何かを回復しようとする方法についてのヒントを持っていますか?または、オンライン復元を「完了」して、さらに多くのページを復元しようとする方法はありますか?オフライン復元を試しても同じ問題が発生しますか(基本的WITH NORECOVERYにすべてを追加してから、最後に復元しようとしますか?) データベースを手作業で処理することは基本的に元に戻せません...数百万の行を持つ数百のテーブルがあり、それが何であるかについて明確な意味はありません。SELECT数百万行を超えると、破損したDBはクエリで失敗しますが、どこで解決できるかはわかりません。すべての非クラスター化インデックスを再構築しようとしましたが、行データを含む破損したページがあるため、どちらも機能しませんでした。 ある程度のデータ損失は許容されますが、DBでの一貫性の達成は少なくとも試みられるべきです。 破損したデータベースはまだオンラインであり、クライアントが作業しているため(新しいデータを取得し続けます)、ラボベンチで行うすべてのプロセスは、後で運用データベースで再現可能です(ダウンタイムは困難です)。 これはSQL Server 2014 Enterpriseです PS:私はDBAではありません...私はプログラマーですが、クライアントはいくつかの「エキスパート」SQLディザスタリカバリサービスを試してみましたが、彼らはあきらめました。何でもする。 更新:多くのテストの後、ページごとの復元は不要でしたので、アイデアを捨てました。手動リカバリ(破損したテーブルから不足しているレコードを手動で選択し、最後の既知の正常なバックアップに挿入する)を行い、自動化ツールを使用します(再び、何百ものテーブルがあります)。

1
SQL Serverの圧縮インデックスは、データ圧縮を指定せずに再構築時に圧縮されたままですか?
ページ圧縮(ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE))を使用してSQL Serverインデックスを再構築した後、(特定の断片化しきい値を超えた一部のメンテナンススクリプトで行われるように)その後の再構築では、データ圧縮を再度指定する必要がありますか?そうでなければ、インデックスは効果的に圧縮解除されますか?

3
このクエリの結果の列をすべて選択するのは、関心のある1つの列を選択するより速いのはなぜですか
を使用するselect *と、読み取りがはるかに少ないだけでなく、使用するよりも大幅に少ないCPU時間を使用するクエリがありますselect c.Foo。 これはクエリです: select top 1000 c.ID from ATable a join BTable b on b.OrderKey = a.OrderKey and b.ClientId = a.ClientId join CTable c on c.OrderId = b.OrderId and c.ShipKey = a.ShipKey where (a.NextAnalysisDate is null or a.NextAnalysisDate < @dateCutOff) and b.IsVoided = 0 and c.ComplianceStatus in (3, 5) …

2
内部結合のカーディナリティ推定問題
行の推定が非常に間違っている理由を理解するのに苦労しています、ここに私の場合があります: 単純な結合-SQL Server 2016 sp2を使用(sp1と同じ問題)、dbcompatiblity = 130。 select Amount_TransactionCurrency_id, CurrencyShareds.id from CurrencyShareds INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id option (QUERYTRACEON 3604, QUERYTRACEON 2363); SQLは1行を推定しますが、107131であり、ネストされたループを実行することを選択します(planへのリンク)。CurrencySharedsの統計が更新された後、見積もりは問題なく、マージ結合が選択されます(新しいプランへのリンク)。CurrencySharedsに1つのレコードが追加されるとすぐに、統計が「古く」なり、sqlが誤った推定に戻ります。 この単純なクエリについてはあまり心配しませんが、これは大きなクエリの一部に過ぎず、これはドミノの始まりです... 1つの行を100レコードテーブルに追加すると、このような損傷が発生するのはなぜですか?カーディナリティ推定トレースの出力を調べると、この警告***WARNING: badly-formed histogram ***が表示されますが、このトピックに関する詳細は見つかりませんでした。 ここに、カーディナリティ推定からの完全な出力が出力されます: Begin selectivity computation Input tree: LogOp_Join CStCollBaseTable(ID=1, CARD=107131 TBL: annexes) CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds) ScaOp_Comp x_cmpEq ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id …

2
「文字列またはバイナリデータが切り捨てられる」原因を確認する効率的な方法はありますか?
これは、この質問のフォローアップです。また、Microsoftからのこの機能要求に関連しています。 しかし、報告されてから長年が経過し、いくつかのメジャーリリースが市場に届きました。 質問: SQL Server 2017には、このエラーの根本原因の特定を容易にするメカニズムがありますか?または、問題が報告された約9年前と同じくらい調査するのは難しいですか?

1
SQL 2017 TDEデータベースで破損を引き起こすバックアップ圧縮
SQL Server 2017(CU3)では、TDEデータベースの1つでバックアップ圧縮を有効にすると、バックアッププロセスによってデータベースの特定のページが常に破損します。圧縮せずにバックアップを実行しても、破損しません。この問題を確認して再現するために行った手順は次のとおりです。 データベース「TDE_DB1」でDBCC CheckDBを実行します。すべてが良好で、エラーはありません。 圧縮せずにデータベースを正常にバックアップします。RESTORE VERIFYONLYはすべてが良いと言っています。 データベースを「TDE_DB2」として正常に復元します。すべて良好で、DBCC CheckDBはエラーを表示しません。 「TDE_DB1」データベースを圧縮して正常にバックアップします。「バックアップセットへの損傷が検出されました」と言うVERIFYONLYエラーを復元します。 データベースを「TDE_DB2」として復元しようとします。「データベースでページ(1:92454)でエラーが検出されました」というエラー 手順1〜3を繰り返します。すべてが良いです; DROP "TDE_DB1"および "TDE_DB2"; バックアップから「TDE_DB1」を復元します。すべてが良いです; 手順1〜5を繰り返します。同じ結果が得られます。 要約すると、データベースと通常のバックアップは正常に見え、データベースでCHECKDBを実行し、バックアップでVERIFYONLYを実行してもエラーは報告されません。圧縮を使用してデータベースをバックアップすると、破損が発生するようです。 以下にエラーのあるコードサンプルを示します。(注:TDEデータベースで圧縮を使用するには、MAXTRANSFERSIZEが必要です) -- Good, completes with no corruption; BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM; RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM; RESTORE DATABASE [TDE_DB2] FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak' WITH …

1
一時テーブルではなく、tempdbではなくユーザーデータベースで#で始まるSQL Serverテーブル名
どういうわけか、数十年前に、データベースで始まるテーブルが作成されました#。オブジェクトエクスプローラーでは、アプリのデータベースの下に表示されますが、ではありませんtempdb。何らかの理由で、Azureはこのようなデータベースをインポートしません。 ドロップしたり、名前を変更したり、操作したりすることはできません。オブジェクトエクスプローラーからの削除、スクリプトドロップ、GUIからの名前変更を試みましたが、いずれも機能しませんでした。 SQL 2008 R2を使用しています。 drop table [*app*].[dbo]."#OBSOLETE"; Database name '*app*' ignored, referencing object in tempdb. Msg 3701, Level 11, State 5, Line 1 Cannot drop the table '#OBSOLETE', because it does not exist or you do not have permission. exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete" Msg 15225, Level 11, State 1, …

4
このWHERE句の%は何をしますか?
私はトレーニングを行っていますが、スクリプトの1つに次のコマンドがあります。 SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 WHERE句でこのスニペットの目的を知りたい: Col1 % 3 = 1 私はインターネットでいくつかの調査を行ったが、このコマンドに関する参照は見つかりませんでした。
13 sql-server  t-sql 

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