データベース管理者

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

1
影響を受ける行がないにもかかわらずトリガーをトリガー
これはより一般的な質問ですが、この質問の動機は、SQL Serverの使用中に直面した問題でした。 このトリガーは、副作用として、行が挿入されなかった場合にエラーが発生するロジックを含むテーブルのInsertイベントにアタッチされています。さらに調査したところ、行が挿入されていないにもかかわらず、トリガーが発動していることがわかりました。 MicrosoftドキュメントのDMLトリガーで使用されている言語は、この動作と矛盾しているようです。 DMLトリガーは、トリガーで定義されたテーブルまたはビューに影響するDMLイベントが発生すると自動的に有効になる特殊なタイプのストアドプロシージャです。 これは、DBMS全体のデフォルトの動作ですか?影響を受ける行がないときにトリガーを起動する特別な理由はありますか?

1
結合消去がsys.query_store_planで機能しないのはなぜですか?
以下は、クエリストアで発生するパフォーマンスの問題の簡略化です。 CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; plan_id列は、主キーとして文書化されているsys.query_store_planが、実行計画は使用されません撤廃への参加が期待されるように: DMVから投影される属性はありません。 DMV主キーplan_idは一時テーブルの行を複製できません A LEFT JOINが使用されているため、から行をT削除できません。 実行計画 これはなぜですか、ここで参加の削除を取得するにはどうすればよいですか?


1
Postgresの2000万行の「最新」クエリを最適化する
私のテーブルは次のようになります: Column | Type | -----------------------+-------------------+ id | integer | source_id | integer | timestamp | integer | observation_timestamp | integer | value | double precision | インデックスは、source_id、timestamp、およびtimestampとidの組み合わせに存在します(CREATE INDEX timeseries_id_timestamp_combo_idx ON timeseries (id, timeseries DESC NULLS LAST)) そこには20M行あります(OK、120Mありますが、source_id = 1で20Mです)。それは同じのために多くのエントリを持ってtimestamp変化させてobservation_timestamp説明した、valueで発生したtimestamp報告かで観察しますobservation_timestamp。たとえば、今日の午前12時に予測されるように、明日の午後2時に予測される気温。 理想的には、このテーブルはいくつかのことをうまく行います: 新しいエントリのバッチ挿入、時には一度に100K 時間範囲で観測されたデータを選択する(「1月から3月までの気温予測は」) 特定の時点から観測された時間範囲で観測されたデータを選択する(「11月1日に考えたように、1月から3月までの気温予測のビューは何ですか」) 2つ目は、この質問の中心となるものです。 テーブルのデータは次のようになります id source_id timestamp observation_timestamp …

2
属性に特定の文字が含まれていないXMLシーケンスを返す
次の単純なXMLを考えてみます。 <xml> <customer name="Max"> <email address="me@you.com" /> </customer> <customer name="Erik"> <email address="erik@your-mom.com" /> </customer> <customer name="Brent"> <email address="brentcom" /> </customer> </xml> アイテム<Customer>のaddress属性にが含まれて<email>いないシーケンスのリストを取得したい@。 したがって、次のような出力が必要です。 <customer name="Brent"> <email address="brentcom" /> </customer> mcve: DECLARE @x XML = '<xml> <customer name="Max"><email address="me@you.com" /></customer> <customer name="Erik"><email address="erik@your-mom.com" /></customer> <customer name="Brent"><email address="brentcom" /></customer> </xml>'; このクエリ: SELECT …
10 sql-server  xml  xquery 

