データベース管理者

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


4
500M +アイテムのクエリを処理する方法
私のデータの構造は次のとおりです: date: <timestamp> filter_a: <integer> -> range [0, 1000] filter_b: <integer> -> range [0, 1000] filter_c: <integer> -> range [0, 86400] filter_d: <integer> -> range [0, 6] group: <string> second_group: <integer> variable_a: <float> variable_b: <float> variable_c: <float> a couple more no very important 次のクエリを実行する必要があります。 最初: フィルターデータによってdate、filter_a、filter_b、filter_c、その他 次に、フィルタリングされたデータを使用します。 すべてのレコードを数える 取得平均のvariable_a、variable_bおよびvariable_c 取得標準偏差のをvariable_a、variable_bそしてvariable_c …

1
SQLServerのBMKオペレーターとは
私は節からのこの質問に答えようとしていましたが、オプションです。しかし、計画のオペレーターに行き詰まっています。以下は実行計画のスクリーンショットです。 ご覧のとおり、クエリプランにはBMK演算子がありますが、計算方法は示されていません。 手順は、私がこれまで試してみました: 私はBMK1000を探し始めたが、それは同じで質問の束を示しoperator.finally私は1つの見つかったスレッドあなたがしている参照が保たれますヒープ内の保管場所であることを」BMKを語りますクラスターキーの代わりに非クラスター化インデックスを使用します。 "..しかし、これがどのように私と関連しているかはわかりません。インデックスがないためです。 質問: BMK演算子とは何であり、それはどのように計算されます。任意のポインターも役立ちます ここに問題を再現するSQLFiddleがあります

1
CLUSTERのパフォーマンスへの影響
Postgres 9.2データベースを最適化して、日付制限のあるクエリを高速化しようとしています。 私はtimestamp列を持っていますが、たいていはいつか尋ねているのでtimestamp、date解析するためのインデックスを作成しました: CREATE INDEX foo_my_timestamp_idx ON foo USING btree ((my_timestamp::date) DESC); 次に、パフォーマンスを向上させるために、CLUSTER foo上記のインデックスを使用してテーブルを作成します。 CLUSTER foo USING foo_my_timestamp_idx; SQL-CLUSTERのマニュアルによると、テーブル インデックス情報に基づいて物理的に並べ替えられます テーブルのPKを使用する他のクエリのパフォーマンスに影響があるかどうかを知ります(としましょうid_foo)。欠点はありますか?

1
SQL Serverは読み取り専用ファイルグループのレコードを更新しましたか?
データウェアハウスに非常に大規模なデータベースがあり、メンテナンスとバックアップを管理するためにパーティションを実装しています。特定の期間のレコードは、最終的には月に1回、読み取り専用ファイルグループに移行されます。 時々、私たちのETLプロセスはすでにアーカイブに移行された古いレコードを更新しようとしますが、これらは失敗すると予想されます。ただし、テスト環境のレコードが読み取り専用ファイルグループのパーティションにあるように見える場合でも、テストのレコードが更新される最近の例が少なくとも2つあります(クエリsys.partition_functionsとsys.partition_range_values)。 本番環境で同一のレコードを使用すると、レコードを更新しようとしたときに予期したエラーが発生します。これまでに2回これをキャッチしましたが、更新は本番環境では失敗しますが、テストでは成功します(その逆はありません)。 関連する環境の事実: SQL Server 2012 SP3 CU3(ビルド11.0.6537.0) テストは開発者版、製品はエンタープライズ版 リクエストに応じて他のユーザーに提供できます:現在深刻な困惑しています... 更新2016-08-19 新しいレコードがどういうわけか一晩で更新されました。読み取り専用ファイルグループ上にあることを確認しました。同時に挿入された(つまり、読み取り専用ファイルグループの同じパーティションにもある)レコードを更新できることがわかりました。同じパーティションで単一のレコードを識別し、そのレコードを複数回更新できました。夜間に更新されたレコードを更新しようとすると、予期した障害が発生します。 更新2016-08-11 更新は、読み取り専用パーティションでのテストの夜間処理中にも発生し続けます。プロセスから同じレコードを更新しようとすると失敗します。以前にそれを更新したユーザーとしてログインしたときに、同じレコードを更新しようとして失敗しました。私はまた、毎晩のプロセスでまだ触れられていない同様のレコードを更新して問題を再現することはできません。 更新2016-08-04 同じパーティションスキームを使用して、別のテーブルで同じ動作の別の発生を発見したため、その単一のテーブルに限定されないことを今日発見しました。 更新2016-08-03 このMSDNスクリプトからスクリプトを実行すると、Kendra Littleのパーティションヘルパービューを使用したときに得られる結果ph.FilegroupDetailとph.ObjectDetail、このデモから確認できます。問題のレコードはパーティション#2にあります(問題のレコードのパーティション列の値は2015-03-18です) Filegroup Low Boundary UpperBoundary Archive (RO) NULL 1900-01-01 Archive (RO) 1900-01-01 2015-04-01 ActiveFG (RW) 2015-04-01 2015-07-01 ActiveFG (RW) 2015-07-01 2015-10-01 ActiveFG (RW) 2015-10-01 2015-01-01 ActiveFG (RW) 2016-01-01 2016-04-01 ActiveFG (RW) …

