データベース管理者

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

2
XMLの解析が遅い
私は現在、やや問題のあるストアドプロシージャを調整しようとしています。実行に関連するコストの大部分は、いくつかのXMLを解析して一時テーブルに解析することに起因することに気付きました。問題のSQLは次のとおりです。 CREATE TABLE #ChangeSet ( RemarkTypeID TINYINT NOT NULL PRIMARY KEY, RemarkText VARCHAR(2500) NOT NULL, ListingID INT NOT NULL ) INSERT INTO #ChangeSet (RemarkTypeID, RemarkText, ListingID) SELECT T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID, T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText, @ListingID FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c) また、あなたは構文解析されているXMLの構造のいくつかの考えを持っています: <Remarks> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" /> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …

3
インデックスに対してDateAdd()によって制約されたビューの1行の推定を改善する方法
Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)の使用。 与えられたテーブルとインデックス: create table [User].[Session] ( SessionId int identity(1, 1) not null primary key CreatedUtc datetime2(7) not null default sysutcdatetime()) ) create nonclustered index [IX_User_Session_CreatedUtc] on [User].[Session]([CreatedUtc]) include (SessionId) 次の各クエリの実際の行は310万です。推定行はコメントとして表示されます。 これらのクエリがView内の別のクエリをフィードすると、1行の推定値のため、オプティマイザはループ結合を選択します。 親クエリの結合ヒントを上書きしたり、SPに頼ったりしないように、この基本レベルでの見積もりを改善するにはどうすればよいですか ハードコードされた日付を使用するとうまくいきます: select distinct SessionId from [User].Session -- 2.9M (great) where CreatedUtc > '04/08/2015' -- but …

2
複数の行データを複数の列を持つ行に取得する方法
次のようなMySQLテーブルがあります。 User_Id course_name course_location course_id 1 course name 1 location 1 1 1 course name 2 location 2 2 1 course name 3 location 1 3 2 course name 2 location 1 2 2 course name 4 location 4 4 次のような結果をデータで取得するにはどうすればよいですか。 User_id course 1 course2 course3 course4 1 yes-location1 yes-location2 …
8 mysql  pivot 

1
NOLOCKがデッドロックの問題の原因であることをどのように証明できますか?
私はウィンドウズ/マックタイプの議論を始めることを試みていません。 個人NOLOCK的には、再帰的な実践としては良い考えではない説得力は必要ありません。すべてを開発しているときは、反動的ではなく意図的である必要があります(/ amen) ですから...担当プログラマが主張するのNOLOCKが先です。すべてのアドホッククエリで、プロダクションをクエリするときは常にお勧めします。すべてのテーブルにnolockヒントがないストアドプロシージャを見たことはありません。 それをバックアップする何かがなければ、コアの信念はすべて間違っていると言ってやって来る人になりたくない。 さまざまなブログ投稿の下にあるコメントセッションを見るだけでは、リンクを送信するだけでは不十分な場合があります。長年の信念など...それが問題であると確信していない人もいます。参照:私が読んだすべてのnolockブログ投稿の下のコメントセクション。 現在、他の一部のDBAは、不可解なデッドロックに取り組んでいます。NOLOCKがソースであるかどうかをどのように判断しますか? トレースなどからXMLを見ることをお勧めしますが、これはデッドロックが問題を引き起こしていることを明示的に示すものではありませんか?単純なエラーメッセージは見たことがありません。本当? 他にどのようにしてこれらのデッドロックをこれに固定することができますか? のようなDDLステートメントCREATEは手がかりになります。指摘することができる出力や、アラームを上げる前に理論を裏付けるのに役立つと思われるデータの一部はありますか? または、トレースフラグまたは拡張イベントを実行して、デッドロックが発生したときに何が実行されているかを特定し、DDLステートメントから推定していますか? nolockヒントを使用してデータがめちゃくちゃになるさまざまな方法をすべて見てみると、明確に特定するのは難しい問題のようです。