2
結合されたテーブルの集計値の増分カウントを取得する
私は、MySQL 5.7.22、データベース内の2つのテーブルを持っている:postsとreasons。各投稿行には、多くの理由行があり、それに属しています。それぞれの理由には重みが関連付けられているため、各投稿には合計重みが関連付けられています。 重みの10ポイント(つまり、0、10、20、30など)の増分ごとに、その増分以下の合計重みを持つ投稿の数を取得します。その結果は次のようになるはずです。 weight | post_count --------+------------ 0 | 0 10 | 5 20 | 12 30 | 18 ... | ... 280 | 20918 290 | 21102 ... | ... 1250 | 118005 1260 | 118039 1270 | 118040 総重量はほぼ正規分布しており、非常に低い値と非常に高い値がいくつかありますが(最大値は現在1277)、大部分は中央にあります。の行数は120,000弱posts、約は120ですreasons。各投稿には、平均して5つまたは6つの理由があります。 テーブルの関連部分は次のようになります。 CREATE TABLE `posts` ( id BIGINT PRIMARY KEY …

2
クエリストア検索を終了しない
最初から私の質問/問題はこの前のものと似ていると言いますが、原因または開始情報が同じであるかどうかわからないため、質問をいくつか詳細に投稿することにしました。 手元の問題: 奇妙な時間(営業日の終わり近く)に、本番インスタンスの動作が不安定になります。 インスタンスのCPU使用率が高い(ベースラインが約30%の場合、約2倍になり、まだ増加し続けていた) 1秒あたりのトランザクション数の増加(ただし、アプリの負荷には変化が見られません) アイドルセッションの数の増加 この動作を表示しなかったセッション間の奇妙なブロッキングイベント(コミットされていない読み取りセッションでもブロッキングが発生していました) 間隔の上位の待機は1位で非ページラッチで、ロックは2位でした。 初期調査: sp_whoIsActiveを使用して、監視ツールによって実行されたクエリが非常に低速で実行され、大量のCPUを取得することを決定したことがわかりました。 その分離レベルはコミットされずに読み取られました。 奇妙な数字が見られた計画を調べました。StatementEstRows= "3.86846e + 010"で、約150 TBの推定データが返されます。 監視ツールのクエリモニター機能が原因であると考えたため、この機能を無効にしました(プロバイダーにチケットを開いて、問題が発生しているかどうかを確認しました) その最初のイベントから、それはさらに数回起こりました。セッションを終了するたびに、すべてが通常に戻ります。 クエリがクエリストアの監視のためにBOLでMSによって使用されるクエリの1つに非常に類似していることがわかります-パフォーマンスが最近低下したクエリ(異なる時点での比較) 同じクエリを手動で実行し、同じ動作を確認します(使用されるCPUが増え続ける、ラッチ待機が増える、予期しないロックなど)。 有罪の質問: Select qt.query_sql_text, q.query_id, qt.query_text_id, rs1.runtime_stats_id AS runtime_stats_id_1, interval_1 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi1.start_time), p1.plan_id AS plan_1, rs1.avg_duration AS avg_duration_1, rs2.avg_duration AS avg_duration_2, p2.plan_id AS plan_2, interval_2 = DateAdd(minute, …

1
クラスタ化インデックスを使用してSQL Serverテーブルからデータを削除するときに、Bツリーは再調整されますか?
SQL Serverデータベースに、主キーにクラスター化インデックスを持つテーブルがあります。テーブルには100万行あります。テーブルから10K行を削除した場合、削除操作の実行中にインデックスが再構築されますか? 削除操作はストアドプロシージャの一部です。一度に複数のクライアントがストアドプロシージャを実行できますが、個々の実行ごとに独自の行のセット(主キーによって一意に識別される)が削除されます。複数のクライアントがプロシージャを実行すると、キーロック(タイプU)がブロックされます。ブロッカーロックは同じテーブルの行に属しており、同時に実行されているトランザクションの一部ではありません。各実行はそれ自体の行のセットを削除しようとしているため、ブロックはありません。ロックのエスカレーションはオフになっているため、発生していません。 削除操作によってインデックスが再調整されるため、再構築プロセス中にテーブルの任意の行でキーロックが発生する可能性があると思います。 これについてのご意見をいただければ幸いです。

1
負の値とゼロの値を含む列の行を乗算する方法は?
クエリでグループ化された特定の列のすべての行の積を取得しようとしています。私は組み合わせ方のポイントに私を見つけたほとんどの例exp、sumおよびlog exp(sum(log([Column A]))) 私が抱えている問題は、列に値のゼロが含まれているため、log関数にゼロが渡されたときにこのエラーが発生することです。 無効な浮動小数点演算が発生しました。 case式を使用してこれを回避できると思いましたが、すべてのケースを評価しているように見えるので、それは私が思っているように機能しません... select Name, Product = case when min([Value]) = 0 then 0 when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column end from ids group by Name SqlFiddle 次の結果セットがあるとします。 Id Name Value _________________________________ 1 a 1 …

2
Parallelism Exchangeイベントのデッドロックが被害者なしである場合、それは問題ですか?
実稼働環境(SQL Server 2012 SP2-はい...わかっています...)にこれらのクエリ内並列スレッドデッドロックが多数見られますが、拡張イベントを介してキャプチャされたデッドロックXMLを見ると、犠牲者リストは空です。 <victim-list /> デッドロックは4つのスレッドの間にあり、2つはWaitType="e_waitPipeNewRow"、2つはWaitType="e_waitPipeGetRow"。 <resource-list> <exchangeEvent id="Pipe13904cb620" WaitType="e_waitPipeNewRow" nodeId="19"> <owner-list> <owner id="process4649868" /> </owner-list> <waiter-list> <waiter id="process40eb498" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe30670d480" WaitType="e_waitPipeNewRow" nodeId="21"> <owner-list> <owner id="process368ecf8" /> </owner-list> <waiter-list> <waiter id="process46a0cf8" /> </waiter-list> </exchangeEvent> <exchangeEvent id="Pipe13904cb4e0" WaitType="e_waitPipeGetRow" nodeId="19"> <owner-list> <owner id="process40eb498" /> </owner-list> <waiter-list> <waiter id="process368ecf8" …

2
バッチごとにコンパイルが発生します
T-SQLステートメントをバッチで送信するサードパーティアプリケーションがあります。 データベースは、SQL Server 2016 Enterprise SP1 CU7、16コア、256 GBメモリでホストされています。アドホックの最適化が有効になっています。 これは、実行されているクエリのダミーの例です。 exec sp_executesql N' IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT select field1, field2 from table1 where field1=@1 option(keep plan, keepfixed, loop join) select field3, field4 from table2 where field3=@1 option(keep plan, keepfixed, loop join)', N'@1 nvarchar(6)',@1=N'test' データベースを監視し、毎秒のバッチ数と毎秒のコンパイル数を見ると、それらは常に同じであることがわかります。負荷が高い場合、これは1000バッチ/秒および1000コンパイル/秒になる可能性があります。平均負荷では、150バッチ/秒です。 最近コンパイルされたプランのクエリキャッシュを分析します。 SELECT …

1
SQL Serverの行ごとのアクセス
そのように構造化されたテーブルがあります(簡略化) Name, EMail, LastLoggedInAt SQL Server(RemoteUser)に、LastLoggdInAtフィールドがnullではないデータ(選択クエリ経由)のみを表示できるユーザーがいます。 できるように見える?出来ますか?

1
2,135,044,521行テーブルのインデックスを最適化する
大きなテーブルでI / Oの問題があります。 一般的な統計 このテーブルには次の主な特徴があります。 環境:Azure SQLデータベース(階層はP4プレミアム(500 DTU)) 行:2,135,044,521 使用済みパーティション1,275 クラスター化およびパーティション化されたインデックス 型番 これはテーブルの実装です: CREATE TABLE [data].[DemoUnitData]( [UnitID] [bigint] NOT NULL, [Timestamp] [datetime] NOT NULL, [Value1] [decimal](18, 2) NULL, [Value2] [decimal](18, 2) NULL, [Value3] [decimal](18, 2) NULL, CONSTRAINT [PK_DemoUnitData] PRIMARY KEY CLUSTERED ( [UnitID] ASC, [Timestamp] ASC ) ) GO ALTER …

2
15分ごとにトランザクションログのバックアップを取ると、6時間ごとのログバックアップよりも多くのディスク領域が消費されますか?
私たちの環境では、ネットワークストレージの空き容量が少なくなっています。同時に、トランザクションログのバックアップを、6時間ごとではなく、15分ごとに行うようにしたいと思います。私の質問は、ログのバックアップ間隔を6時間から15分ごとに変更すると、より多くのディスク容量が消費されるのでしょうか。

1
データベースがRESTORING状態で止まっている根本的な原因を特定する
データベースがスタックRESTORING状態になるという問題を解決する質問があることを知っており、それらのソリューションを使用してデータベースを手動でオンラインに戻しましたが、私のシナリオは多少異なります。 本番環境のコピーをDEVインスタンスに復元するPowershellスクリプトを使用した自動復元があります。スクリプトは約1年間変更されず、復元プロセスが終了するRESTORINGこともありますが、復元されたデータベースが停止した状態になることがあります(スクリプトが正常に機能することもあれば、このように失敗することもあります)。 プロセスを手動で再実行するか、SSMSのユーザーインターフェイスまたはT-SQLを使用してデータベースを手動で復元するたびに、問題なく完了します。 CHECKDB復元されたDBで実行することを推奨する回答を見つけましたが、この問題の原因として何も出てきませんでした。 復元スクリプトはデータベースの完全バックアップを復元し、"WITH RECOVERY"オプションを使用するため、実際にはを使用して復元しているのに、復元プロセスを停止している可能性があるものを見つけようとしています"WITH RECOVERY"。 私はこれが時々起こっている理由を理解しようとすることに行き詰まっているので、どんな提案も本当に感謝しています。 症状を治療するのではなく、問題の根本的な原因を解決したいと思います。つまり、手動でDBを再度復元することです。 更新: @Brentが推奨するGithub Gist- こちら。

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