データベース管理者

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

3
新しいサーバーでのパフォーマンスの低下
私たちは専用サーバー(シングルクアッドコア、6 GB RAM)を使用しており、新しい専用サーバー(2xヘキサコア、32 GB RAM)に移行しています。どちらもWindows Server 2008、SQL Server 2008です。新しいサーバーのパフォーマンスは、古い低速サーバーよりもわずかに劣ります。 テストでは、ASP.NETアプリケーションの実行速度が10〜20%遅くなります。STATISTICS IOおよびSTATISTICS TIMEを使用して個々の負荷の高いクエリを実行すると、新しいサーバーでの経過時間が10〜20%長くなります。SQLクエリプロファイルは、高価なクエリでのより高いCPU使用率を示します。 新しいサーバーのタスクマネージャーは、sqlserver.exeが22 GBのRAMを消費していることを示していますが、CPU値は常に非常に低いままです。 私はすべての統計を更新し、インデックスを再構築または再編成しました。実行したテストの量を考えると、この時点で実行プランは新しいサーバーに保存されているはずです。欠落しているインデックスがある場合(私はないと思います)、新旧のサーバーに同じように影響します。新しいものは古いものと同じデータの復元されたバックアップを持っています。 新しいサーバーでのパフォーマンスはもっと良くなると思っていましたが、負荷の方が心配です。負荷がかかった状態でも古いサーバーのパフォーマンスが向上している場合、この少し新しくなった新しいサーバーがその負荷をかけなければならない場合はどうなりますか? ここで他に何が欠けているでしょうか? 編集:MAXDOPを6に設定。 古いサーバーのOS、データベース、tempdbは同じ物理ドライブ(RAID 10)上にあります。合計4つの15k 3 Gb / s 3.5インチSAS。新しいサーバーには3つのドライブセットがあります。RAID1上のOS、RAID 10上のデータベース、RAID 5上のtempdb。合計9つの15K 6 Gb / s 2.5インチSAS。 古いサーバーには、1 x Intel Xeon E5620 2.40 GHz Quad-Core 8スレッド(w H / T)があります。新しいサーバーには、2つのIntel Xeon E5-2640 2.5 GHz 6コア12スレッド(w H …

2
LATCH_EXリソースMETADATA_SEQUENCE_GENERATORで待機
インベントリレポートを生成するプロセスがあります。クライアント側では、プロセスは構成可能な数のワーカースレッドを分割して、多数(潜在的に数千、通常は数十)のうちの1つのストアに対応するレポートのデータのチャンクを構築します。各ワーカースレッドは、ストアドプロシージャを実行するWebサービスを呼び出します。 各チャンクを処理するためのデータベースプロセスは、一連のデータを#Temporaryテーブルに収集します。各処理チャンクの最後に、データはtempdbの永続テーブルに書き込まれます。最後に、プロセスの最後に、クライアント側の1つのスレッドが永続的なtempdbテーブルにすべてのデータを要求します。 このレポートを実行するユーザーが多いほど、速度は低下します。データベース内のアクティビティを分析しました。ある時点で、プロセスのある時点で35の個別のリクエストがすべてブロックされているのがわかりました。これらのすべてのSPIDはLATCH_EX、リソースで約50ミリ秒待機していましたMETADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)。1つのSPIDにこのリソースがあり、他のすべてのSPIDがブロックしています。ウェブ検索でこの待機リソースについて何も見つかりませんでした。 使用しているtempdbのテーブルにはIDENTITY(1,1)列があります。これらのSPIDはIDENTITY列を待機していますか?ブロッキングを削減または排除するためにどのような方法を使用できますか? サーバーはクラスターの一部です。サーバーは64ビットのWindows 2008 R2 Enterpriseで64ビットのSQL Server 2012 Standard Edition SP1を実行しています。サーバーには64 GBのRAMと48のプロセッサがありますが、データベースは標準エディションであるため、16しか使用できません。 (このすべてのデータを保持するためにtempdbの永続テーブルを使用する設計にわくわくしないことに注意してください。これを変更することは、技術的および政治的な興味深い課題になりますが、私は提案を受け入れます。) 2013年4月23日更新 マイクロソフトでサポートケースをオープンしました。詳細については、この質問を更新していきます。 2013年5月10日更新 SQL Serverのサポートエンジニアは、待機がIDENTITY列によって引き起こされたことに同意しました。IDENTITYを削除すると、待機がなくなりました。SQL 2008 R2では問題を再現できませんでした。SQL 2012でのみ発生しました。

2
PL / SQLブロックに直接ddlステートメントを記述できないのはなぜですか
なぜPL / SQLブロックに直接ddlステートメントを書き込めないのか、たとえば、 CREATE OR REPLACE PROCEDURE test IS BEGIN truncate table table_name; // error END test; / だが、 CREATE OR REPLACE PROCEDURE test IS BEGIN execute immediate 'truncate table table_name'; // works fine END test; / なぜ2番目が正常に実行されたのですか?
11 oracle  plsql  ddl 

2
スキーマの変更は可用性グループを「破壊」しますか、それとも透過的に処理されますか?
私の組織はSQL Server 2012可用性グループの採用を計画しており、それがアプリケーションのアップグレードプロセスに与える影響(ある場合)を理解しようとしています。 私たちは8週間のサイクルでアプリケーションの更新をリリースします。どのリリースにもスキーマの変更やデータの移行が含まれる可能性があります。 私が理解しようとしているのは、HA / DRソリューションがスキーマの変更を透過的に処理する(新しい列、インデックスがセカンダリに追加される)かどうか、または各インスタンスでスキーマを作成してからAlways Onをオンに戻すために手動で介入する必要があるかどうかです。 私が想定しているデータ移行の部分は透過的に処理されますが、それも確認したいと思います。 また、可用性グループの構成に基づいてこれらの動作に違いはなく、誤っている可能性もないと全面的に想定しています。私にお知らせください。 一言で言えば; アプリケーションの特定のリリースでは、非常に大きなテーブル(数千から数億のレコード)に列を追加することで、テーブルを変更できます。一部の列は「完全に新しい」ため、Enterprise Onlineのスキーマ変更機能を利用できます。他の列は既存の列のリファクタリングである可能性があり(FullNameはFirstNameとLastNameに分割されます)、これらのフィールドに入力するために、テーブルの各行に対して移行が実行されます。これらの動作のいずれかでは、DBAがAlwaysOn構成を変更する必要がありますか、それともデフォルトで処理され、すべてのセカンダリがDDLおよびDMLステートメントを「無料」で取得しますか? あなたが提供できる明確さをありがとう。


2
LIMIT付きの遅いORDER BY
私はこのクエリを持っています: SELECT * FROM location WHERE to_tsvector('simple',unaccent2("city")) @@ to_tsquery('simple',unaccent2('wroclaw')) order by displaycount 私はそれに満足しています: "Sort (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)" " Sort Key: displaycount" " Sort Method: quicksort Memory: 206kB" " -> Bitmap Heap Scan on location (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)" " Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) …

1
ブロックサイズについて
私の質問はPostgresを対象としていますが、回答はデータベースの背景から得られたもので十分かもしれません。 私の仮定は正しいですか: ディスクのブロックサイズは固定ですか? RAIDコントローラーは異なるブロックサイズを持つことができますか?1つのRAIDブロックが複数の実ディスクブロックに分割されますか? ファイルシステムには独立したブロックサイズもあり、RAIDブロックサイズに分割されますか? Postgresは固定の8kブロックで動作します。ここでファイルシステムのブロックサイズへのマッピングはどのように行われますか?Postgres 8kブロックはファイルシステムによってバッチ処理されていますか? システムをセットアップするとき、すべてのブロックを8kにするのが最善ですか?または、設定は重要ではありませんか?クラッシュした場合に、いくつかの「間違った」ブロックサイズ設定がデータの整合性を危険にさらす可能性があるかどうかも疑問に思っていましたか?たぶん、Postgres 8kブロックを複数のディスクブロックに分割する必要がある場合はどうでしょうか。 または、何も一緒にバッチ処理されないため、定義されたブロックサイズ間のすべての不一致によってディスク領域が失われますか?

2
mysqlで外部キーにRESTRICTを使用する方法
のデータベース構造 CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

2
Postgresqlのメモリ使用量を表示する
UbuntuサーバーでPostgresqlを実行しており、そのメモリ使用量を監視できる必要があります。現在、1分間のcronジョブでスクリプトを実行しています。このスクリプトは、さまざまな統計を監視/記録し、Postgresqlの現在のメモリ使用量も監視/記録する必要があります。Postgresqlが共有メモリを有効に利用しているため、 'top'などのプログラムによって指定された値が正確ではないという事実を除いて、私は周りを検索しましたが、あまり見つけることができませんでした。 どのようにしたらPostgresqlの合計メモリ使用量をいつでも監視できますか?このデータは、後で分析用のグラフを作成するために使用されます。

2
付与されているにもかかわらず、「オブジェクトに対するSELECT権限が拒否されました」を受け取る
私はプログラマーであり、dbaではありません...私は危険なだけのことを知っています。 私は、データベースのdb_ownerであるレガシーユーザーを持つデータベースを継承しました。ビジネス上の理由から、既存のテーブル、スキーマなどに対するこのユーザーの権限を調整することはできませんが、いくつかの新しいテーブルが作成されており、このユーザーにそれらのSELECTアクセスのみを許可します。 これらのテーブルに対するこのユーザーの権限が設定されているため、GRANTに設定されているSELECTを除いてすべてが拒否されます。 ただし、このユーザー(dbadmin)がこれらのテーブル(AccountingAudit)の1つでSELECTを実行しようとすると、次のエラーが発生します。 The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. このSQLを実行して、このテーブル/ユーザーに設定されている権限を確認しました。 select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) as grantor, permission_name, state_desc from sys.database_permissions そして、これは私が返すものです: AccountingAudit dbadmin dbo ALTER DENY AccountingAudit dbadmin dbo CONTROL DENY AccountingAudit dbadmin dbo DELETE DENY AccountingAudit dbadmin …