4
SSMSでパスワードを記憶するチェックボックスを無効にすることはできますか?
いくつかのテスト目的で、オフィスの4〜5人の従業員に同じラップトップを提供していることがあります(高価なライセンスツールがそのラップトップにのみ存在するため)。また、資格情報を保存するためにSSMSの[ パスワードを記憶する ] チェックボックスをクリックしないように依頼しました。。 ただし、誤ってそのチェックボックスを誤ってクリックする人はほとんどいないSqlStudio.binため、問題を解決するためにをクリアする必要があります。その代わりに、その特定のラップトップのSSMSで[ パスワードを保存する ]オプションを無効にすると便利です。 SSMSでパスワードを記憶するチェックボックスを無効にすることはできますか? 予想される動作は次のとおりです。

4
完了する前にストアドプロシージャから応答を取得する方法
終了する前に、ストアドプロシージャから部分的な結果(単純な選択として)を返す必要があります。 それは可能ですか? はいの場合、それを行う方法は? そうでない場合、回避策はありますか? 編集:私は手順のいくつかの部分を持っています。最初の部分では、いくつかの文字列を計算します。追加の操作を行うために、手順の後半でそれらを使用します。問題は、呼び出し元が文字列をできるだけ早く必要とすることです。そのため、その文字列を計算してそれを(どういうわけか、たとえばselectから)返し、それから作業を続ける必要があります。発信者は、貴重な文字列をはるかに迅速に取得します。 呼び出し元はWebサービスです。


1
SELECT INTOは、実行前にTempDBで#Object名を予約しますか?
デバッグに役立つQuickieプロシージャをまとめると、コンパイラでエラーのように見えるものに遭遇しました。 create proc spFoo @param bit as begin if @param = 0 begin select * into #bar from [master].dbo.spt_values -- where number between ... end else begin select top 10 * into #bar from [master].dbo.spt_values order by newid(); end; end; 上記を試行すると、次のエラーが返されます メッセージ2714、レベル16、状態1、プロシージャspFoo、行19 データベースにはすでに「#bar」という名前のオブジェクトがあります。 人間が読める意味では、プロシージャは問題ないように見えます。ブロックselect into内にラップされているため、実行されるステートメントは1つだけですif-else。ただし、SQLサーバーは、ステートメントが互いに論理的に除外されていることを確認できません。おそらくもっと混乱するのdrop table #fooは、以下のようにがif-elseブロック内に配置されたときにエラーが残ることです(これにより、オブジェクト名の割り当てを解除するようコンパイラーに指示すると想定されます)。 create proc spFoo …