2
Seek述語のスカラー演算子
SQL Server 2012で実際のクエリを簡略化したバージョンを以下に示します。コンテナテーブルからデータを選択するときに、シーク述語にスカラー演算子があります。 このシーク述語でのスカラー演算子の目的は何ですか? CREATE TABLE #EligibleOrders (OrderID INT PRIMARY KEY, StatusCD CHAR(3), CreatedOnDate DATETIME ) --insert logic into #EligibleOrders --Final Query SELECT T2.OrderID ,olic.LineItemID, SUM(c.quantity) AS ShippedQty, COUNT(DISTINCT c.ContainerID) AS ShippedCases FROM #EligibleOrders T2 INNER JOIN dbo.OrderLineItemContainers (NOLOCK) AS olic ON olic.OrderID = T2.OrderID INNER JOIN dbo.Containers (NOLOCK) AS …

1
AlwaysOn AGを2014年から2016年にアップグレードする推奨方法
Availability Groups1つの同期レプリカでSQL 2014から2016 にアップグレードする場合の推奨プロセスは何ですか? 私の理解では、in-placeアップグレードはデータベースの専門家の間ではあまり好まれていません。でin-placeアップグレードを回避する方法はありますAvailability Groupsか?2016サーバーを既存の2014可用性グループに参加させ、そこでフェイルオーバーしてから、他のインスタンスの1つを「強制終了」してアップグレードする可能性はありますか?(例えば、同じホストでSQLをサイドバイサイドで削除/再インストールすることにより) 他に考慮すべきアップグレードシナリオはありますか? 理想的なソリューションは、常に2つのonlineレプリカがあり、in-placeアップグレードを行う必要がないことです。

3
テンポラルテーブルがトランザクションの開始時間を記録するのはなぜですか?
テンポラルテーブルの行を更新するとき、行の古い値は、トランザクションの開始時刻をとして履歴テーブルに保存されますSysEndTime。現在のテーブルの新しい値には、トランザクションの開始時刻としてがありSysStartTimeます。 SysStartTimeそして、SysEndTimeされているdatetime2行が現在のバージョンであったときに記録する時間テーブルによって使用されるカラム。トランザクション開始時間は、更新を含むトランザクションが開始した時間です。 BOLさんのコメント: システムのdatetime2列に記録される時間は、トランザクション自体の開始時間に基づいています。たとえば、単一のトランザクション内に挿入されたすべての行は、SYSTEM_TIME期間の開始に対応する列に記録された同じUTC時間を持ちます。 例: Ordersテーブルのすべての行の更新を開始20160707 11:00:00し、トランザクションの実行に5分かかります。これにより、履歴テーブルにSysEndTimeas を使用して各行の行が作成され20160707 11:00:00ます。現在のテーブルのすべての行がありますSysStartTimeのを20160707 11:00:00。 誰かが20160707 11:01:00(更新の実行中に)クエリを実行すると、古い値が表示されます(デフォルトの読み取りコミット分離レベルを想定)。 しかし、誰かがAS OF構文を使用してテンポラルテーブルをそのままクエリする20160707 11:01:00と、新しい値が表示されSysStartTimeます20160707 11:00:00。 これは、当時のようにそれらの行が表示されないことを意味します。トランザクションの終了時刻を使用した場合、問題は存在しません。 質問:これは仕様ですか?何か不足していますか? トランザクションの開始時間を使用していると考えることができる唯一の理由は、それがトランザクションの開始時に唯一「既知」であるということです。開始時にトランザクションがいつ終了するかは不明であり、終了時に終了時刻を適用するのに時間がかかり、適用していた終了時刻が無効になります。これは理にかなっていますか? これにより、問題を再現できます。