1
MySQLレプリケーションスレーブの再起動
セットアップ後初めて、読み取り専用のMySQLレプリケーションスレーブを再起動する必要があります。 メンテナンスのためにスレーブを停止することに関するこの記事を見つけました(彼はmysqlデーモンの停止について説明しているだけですが)。 MySQLスレーブサーバーを安全に再起動する方法 要約すると、手順は次のとおりです。 ではmysqlクライアント: STOP SLAVE; FLUSH TABLES; OSから: /etc/init.d/mysql stop この時点で再起動し、システムが起動した後: ではmysql、クライアント(mysqlデーモンがブート時に起動するように設定されます): START SLAVE; これは正しく見えますか?他に何かすべきことはありますか?

2
MySQLでのトリガーvsストアドプロシージャのパフォーマンス
ここのDBA.StackExchangeの投稿(レコードのリビジョン番号を維持するためのトリガーのベストプラクティスは何ですか?)は、MySQLのパフォーマンスに関する興味深い質問(少なくとも、私にとって興味深い)を生み出しました。 コンテキストは、更新される行ごとにテーブルにレコードを挿入することです。行が更新される前に、以前の値を保存してから、列の1つ(「バージョン」列)を増分します。 これをトリガー内で実行すると、うまく機能します。MySQLの場合、トリガーは行ごとに行われるため、簡単に解決できます。現在テーブルにあるデータを選択し、それをロギングテーブルに挿入して、新しいデータの「バージョン」列を更新します。 ただし、このロジックをストアドプロシージャに移動することは可能です。その場合、挿入を実行してから、テーブルの「バージョン」列をインクリメントします。全体がベースに設定されます。 それで、この挿入を実行することになると、セットベースのストアドプロシージャアプローチまたはトリガーベースのアプローチを使用する方がパフォーマンスが良くなりますか? この質問はMySQLに関するものです(行ごとのトリガーがあるため)。ただし、他の行ごとのトリガーDBMSにも当てはまります。

