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

SQL Server 2014(メジャービルドバージョン12.0.xxxx)。sql-serverにもタグを付けてください。

2
1秒未満で発生するブロッキングを追跡する方法-SQL Server
1秒未満で発生するブロッキングの問題をトラブルシューティングしようとしています。OLTPアプリケーションは非常に機密性が高く、合意されたSLAに従って一部のトランザクションの応答時間が200ミリ秒未満である必要があります。新しいコードリリースにはロックエスカレーションの問題がいくつかあり、更新プログラムのバッチサイズを小さくすることで解決できました。バッチサイズが小さい場合でも、新しいspがOLTPトランザクションが更新しているのと同じ行をブロックしていると思われます。 ブロックされているセッションと待機しているリソースを見つける必要があります。私の理解では、「ブロックされたプロセスのしきい値」は最低1秒に設定できるため、ブロックはキャプチャされません。 wait_infoイベントとwait_completed xイベントを試しています。 これを追跡できる他の方法はありますか。ありがとう

1
TempDBの競合
SQL Server 2014 SP1にアクティブなOLTP 40GBデータベースがあります。IO_Completionの待機、ディスクキューの長さが900に上昇し、SQL Serverが応答を停止すると、クエリが遅くなることがわかりました。私たちが試したもの: インスタンスを再起動すると、すぐに同じように動作し始めます。 2回目の再起動後、各tempdbデータファイルの初期サイズを変更し(16個のデータファイルが作成されます)、正常に動作し始めました。 注:中間結果セットにはテーブル変数を使用しています。これらの結果セットは非常に小さいです。 それは月に2回起こりました。データファイルに手動で少しのスペースを追加するたびに、正常に動作し始めます。さらに興味深いのは、SQL Server 2008 R2とSQL Server 2012で同じセットアップ(同じハードウェア、同じフォルダーとファイルのセットアップ、同じワークロード)が正常に機能していることです。 恒久的な解決策を見つける手助けをしてください。 すべてのデータファイルの初期サイズは同じ1000MB、現在はそれぞれ1500MBです。すべて同じです。自動拡張はそれぞれ100MBです。これまでは、PFSおよびGAMページの競合に直面していましたが、16まで増加し、問題は解決しました。トレースフラグ1117と1118の両方が有効になっています。2つのNUMAノード上の24コア。すべてのデータファイルは同じボリューム上にあります。シンプルディスク、SANなし。 インスタンスは物理マシン上にあります。テーブル変数を使用したクエリとハッシュ結合を使用したクエリは、最も一般的にIO_Completion待機を生成します。 wBobによる詳細な回答により、さらに詳細に検索するようになりました。以前どのようにそれを見逃しましたか: データベース「tempdb」のファイル「templog」の自動拡張がユーザーによってキャンセルされたか、7704ミリ秒後にタイムアウトしました。ALTER DATABASEを使用して、このファイルのFILEGROWTH値を小さく設定するか、新しいファイルサイズを明示的に設定します。 これは、この種の問題が発生したときにログに記録されたものです。TempDBを別の高速ドライブに移動しています。