2
SQL Server 2014の突然のスローダウン/挿入なし/ハードウェアまたはインデックスに関連しない
350GBPCで約4,000万行のデータベースを実行しています。 SQL Server 2014、Win7、AMD 8350 @ 4.8GHZ、16 GBのRAM、500 GB SSD(データベースは、500 MB / 500 MBの読み取り/書き込みのスループットで、独自の500 GB SSDでホストされています)。 データベースは更新されていません。分析/読み取りを行っています。少数の作成をindexes、任意のjoin、count(*)など、私の目的のためにokです1分未満を取ります。私はデータに対していくつかのクエリを実行しており(単一の結合クエリを実行した後、40〜50回実行すると遅くなります)、1分かかった呼び出しが20分後にまだ実行されています。 私はシステムリソースを注意深く監視しておりSSD、クエリの開始時にキックインを確認できます。クエリが20〜30秒間読み取り121kB/second、次に次の20分間読み取ります。これは、CPUの問題やディスクの問題ではありません。私はRAMの容量に制限がありますが、データベースを最初にロードしたときに呼び出しは正常に実行されましたが、25分後、何も実行されません。 事実上、データベースにクエリを実行することはできませんSELECT。基本的なステートメントでさえ、呼び出しには非常に時間がかかります。インデックスの再構築と統計の更新を試みましたが、違いはありません。 私はこれについて多くの経験を持っていないので、SQLクエリが正しくない可能性があります。その場合、エラーが発生するか、または結果が0で実行を終了する可能性がありますが、どちらも発生しません。 私がやろうとしていることは、テーブルACALLSに基づいて、時間の5秒前に「TypeID」のすべてのインスタンスをカウントすることです。 SELECT ACALLS.StartTime, ACALLS.Time, ACALLS.ServerIP, ACALLS.SRVR, ACALLS.calls, ACALLS.TOKEN, COUNT(TypeID) as ExecRate FROM ACALLS INNER JOIN MAINVIEW ON MainView.TimeStamp BETWEEN ACALLS.StartTime and DATEADD(ss,-5,ACALLS.StartTime) WHERE DATEPART(hour,MainView.TimeStamp) BETWEEN 10 and 13 and CAST(MainView.TimeStamp …

3
データウェアハウスサーバー。RAM / CPU仕様をどのように計算しますか?
計画中のデータウェアハウスアップグレード用のデータウェアハウスサーバーの仕様を記述しようとしています。 VMWareホストで仮想サーバーを実行すると、必要に応じてリソースを追加または削除できます。以前は、必要に応じてRAMとCPUを段階的に追加していました。需要が高まるにつれて、より多くのリソースを求めてロビー活動を行ってきました。(主にディスクとRAM)。 もっとお願いします。彼らは私たちにできるだけ少ないを与えます。 しかし、最近リソースについて話すときはいつでも、そもそもマシンを正しく指定していないと非難されており、開発ホストが使い果たされていると言われ、RAMはもうありません。 私たちは小さな地方自治体の組織であり、DWを50人まで定期的に利用しています。通常の日常使用では問題なく動作します。mdxクエリのパフォーマンスは良好で、レポートとダッシュボードは高速です。ユーザーは満足しています。 ただし、ETLプロセスは夜通し実行されるため、データマートを同時に処理すると、メモリプレッシャーの兆候が見え始めています。昨夜、SSISは「メモリ不足エラー」に関する警告で失敗しました。 私たちの既存のDWサーバーは4つのCPUと16GbのRAMを搭載したWin 2008 R2で、SQL 2012 Stdを実行しています。私が持っている最大サーバーメモリ等の当社の既存のDWは3マート/ OLAPキューブを持っており、我々はより多くの2を開発しているOSおよびサービスのための4ギガバイトを残して、12ギガバイトのセットを。 +----------+----------+---------------+-----------+---------------+ | Datamart | Files GB | Fact (Rows) | Fact (Mb) | ETL & Process | | OLAP cube| | | | Time (hours) | +----------+----------+---------------+-----------+---------------+ | PBI | 3 | 190,000 | 180 | 0.2 | …

1
値で均等に分散されたグループに分割されたデータを選択します
グループ内の値の合計が可能な限り均等に分散されているテーブルからデータを4つのグループに選択したいと思います。私はそれを十分に明確に説明していないと確信しているので、例を挙げようと思います。 ここでは、NTILE(4)を使用して4つのグループを作成します。 SELECT Time, NTILE(4) OVER (ORDER BY Time DESC) AS N FROM TableX Time - N ------------- 10 - 1 9 - 2 8 - 3 7 - 4 6 - 1 5 - 2 4 - 3 3 - 4 2 - 1 1 - 2 上記のクエリと結果では、他の列は簡潔にするために省略されています。 したがって、次のようにグループを表示することもできます。 …

3
SQL Server 2008 R2へのアップグレードに伴うリスク
バージョン2005から2008 R2にアップグレードする必要のあるSQL Serverは多数あります。Microsoftがサポートを終了するため、今年の半ばまでに作業が予定されています。 2005 SQL ServerはすべてSP3とSP4であり、Windows Server 2003で実行されています(サポートはすでに終了していますが、もう1年間は例外です)。 これらのサーバーには、レプリケーション(トランザクション)、ログ配布、レポートサービス、およびSSISパッケージを実行する統合サーバーが含まれます。 ここでの私の質問はどのようにではなく、関連するリスクや、このアップグレードを計画する前に実行できる事前チェックについて知りたいですか? また、インプレースアップグレードは、この移行/アップグレードを並行して行うよりも優れた計画でしょうか?

3
挿入時にデフォルトで生成された一意の識別子を返します
ゴール テーブルに値を挿入した後、リアルタイムで最新のGUID値を取得します 問題 それを行う方法がわからない 情報 コードは住所と郵便番号の新しい値のみを指定する必要があります テーブルには多くのデータが含まれる可能性があります テーブル CREATE TABLE [AddressBook] ( [testID] [uniqueidentifier] NOT NULL default newid(), [address] [nvarchar](50) NULL, [zipcode] [nvarchar](50) NULL )

2
SQL Serverトランザクションログの圧縮
私は現在、制御不能になったSQL Serverトランザクションログを処理する必要があります。免責事項:私はdbaではなく、これは私の専門分野ではないので、ご容赦ください。 現在、500 MBのデータベース用に115 GBのトランザクションログファイルがあり、この状態になるには(明らかに)しばらく管理が不十分でした。 最優先事項は、実行する前に、このファイルによって占有されているディスク上のスペースを再利用することです。ドライブのサイズを増やすことは一時的であってもオプションではないと言われています。過去の成長に基づいて、我々はすぐに行動する必要があります。 私が理解しているように、最良のアプローチは、dbを完全復旧モードに保ちながら、ログファイルの定期的なバックアップをとり、一定期間監視し、初期サイズと増分を適切に調整することです。大丈夫。 午前0時に定期的にフルデータベースバックアップを実行しているときに、データベースを一時的にシンプルリカバリモードにして(これらのバックアップの1つが実行された後)、ログファイルを圧縮して(事実上すべての)領域を解放し、次に、上記のバックアップ戦略でそれを完全復旧に戻しますか? 私の考えでは、この時期に何かが起こった場合、ログを使用せずに完全なバックアップを復元することができます。 更新 いくつかの回答とコメントへの返信におけるいくつかの追加詳細: データベースを完全復旧モードのままにしておくために、ポイントインタイムリストアを実行する機能を保持したいと思います。 t-logファイルが非常に大きくなった理由は、バックアップされたことがないためです。log_reuse_wait_descが「LOG_BACKUP」を返すことを確認。

1
LocalSystemで以前に実行されている場合、NT SERVICE \ MSSQLSERVERアカウントでSQLサービスを実行する方法
最近、実験的なpuproseのために、サーバー設定のデフォルト(C:...)data \ logファイルパスを新しい場所(G:\ DBA)に再配置しました。 次に、既存のdbのdata \ logファイルを新しい場所(G:\ DBA)に移動し、SQLサービスを再起動しました。それ以来、私がDBを作成しているときはいつでも、期待どおりに機能しています。つまり、data \ logファイルが新しい場所(cool ...)に作成されています。 しかし、問題は、以前に存在していたすべてのDBがRecoveryPending状態であり、Access deniedのようなエラーが発生したことです。 SQLが実行されているサービスアカウント(NT SERVICE \ MSSQLSERVER)に新しい場所(G:\ DBA)へのアクセス権がないと考え、ログオンアカウントをコンピューターの管理コンソールでSQLサービスのローカルシステムとして変更しました。これで、すべてのdbが良好であることがわかります。 しかし、SQLサービスをNT SERVICE \ MSSQLSERVER(デフォルトのインスタンス)サービスアカウントで実行したいのですが。NT SERVICE \ MSSQLSERVERのG:\ DBA \へのフルアクセスを与えてみましたが、使用しませんでした。SQLサービスをNT SERVICE \ MSSQLSERVERサービスアカウントで実行する場合に必要なすべてのことを手伝ってください。私はこの分野の初心者です。私を助けてください。 前もって感謝します。。。

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