2
変更された行ごとにカウンターを増やす
SEQUENCE機能のないSQL Server 2008 Standardを使用しています。 外部システムは、メインデータベースのいくつかの専用テーブルからデータを読み取ります。外部システムはデータのコピーを保持し、データの変更を定期的にチェックして、そのコピーを更新します。 同期を効率的にするために、前回の同期以降に更新または挿入された行のみを転送したいと思います。(行が削除されることはありません)。前回の同期以降に更新または挿入された行を知るために、各テーブルにbigint列RowUpdateCounterがあります。 行が挿入または更新されるたびに、そのRowUpdateCounter列の数が変化するという考え方です。RowUpdateCounter列に入る値は、増え続ける数列から取得する必要があります。RowUpdateCounter列の値は一意である必要があり、テーブルに格納される各新しい値は、以前のどの値よりも大きくなければなりません。 望ましい動作を示すスクリプトをご覧ください。 スキーマ CREATE TABLE [dbo].[Test]( [ID] [int] NOT NULL, [Value] [varchar](50) NOT NULL, [RowUpdateCounter] [bigint] NOT NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )) GO CREATE UNIQUE NONCLUSTERED INDEX [IX_RowUpdateCounter] ON [dbo].[Test] ( [RowUpdateCounter] ASC ) GO いくつかの行を挿入 INSERT INTO [dbo].[Test] …

4
SQL 2016 SQL Serverアサーション:ファイル:<pageref.cpp>、line = 951失敗したアサーション
現在、データウェアハウスをSQL 2012からSQL 2016にアップグレードしています。新旧両方のDWを並行して実行しています。 私のETLプロセス(サードパーティがSSISで開発したフレームワーク)は2012年に2年以上正常に実行されましたが、2016年には失敗しています。これまでのところ、データベースとETLプロセスは同じです。 どちらのサーバーも、VMWareで実行される仮想マシンです。古いサーバーはWin 2008で、24GbのRAMを搭載しています。SQL 2012標準 最大メモリは16Gbに設定されています。新しいサーバーは64GbのRAMを備えたWin 2012です。SQL 2016開発者。最大メモリは50Gbに設定されています。新しいDWはv13.0.1601.5 RTM Developer Edition(64ビット)を実行しています。 ETLプロセスの実行中に、SQL Mergeを使用してディメンションまたはファクトテーブルにロードするステップは、次のエラーで失敗します。 全文: 説明:SQL Serverアサーション:ファイル:、行= 951失敗したアサーション= 'IS_OFF(BUF_MINLOGGED、m_buf-&gt; bstat)|| pageModifyType!= PageModifyType_Contents || GetPagePtr()-&gt; IsTextPage() '。このエラーはタイミングに関連している可能性があります。ステートメントを再実行してもエラーが解決しない場合は、DBCC CHECKDBを使用してデータベースの構造的な整合性をチェックするか、サーバーを再起動してメモリ内のデータ構造が破損していないことを確認してください。 推奨されるとおり、DBCCを実行しましたが、エラーは見つかりませんでした。SQLも再起動しました。次に、ETLプロセスを再起動したところ、同じエラーが発生しました。 このエラーを検索したところ、SQL 2008、2012、2014の既知のエラーであり、その後の修正プログラムと累積的な更新で修正されたことがわかりました。2016年に再び表示されるのを見て少し驚いています。 私が見つけたリンクは、データベースがシンプルまたは一括ログ復旧モデルである場合に挿入を行おうとすると、SSISに影響を与えると言っています。(私は単純復旧モデルで実行しています) 推奨される回避策は、DB復旧モデルをFULLに変更することです。私はこれを試してみましたがうまくいきましたが、それはデータウェアハウスの解決策ではありません。 2016年に他の誰かがこれに遭遇しましたか? 誰かが代替の回避策を提案できますか? アップデート: 2016年7月26日:重要な更新KB3164398(v13.0.1708.0)を適用しましたが、問題はまだ存在しています。 2016年7月27日:累積的な更新プログラムCU1 KB3164674(v13.0.2149.0)を適用しました。 2016年3月8日:最小のキューブでエラーが一晩発生しました。CU1は問題を修正しませんでした。本日、私はMSコネクトのバグを報告し、マイクロソフトとのサポートコールも記録しました。 2016年12月8日:最初にMS-Supportが応答しましたが、「それに対する修正はありません」という応答でした。サポート担当者は、同僚とそれについて話し合い、私に連絡するつもりでした。8日後、彼から連絡がありません。 「解決策」はありませんが、自分に適した回避策を見つけました。私の投稿した回答をご覧ください。 2016年9月9日。先週CU2を適用しました。Thursayで、同じエラーで再び失敗した古いバージョンのマージを誤って実行しました。CU2はそれを修正していません。 2017 年 1 月23日:2016 SP1 CU1を適用しました。これで問題が解決したと思います。特にKB3205964