3
.bakがバックアップであるデータベースよりもはるかに小さいのはなぜですか?
SQL Serverデータベースのバックアップを取ったところです。MDFファイルとLDFファイルの合計は約29 GBですが、.bakファイルはわずか23 GBで、約20%小さくなりました。 データセットの1つのバージョンが同じデータを含む別のバージョンよりも小さい場合の最初の推測はデータ圧縮ですが、圧縮は通常、特に高度に順序付けされたデータ(データベーステーブルなど)の場合、20%よりはるかに優れた圧縮率をもたらします。 )また、圧縮されたデータを簡単にさらに圧縮することはできませんが、.bakファイルは圧縮できることを知っています。 したがって、データが圧縮されておらず、何も破棄されていない場合(バックアップを作成することの目的は、後でデータを同じ状態に復元できるためです)、その20%が考慮されていません。

1
Oracle SQL Developerでのクエリ実行時間
set timing onクエリの実行が完了してから、クエリの実行にかかった時間を確認できることを知っています。 しかし、クエリの実行中にOracle SQL Developerで現在の実行時間を確認することはできますか? SQL Server Management Studioと古いクエリアナライザには、次のような機能があります。
11 oracle  tools 

3
SQL Server:システムテーブルのみのファイルグループ?
私たちの企業標準の1つは、ユーザーテーブル/インデックス用に個別のファイルグループ/ファイルを用意することです。これはデフォルトとして設定されているため、CREATE TABLEステートメントを修飾する必要はありません。 だからこんな感じ fileid 1 =システムテーブル、MDF fileid 2 = t-log = LDF fileid 3 =ユーザーのもの= NDF なぜこれが義務付けられたのか、元の正当性を理解するのを手伝ってくれる人はいますか? 私はそれがブードゥー教だと思う状態できれいに来ます。私は間違っていますか...? 編集:インデックス/パーティション/アーカイブを分離するためにファイルグループを使用する方法と、断片的に復元する方法を知っています。この質問は、システムテーブル専用の同じボリューム上の別のファイルグループの使用についてです。

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