データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

4
NVARCHAR列の値が実際にUnicodeであるかどうかを検出します
いくつかのSQL Serverデータベースを継承しました。ETLを取得するSQL Server 2014 Standardのソースデータベース(「Q」と呼びます)から約8670万行、41列の幅を持つ1つのテーブル(「G」と呼びます)がありますSQL Server 2008 R2 Standardで同じテーブル名を持つターゲットデータベース(「P」と呼びます)。 すなわち[Q]。[G] ---> [P]。[G] 編集:2017年3月20日:一部の人々は、ソーステーブルがターゲットテーブルの唯一のソースであるかどうかを尋ねました。はい、それが唯一のソースです。ETLに関する限り、実際の変換は行われていません。事実上、ソースデータの1:1コピーであることが意図されています。したがって、このターゲットテーブルに追加のソースを追加する予定はありません。 [Q]。[G]の列の半分強はVARCHAR(ソーステーブル)です。 13列はVARCHAR(80)です 9列はVARCHAR(30)です 2列はVARCHAR(8)です。 同様に、[P]。[G]の同じ列はNVARCHAR(ターゲットテーブル)で、同じ幅の同じ列数を持ちます。(つまり、同じ長さですが、NVARCHAR)。 13列はNVARCHAR(80)です 9列はNVARCHAR(30)です 2列はNVARCHAR(8)です。 これは私の設計ではありません。 ALTER [P]。[G](ターゲット)列のデータ型をNVARCHARからVARCHARに変更したい。安全に(変換によるデータ損失なしで)したいです。 ターゲット表の各NVARCHAR列のデータ値を見て、列に実際にUnicodeデータが含まれているかどうかを確認するにはどうすればよいですか? 各NVARCHAR列の各値を(ループで?)チェックし、値のいずれかが本物のUnicodeであるかどうかを確認できるクエリ(DMV?)は理想的なソリューションですが、他の方法も歓迎します。

4
クエリを変更してオペレーターの見積もりを改善する
許容時間内に実行されるクエリがありますが、そこから可能な限り最高のパフォーマンスを絞り出したいです。 私が改善しようとしている操作は、ノード17からのプランの右側にある「インデックスシーク」です。 適切なインデックスを追加しましたが、その操作に対して得られる推定値は、想定される値の半分です。 インデックスを変更し、一時テーブルを追加してクエリを書き直すことを探しましたが、適切な見積もりを得るためにこれ以上単純化することはできませんでした。 他に私が試すことができるものについて誰か提案がありますか? 完全な計画とその詳細については、こちらをご覧ください。 匿名化されていないプランはここにあります。 更新: 質問の最初のバージョンは多くの混乱を引き起こしたと感じているので、いくつかの説明とともに元のコードを追加します。 create procedure [dbo].[someProcedure] @asType int, @customAttrValIds idlist readonly as begin set nocount on; declare @dist_ca_id int; select * into #temp from @customAttrValIds where id is not null; select @dist_ca_id = count(distinct CustomAttrID) from CustomAttributeValues c inner join #temp a on c.Id …