1
SQL Server Mangement Studioがデフォルトでインデックスをスクリプト化しないのはなぜですか?
最近、デフォルトでデータベースのスクリプトにインデックスが含まれていないことに気付きました。毎回オプションを変更する必要があります。 誰かが理由を説明してもらえますか?このデフォルトの動作について何か洞察はありますか、それともMicrosoftがそうしたいという理由だけですか?

2
単一データベースのクエリログを有効にする
mysql 5.6サーバーに多くのデータベーススキーマがありますが、ここでの問題は、1つのスキーマのみのクエリをキャッチしたいということです。 スキーマの1つが高負荷でサーバーに影響を与えるため、サーバー全体のクエリログを有効にできません。 彼らのやり方は、私が単一のスキーマでのみクエリをログに記録できるツールです。 クエリログが有効な場合のトランザクション/秒への影響を示すベンチマークグラフを見つけました。

2
この選択で1回のシークで同じ結果を取得する方法はありますか?
クエリを変更するか、オプティマイザの戦略に影響を与えることにより、1回のシークまたはスキャンで次と同じデータを取得することは可能ですか? これに類似したコードとスキーマは現在SQL Server 2014にあります。 再現スクリプト。セットアップ: USE tempdb; GO IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL DROP TABLE dbo.TestUpload; CREATE TABLE dbo.TestUpload( JobRunId bigint NOT NULL, ThingAName nvarchar(255) NOT NULL, ThingAType nvarchar(255) NOT NULL, ThingAGranularity nvarchar(255) NOT NULL, ThingBName nvarchar(255) NOT NULL, ThingBType nvarchar(255) NOT NULL, ThingBGranularity nvarchar(255) NOT NULL ); CREATE …

1
「フォッカー」とは誰ですか。なぜ彼は私のスキーマを所有しているのですか?
Compose.ioにPostgres DBデプロイメントがあり、アプリに標準の「compose」dbを使用しています。新しいスキーマでDBを再作成できるように、現在のDBの内容を消去したいと思います。これを行う最善の方法は「ドロップスキーマパブリックカスケード」を使用することですが、自分のデータベースでこれを実行しようとすると、 ERROR: must be owner of schema public スキーマの所有者はadmin(作成するユーザーがpsqlアクセスを提供する)ではなく、という名前のユーザーであることがわかりますfocker。 compose=&gt; \dn List of schemas Name | Owner --------+-------- public | focker (1 row) スキーマの所有者を変更しようとしましたが、上記と同じエラーで失敗しました。 なぜ私のデータベースはこのように設定されているのですか?管理ユーザーがデータベースを一掃できるように変更する方法はありますか?

1
先読み(プリフェッチ)を使用して、より多くの(およびさまざまな数の)論理読み取りを実行する理由
SQL Serverでtpchデータベースを作成した後、以下のクエリを試しました。 set statistics io on DBCC DROPCLEANBUFFERS; select top 100 * from dbo.lineitem order by l_partkey; テーブルのlineitemには、l_partkeyに非クラスター化インデックスがあります。上記のクエリを数回発行したところ、論理読み取りが毎回異なることがわかりました。 Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'lineitem'. Scan count 1, logical …

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