1
異なるユーザー特権でストアドプロシージャからSSISパッケージを実行する
さまざまなレベルの特権が必要なため、ユーザーが合理的な方法でSSISパッケージを実行できるようにすることに問題があります。 シナリオ:データのロードを担当する2つの異なるSSISパッケージを使用してデータウェアハウスを作成しました。1つは自動的に実行され(SQLエージェントジョブを介して正常に動作しています)、もう1つはアップストリームデータが完成してクレンジングされた後のユーザーの要求など このパッケージは、実行の開始時にデータベースをバックアップする(確実に確認する)、計算されたテーブルを削除して再作成するなど、非常に特権的な操作を実行します。 [SSISDB]。[catalog]。[create_execution]および[SSISDB]。[catalog]。[start_execution]ストアドプロシージャを介してこのジョブを実行するストアドプロシージャを記述しました。これはアカウントで実行すると正常に機能します。 (私はシステム管理者です)。 ストアドプロシージャは、SSISDBおよびMSDBで実行をキューに入れるために必要な高いレベルのアクセス許可のために通常のユーザーが実行すると失敗し、パッケージ自体は(低)セキュリティコンテキストで実行されているため失敗しました。 私が試したもの: ストアドプロシージャで「名前を付けて実行」を使用して問題を解決しようとしましたが、データベース間のチェーンの問題、信頼できるフラグなどが原因で失敗しました。 また、パッケージを実行するエージェントジョブを作成し、ストアドプロシージャからエージェントジョブを実行するだけで問題を解決しようとしましたが、次のような苦痛の世界に入りました。 ジョブごとに実行許可を設定できない 中央のサーバーロールを介してこのアクセスを構成して、スタッフの経時的な変化に対応し、ジョブが所有者として1人のユーザーしか持つことができないようにしたい プロキシアカウントの暗い世界、sql-authログインなどと組み合わせた資格情報 プランCおよびD 残っていると思う唯一のオプションは、昇格されたアクセス許可を持つ専用のSQL Serverログインを作成し、ユーザーを信用して資格情報を渡さない/インポートをスケジュールした人の監査可能性を失うことを信頼することです(この問題は組織)、または純粋にユーザーが「サーバーロール」アカウントとして認証できるようにWebフロントエンドをカスタムビルドし、Webアプリに2番目の(特権)接続でストアドプロシージャを実行させます。 そう.... 以下の方法に関するアドバイスはありますか? SSISパッケージに特権操作を実行させる 低い特権のユーザーによって実行されます(AD Windowsアカウントを使用) ジョブを実行するためのアクセスが中央のサーバーロールを介して管理されている場合(できれば、新しいWindowsグループを簡単に作成することはできません) そして、新しい中間/プロキシアカウントがSQL Server Authアカウントである場合(再び、ADに変更を加える非常に限られた機能) ここには多くの可動部品があることを理解しています(そして、一部は回転するブレードのように感じます)。 乾杯、ティム 編集... そのため、今日はssis_admin権限を持つ専用のSQL Serverログインを作成し、そのユーザーが所有する3つのSQL Serverエージェントジョブを作成し、エンドユーザーがexecute asそのユーザーに呼び出すストアドプロシージャを更新しました。これはcreate execution、SQL Serverログインとして呼び出すことができないため失敗しました。Windows アカウントが必要です。 ユーザーストアドプロシージャをexecute as、SQL Serverが(ADサービスアカウント)として実行されているWindowsアカウントに更新し、それssis_adminを許可するとエラーで失敗する 現在のセキュリティコンテキストを元に戻すことはできません。「実行方法」が呼び出された元のデータベースに切り替えて、もう一度試してください。 これはどこにも速く行きません:(

3
リンクサーバーをリロードする方法は?
Microsoft SQL Server 2014 Enterprise Editionを使用しています。サーバーを再起動するか、MSSQLSERVERサービスを停止する必要があるリンクサーバーで問題が発生します。サーバーが再び実行されると、(DB2への)リンクされたサーバーは正しく機能せず、SQL Serverは次のエラーを表示します。 メッセージ7302、レベル16、状態1、行10 リンクサーバー "Airspe"のOLE DBプロバイダー "DB2OLEDB"のインスタンスを作成できません。 サーバーを数回再起動した後にのみ、リンクサーバーが機能し始めます。 リンクサーバーを起動するためにサーバーを数回再起動する必要があるのはなぜですか? 他の解決策はありますか? これは、リンクサーバーの1つを作成するスクリプトです。 EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; Data Source=#####;Persist Security Info=True;Password=**********; User ID=######;Initial Catalog=######; Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400', @catalog=N'#####' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########' EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false' …

2
SQL Server dbを完全バックアップから復元できない、ログ処理が失敗、データベースが「復元中」状態
PCのローカルSQL Server Developer Edition 12.0.2000.8に開発目的でデータベースを設定しようとしています。データベース全体のバックアップと、ネットワーク経由で送られてきたトランザクションログ専用のバックアップファイルが用意されています。 完全バックアップから復元しようとすると、しばらくして(おそらく1時間以内に、データベースのサイズが〜270 GBになります)、エラーが発生します: System.Data.SqlClient.SqlError:データベース 'database name'のログの処理中にエラーが発生しました。可能であれば、バックアップから復元します。バックアップが利用できない場合、ログを再構築する必要があるかもしれません。(Microsoft.SqlServer.SmoExtended) この後、データベースは「復元中」状態になります。 私は次のようなものを実行したかった(この質問からそれを得た) ALTER DATABASE recovery_test_2 SET EMERGENCY; ALTER DATABASE recovery_test_2 SET SINGLE_USER; DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS; それに対して、データベースが「復元中..」状態にあるため、当然のことながらできません。復元プロセスを再起動しても同じエラーメッセージが表示され、ドロップと復元は再び役に立ちませんでした。 データベースを起動して動作させるにはどうすればよいですか?トランザクションの一貫性は私には関係ありません。 SSMS自動生成復元スクリプト: USE [master] RESTORE DATABASE [database_name] FROM DISK = N'D:\database_name.bak' WITH FILE = 1, MOVE N'database_name' TO N'D:\MSSQL\MSSQL12.MSSQLSERVER\MSSQL\DATA\database_name.mdf', MOVE …

3
自身を指すリンクサーバーの作成
servername\instancename次の呼び出しを使用して、SQL Server 2014インスタンスにリンクサーバーを作成しようとしています。 EXEC master.dbo.sp_addlinkedserver @server = N'servername\instancename', @srvproduct=N'SQL Server' エラーが発生しています: Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82 The server 'servername\instancename' already exists. これはSQL Server 2005で正常に機能し、MSDNによると、 リンクサーバーはSQL Serverの別のインスタンスである必要はありませんが、 そのため、これを許可しない最近のバージョンで何が変更されたのかわかりません。UIを使用すると、同様のメッセージが生成されます。 ローカルSQL Serverをリンクサーバーとして作成することはできません。 リクエストするのは奇妙なことだと理解していますが、2005年に機能した(かつては別のインスタンスにあった)レガシーコードをサポートすることです。ドキュメントには、動作するはずであると記載されていますが、動作しません。2014年にこれを機能させる方法はありますか、それとも基になるコードを変更する必要がありますか?

2
NVARCHAR(MAX)を圧縮する別の方法は?
NVARCHAR(MAX)フィールドを持ついくつかのテーブルを圧縮しようとしています。あいにく、圧縮rowとpage圧縮には希望の影響はありません(20 GBのテーブルに対して保存されるのは〜100/200 MBのみです)。また、列ストアおよび列ストアのアーカイブ圧縮は、NVARCHAR(MAX)フィールドの圧縮をサポートしていないため、適用できません。 ここに他の選択肢があるかどうかは誰にもわかりますか? また、列の内容は一意であるため、rowand page圧縮は効果がないと思いNVARCHAR(MAX)ます。

2
SQL Serverは、システムで生成された制約名に競合を作成できますか?
SQL Server 2008データベース(非クラスター化)に数百万のテーブルを作成するアプリケーションがあります。SQL Server 2014(クラスター化)にアップグレードしようとしていますが、負荷がかかっているときにエラーメッセージが表示されます。 「データベースに「PK__tablenameprefix__179E2ED8F259C33B」という名前のオブジェクトが既に存在します」 これは、システムで生成された制約名です。ランダムに生成された64ビットの数字のように見えます。多数のテーブルが原因で衝突が発生している可能性はありますか?テーブルが1億個あると仮定すると、次のテーブルを追加するときに衝突が発生する可能性は1兆分の1未満ですが、それは均一な分布を前提としています。衝突の可能性を高めるために、SQL Serverがバージョン2008と2014の間で名前生成アルゴリズムを変更した可能性はありますか? もう1つの重要な違いは、2014年のインスタンスがクラスター化されたペアであることですが、上記のエラーが発生する理由の仮説を立てるのに苦労しています。 PSはい、何百万ものテーブルを作成するのは非常識です。これは、私が制御できないブラックボックスのサードパーティコードです。狂気にもかかわらず、バージョン2008では機能しましたが、現在はバージョン2014では機能しません。 編集:詳細な検査では、生成されたサフィックスは常に179E2ED8で始まるようです-つまり、ランダムな部分は実際には32ビットの数字であり、衝突の確率は新しいテーブルが追加されるたびに50分の1です私が見ているエラー率にはるかに近い一致です!

4
SELECT INTOステートメントの進行
ETLフローには長時間実行されるSELECT INTOステートメントがあり、その場でテーブルを作成し、そのテーブルに数億のレコードを取り込みます。 ステートメントは次のようになります SELECT ... INTO DestTable FROM SrcTable 監視のために、実行中にこのステートメントの進行状況(おおよそ行数、書き込まれたバイト数など)の大まかなアイデアを取得したいと思います。 以下を試してみましたが、役に立ちませんでした。 -- Is blocked by the SELECT INTO statement: select count(*) from DestTable with (nolock) -- Returns 0, 0: select rows, rowmodctr from sysindexes with (nolock) where id = object_id('DestTable') -- Returns 0: select rows from sys.partitions where object_id = …

1
部分的にカバーする範囲の述語の優先度推定
現時点では、ヒストグラムステップを部分的にカバーする範囲述部のカーディナリティをSQL Serverがどのように評価するかを理解しようとしています。 インターネット上で、ステップ内統計値の基数推定で、私は同様の質問に出くわし、Paul Whiteはそれに対してかなり興味深い答えを出しました。 Paulの答えによれば、述語> =および>のカーディナリティーを推定するための式(この場合、少なくとも120のカーディナリティー推定モデルにのみ興味があります)は次のとおりです。 >の場合: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1))) > =の場合: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1)) TransactionDate列と '20140614'から '20140618'までの日時の範囲を使用して、範囲の述語に基づいてAdventureWorks2014データベースの[Production]。[TransactionHistory]テーブルでこれらの式の適用をテストしました。 この範囲のヒストグラムステップの統計は次のとおりです。 式に従って、次のクエリの基数を計算しました。 SELECT COUNT(1) FROM [AdventureWorks2014].[Production].[TransactionHistory] WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000' …

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

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ディザスタリカバリサービスを試してみましたが、彼らはあきらめました。何でもする。 更新:多くのテストの後、ページごとの復元は不要でしたので、アイデアを捨てました。手動リカバリ(破損したテーブルから不足しているレコードを手動で選択し、最後の既知の正常なバックアップに挿入する)を行い、自動化ツールを使用します(再び、何百ものテーブルがあります)。

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
複数のファイルのファイルグループに割り当て単位を含む正確なファイルを特定する方法はありますか?
どのデータベースファイルに、データベース内に存在するさまざまなHoBT(アラインされたものとアラインされていないもの)のどの割り当てユニットが含まれているかについて、詳細なビューを取得したいと考えていました。 ファイルグループごとに複数のデータファイルの作成を開始するまで、私が常に使用してきたクエリ(以下を参照)は役立ちました。 select SchemaName = sh.name, TableName = t.name, IndexName = i.name, PartitionNumber = p.partition_number, IndexID = i.index_id, IndexDataspaceID = i.data_space_id, AllocUnitDataspaceID = au.data_space_id, PartitionRows = p.rows from sys.allocation_units au join sys.partitions p on au.container_id = p.partition_id join sys.indexes i on i.object_id = p.object_id and i.index_id = p.index_id join sys.tables …

2
コンピューター名にハイフンが含まれていてT-SQLエラーが発生する
私は開発者であり、DBAではありません(これは、私が恐れている)自宅のコンピューター(という名前のJohn-PC)でSQL Server 2014 Expressを使用してレポートビルダー3.0を実行しようとしていますが、レポートを実行できません。 私は偶然のユーザー/ログインコンボを作成user = John-PCしてlogin = John-PC\John。でエントリを削除しようとすると: Drop Login John-PC\John エラーが発生します: 「-」付近の構文が正しくありません。 問題は私のコンピューター名のハイフンだと思います。 構文エラーを回避する方法はありますか? ユーザーを変更またはドロップする別の方法はありますか(ドロップしようとしましsys.server_principalsたが、アドホックな変更ができないというエラーを受け取りました)。 どういうわけか、レポートビルダーに新しいユーザー/ログイン名を付けることはできますか? 上記のいずれでもない場合、コンピューターの名前を変更するJohn_PCことはできますか?

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