1
列のインデックスを作成するときに、このsqliteクエリがはるかに遅いのはなぜですか?
(偽の)人の名前を含む、それぞれ50,000行の2つのテーブルを持つsqliteデータベースがあります。両方のテーブルに共通する名前(名前、ミドルネームのイニシャル、姓)がいくつあるかを調べる簡単なクエリを作成しました。 select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial; 主キー以外にインデックスがない場合(このクエリとは無関係)、すぐに実行されます。 [james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;" 131 real 0m0.115s user 0m0.111s sys 0m0.004s しかし、各テーブルの3つの列にインデックスを追加する場合(全部で6つのインデックス): CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` ) //etc. …


2
ヒープの圧縮
以下は、Microsoft Docsの段落です。 DML操作の一部としてヒープに割り当てられた新しいページは、ヒープが再構築されるまでPAGE圧縮を使用しません。圧縮を削除して再適用するか、クラスター化インデックスを作成および削除して、ヒープを再構築します。 なぜそうなのか分かりません。圧縮設定が指定されたヒープがある場合、テーブルに属するページに適用されないのはなぜですか? ありがとう

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

2
リレーショナルデータベースのルックアップテーブルに関するベストプラクティスは何ですか?
ルックアップテーブル(またはコードテーブルと呼ばれることもあります)は、通常、特定の列に指定できる値のコレクションです。 たとえば、次のparty2つの列を持つ(政党に関する情報を保存するための)というルックアップテーブルがあるとします。 party_code_idn、システム生成の数値を保持し、(ビジネスドメインの意味を欠いて)実際のキーの代理として機能します。 party_codeは、ビジネスドメインの意味を持つ値を保持するため、テーブルの実際のキーまたは「自然な」キーです。 そして、そのようなテーブルは以下のデータを保持しているとしましょう: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ party_code値は「共和党」と「民主党」を続けるの列は、テーブルの実際のキーであること、UNIQUE制約に設定されているが、私は必要に応じて添加party_code_idnし、論理的に言えば、ものの(表のPKとしてそれを定義しました、party_codeプライマリキー[PK]として機能する場合があります)。 質問 トランザクションテーブルからルックアップ値を指すためのベストプラクティスは何ですか?FOREIGN KEY(FK)参照を確立する必要があります(a)自然で意味のある値を直接参照するか、(b)値を代理しますか? オプション(a)、たとえば +---------------+------------+---------+ | candidate_idn | party_code | city | +---------------+------------+---------+ | 1 | Democratic | Alaska | | 2 | Republican | Memphis …

2
サーバーがセッションネゴシエーション中に空のパケットで応答し、クライアントが不正な形式のパケットエラーを返す
リモートmysqlサーバーに接続しようとしています。これは、100%の時間で発生します。 クライアント:Win32(AMD64)向けmysql Ver 14.14 Distrib 5.7.12 サーバーの:5.0.95 これは私が得るエラーです: C:\>mysql -h example.com -P 3306 -D prod_rcadb -u username -p Enter password: ********** ERROR 2027 (HY000): Malformed packet mysqladminと同じエラー: C:\>mysqladmin -h example.com -P 3306 -u username -p version Enter password: ********** mysqladmin: connect to server at '10.106.24.79' failed error: 'Malformed packet' それで、その会話がどのように見えるかを知るために、私はpcapを取りました。 …
14 mysql 

1
Azureでデータベースをv11からv12にいつ、誰が更新したかを確認できますか?
今日、私はすべてのAzure SQLデータベースサーバーがv11からv12に更新されたことに気付きました。私は自分の会社でこれらのダイヤルに触れる必要がある唯一の人ですが、アクセスできるのは私の会社だけではありません。このアップグレードを開始しなかったため、誰が、いつこの計画外の更新が行われたのかを知りたいと思います。 WTFに情報を丁寧に尋ねるアクセス権を持つ社内の全員にメールを書くことができることは知っていますが、できるだけ多くの事実との会話を開始したいです。また、すべてのサーバーをアップグレードするのはあまりにも意図的に感じられるため、これはMicrosoft / Azure SNAFUであると思う傾向があります。

2
SqlCommand.Prepare()を使用する意味と利点は何ですか?
SQLクエリの実行前にSqlCommand.Prepare()(MSDNを参照)メソッドが広く使用されている開発者コードに出会いました。そして、これの利点は何でしょうか? サンプル: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); 私は少し遊んでトレースしました。Prepare()メソッドを呼び出した後にコマンドを実行すると、SQL Serverで次のステートメントが実行されます。 declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 その後、パラメータが値を取得してSqlCommand.ExecuteNonQuery()呼び出されると、次がSql-Serverで実行されます。 exec sp_execute 1,@id=20 私には、これはステートメントがPrepare()実行されるとすぐにコンパイルされるように見えます。これの利点は何でしょうか?これは、それがプランキャッシュに入れられ、目的のパラメーター値で最終クエリが実行されるとすぐに再利用できることを意味しますか? SqlParametersで実行されるSqlCommandsは、常にプロシージャコールでラップされることがわかりました(別の質問で説明しました)sp_executesql。これにより、SQL Serverは、パラメーター値に依存しないプランを保存および再利用できます。 これに関してprepare()は、メソッドが役に立たないのか、時代遅れののか、ここで何かが足りないのでしょうか?

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
SELECTをブロックする大規模なINSERT
SELECT操作をブロックしている大量のINSERTに問題があります。 スキーマ このようなテーブルがあります: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = …

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