データベース管理者

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

1
INSTEAD OF UPDATEトリガーを持つテーブルに対するUPDATEが、クラスター化インデックスの更新だけでなく、クラスター化インデックスの挿入も行うように見えるのはなぜですか?
非常に単純な例から始めましょう。2つのテーブルが同じスキーマで、PKでクラスター化されていますが、そのうちの1つにINSTEAD OF UPDATEトリガーがあります。 CREATE TABLE Standard ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO CREATE TABLE InsteadOf ( PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED, V INT NOT NULL ) GO INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0) GO CREATE TRIGGER …

3
InnoDBインポートのパフォーマンス
約1000万行(または7GB)からなる非常に大きなInnoDBテーブルを一括インポートするのに苦労しています(これは、これまでに作業した中で最大のテーブルです)。 Innoのインポート速度を改善する方法を調査しましたが、今のところ、私のセットアップは次のようになっています。 /etc/mysql/my.cnf/ [...] innodb_buffer_pool_size = 7446915072 # ~90% of memory innodb_read_io_threads = 64 innodb_write_io_threads = 64 innodb_io_capacity = 5000 innodb_thread_concurrency=0 innodb_doublewrite = 0 innodb_log_file_size = 1G log-bin = "" innodb_autoinc_lock_mode = 2 innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit=2 innodb_buffer_pool_instances=8 import is done via bash script, here is the mysql code: SET …

1
tempdbへのハッシュ/ソートの流出の頻度はどのくらいですか?
私たちのエンタープライズアプリケーションは、データストレージにSQL Serverを使用し、主にOLTPシステムです。ただし、アプリケーションの重要なコンポーネントは、重要なOLAPワークロードを生成します。 tempdbへの書き込み待ち時間は約100msです。この傾向は、時間をかけて保持し、ALLOW_SNAPSHOT_ISOLATION投入されるオフ。私たちはこれに関して問題のトラブルシューティングを行っていますが、これまでに見つかった唯一の興味深いことは、tempdbへのハッシュとソートの流出が非常に多いことです。これはOLAPワークロードによるものだと思います。 質問 流出の頻度はどの程度ですか?どれか?1秒あたりの流出回数は?予備データによると、毎秒約2回のハッシュ流出と1分あたり25回のソート流出があります。 この流出の頻度が、tempdbの書き込み待ち時間が長い主な原因である可能性はありますか? その他の情報 コアの数ごとに推奨されているように、tempdbには複数のファイルを使用しています。tempdbファイルはRAID 1 + 0 SAN(高性能SSDを搭載)上にありますが、これはメインのDBデータおよびログファイルと同じデバイスです。tempdbファイルのサイズは、非常にまれに大きくなるほど大きくなっています。トレースフラグ1117または1118は使用していません。別の変数は、このセットアップが、すべて中程度から高い負荷を経験する多くの異なるデータベースで共有されていることです。 100ミリ秒の書き込みレイテンシは、MSDN、SQLスキル、その他のサイトで見つかったtempdb書き込みレイテンシの許容範囲よりもはるかに大きくなっています。ただし、他のデータベースの書き込みレイテンシは良好です(10ミリ秒未満)。他の統計に基づいて、tempdbを特に内部オブジェクトに対して頻繁に使用しているようです。したがって、アプリケーションが内部オブジェクトを非常に多く使用している理由を調べるために掘り下げています。 私たちのプラットフォームには、さまざまな形で現れる実際のパフォーマンスの問題があります。私たちはパフォーマンスカウンターを監視し、DMビューを確認し、アプリの動作を分析して、システムのリソース使用特性を掘り下げようとしています。流出はメモリ内ではなくディスク上で実行されるため、流出は劇的な悪影響をもたらすことがわかっているため、現時点では流出に焦点を当てています。また、流出の数は非常に多いようですが、人々が「高」と見なしていることについて何らかの情報を入手したいと考えていました。

1
トランザクション分離レベルのスナップショットと切り捨て?
スナップショット分離とTRUNCATEに関して、私が予期していなかったこの動作に誰かが光を当てることができることを願っています。 データベース:スナップショット分離を許可= True; コミットされた読み取りスナップショットがオン= False。 手順1(長時間実行される複雑なSELECTのテーブルfooのコンテンツを多数の結合で置き換えます): BEGIN TRAN; TRUNCATE TABLE foo; INSERT INTO foo SELECT...; COMMIT; 手順2(テーブルfooからの読み取り): SET TRANSACTION ISOLATION LEVEL SNAPSHOT; SELECT * FROM foo; Procedure2の実行中にProcedure1が実行されている場合、Procedure2は、Procedure1が終了するまで(sp_WhoIsActiveに応じて)LCK_M_SCH_S待機で待機します。そして、Procedure2が完了すると、次の例外が発生します。 このトランザクションの開始以降、ステートメントによってアクセスされたオブジェクトが別の同時トランザクションのDDLステートメントによって変更されたため、データベース 'DatabaseName'でスナップショット分離トランザクションが失敗しました。メタデータはバージョン管理されていないため、許可されません。メタデータへの同時更新は、スナップショット分離と混在している場合、不整合を引き起こす可能性があります。 ただし、Microsoftでは、スナップショット分離では許可されていないDDLステートメントとしてTRUNCATEをリストしていません。http://msdn.microsoft.com/en-us/library/bb933783.aspx 手順2がTRUNCATEの前にテーブルから最も最近コミットされたデータをすぐに返すか、または手順1によって保持されてから、テーブル。手伝ってくれますか?

2
PL / pgSQL関数でレコードを返す-クエリを高速化する
私が持っているPerlで書かれた非フォークゲームデーモンのPostgreSQL 9.3データベースに書き込みプレーヤー統計にacyncクエリを使用しています、。しかし、データベースから何かを読み取る必要がある場合(プレーヤーが禁止されている場合や、プレーヤーにVIPステータスがある場合など)は、同期クエリを使用します。 これにより、データベースから値が読み取られるまで、ゲームが一瞬停止します。 値を読み取るために非同期クエリを使用するようにゲームデーモンを書き換えることはできません(試してみましたが、変更が多すぎました)。私の質問は、いくつかの無関係なクエリを組み合わせることは理にかなっています(新しいプレーヤーの場合に行う必要があることです)接続)を1つのプロシージャに追加し、Perlプログラムに同時にいくつかの値を返すにはどうすればよいですか? 現在のクエリはすべて、プレーヤーIDをパラメーターとして取り、1つの値を返します。 -- Has the player been banned? select true from pref_ban where id=? -- What is the reputation of this player? select count(nullif(nice, false)) - count(nullif(nice, true)) as rep from pref_rep where id=? -- Is he or she a special VIP player? select vip > now() …

1
MySQLインデックスの作成がテーブルで失敗する
更新:tl; dr:問題はMySQLがTMPDIRインデックスの作成時にを使用することでした。そして私TMPDIRはディスク容量が足りなくなった。 元のQ: InnoDBテーブルにインデックスを追加しようとしていて、を取得していtable is full errorます。十分なディスク容量があり、MySQL構成にはfile-per-table = 1があります。テーブルデータは85GBで、インデックスは約20GB-30GBであり、それよりもはるかに多くのディスク容量があると思います。私はext3も使用しているので、OSの観点からはファイルサイズの制限に問題はないと思います。 ログに記録されたエラーは次のようになります。 140616 13:04:33 InnoDB: Error: Write to file (merge) failed at offset 3 1940914176. InnoDB: 1048576 bytes should have been written, only 970752 were written. InnoDB: Operating system error number 0. InnoDB: Check that your OS and file system support files …
10 mysql  innodb  index 

1
再帰CTEのカーディナリティを「ヒント」にするにはどうすればよいですか?
最小限の例として次の再帰CTEを使用していますが、一般的に、オプティマイザは再帰CTEにデフォルトの「推測」カーディナリティを使用する必要があります。 with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * from w; /* n --- 1 2 3 4 5 */ explain analyze with recursive w(n) as ( select 1 union all select n+1 from w where n<5 ) select * …

1
テンポラルデータベース設計で一意のエントリを確保する正しい方法は何ですか?
テンポラルデータベースの設計に問題があります。店舗の任意の時間枠でアクティブレコードが1つだけであることを確認する方法を知る必要があります。私はこの答えを読みましたが、トリガーがどのように機能するかについて頭を抱えることはできません。特に、レコードの更新を防ぎ、代わりに新しいレコードを挿入する既存のトリガーをトリガーする方法。私の本当の問題は、終了日がnullの場合にストアが複数の有効日を持つことを防ぐ方法がわからないことです。(つまり、ストアの2つのアクティブなレコードを防止します) これは私が持っているものですが、有効日が異なる店舗の新しいレコードを挿入できます。 テーブル定義: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …


1
10億行を処理してカウントするためのデータベース設計
リアルタイムのGPSデータを約5000 prのレートで受信します。分(4つのTCPサーバーから)。各サーバーは単一の接続を使用してデータを挿入し、挿入と挿入の間でデータをバッファーします。15分ほどごとに、サービスがこのデータをフェッチし、それをトリップに処理します。旅行が生成されたら、実際のGPSデータは通常、それほど重要ではありません。ユーザーが地図上でルートを確認したい場合のみです。 問題は、データベースが挿入されるデータの速度に追いつくのに苦労しているように見えることです。負荷が増加すると、挿入時間が急激に増加し(> 30秒)、その結果、より多くのデータをバッファリングできるようになり、その結果、挿入が大きくなり、挿入時間が長くなります。 現在のデザイン、パフォーマンスを改善するために必要ないくつかのアイデア、いくつかの質問への回答、および人々が持っている可能性のあるその他のヒントについて、いくつかコメントをいただければ幸いです。 現在のデザイン 現在、データは1週間を表すテーブルに分割されており、1年以上経過したデータはセカンダリデータベースにアーカイブされます。挿入と読み取りの両方に使用される編集可能なビューで全体が結合されます。 テーブルデザイン Id(PK、uniqueidentifier) DeviceId(FK、int) PersonId(FK、int) VehicleId(FK、int) TokenId(FK、int) UtcTime(PK、datetime2(3)) 緯度(float) 経度(float) 速度(smallint) 見出し(smallint) 衛星(tinyint) IOData(varbinary(100)) IgnitionState(tinyint) UserInput(tinyint) CreateTimeUtc(datetime2(3)) 指数 DeviceId_CreateTimeUtc_Desc DeviceId_UtcTime_Desc(クラスター化) PersonId_UtcTime_Desc TokenId_UtcTime_Desc VehicleId_UtcTime_Desc 現在、毎週、インデックスを含めて約10 GBを占めています。現在、メインデータベースには約300 GBのデータがあります。 メインデータベースのデータテーブルには、1つのファイルを持つ独自のファイルグループがありますが、メインデータベースの他のすべてのテーブルと同じディスク上にあります。セカンダリデータベースは別のディスクにありますが、同じマシン上にあります。 新しいテーブルパーティション(週)が使用されるときに、インデックスの再構築ジョブも毎週実行していると思います。縮小は行われません。 マシンは12 GBのメモリを搭載した8コアHPであり、メインデータベースを保持するディスクはRAID 10を実行しています。 アイデア プライマリデータベースに保存されるデータの量を、たとえば最大1か月に制限します。少なくとも、データベースをバックアップ/復元用に管理しやすくなりますが、これによりパフォーマンスの向上が見込めますか? 現在のデータのファイルグループに2つのファイルを作成し、それらを2つの異なる物理パーティションに配布する 現在のデータを保持するマスタースレーブデータベースを作成して、挿入と読み取りが異なるデータベースで実行されるようにする 現在のデータのファイルをSSDディスクに配置します(ミラーリングによりSSDディスクとのパフォーマンスに違いが生じますか?) さらに情報が必要な場合はお知らせください。パフォーマンスに影響を与える恐ろしいほど多くの要因があり、おそらくそれを調整する多くの方法があります。

2
AlwaysOn可用性グループの自動フェールオーバーが機能しない
AGセットアップで遊ぶ私はWSFCを起動し、DevClusterOnlineと呼ばれる1つの可用性グループの2つのノードで構成しています。両方のノード(DEV-AWEB5プライマリ、DEV-AWEB6セカンダリ)はWindows Server 2008 R2を実行しています。 AGの状態をチェックすると、次のようになります。 以下のクエリを実行すると、この結果セットが返されます。 select ar.replica_server_name, availability_group_name = ag.name, ar.availability_mode_desc, ar.failover_mode_desc from sys.availability_replicas ar inner join sys.availability_groups ag on ar.group_id = ag.group_id order by availability_group_name, replica_server_name; DEV-AWEB5を切断すると、グループリスナー(DevListener)に接続できませんが、pingを実行すると、pingに応答します。レプリカ-DEV-AWEB6はRESOLVING状態になり、私のDBにアクセスできません。ただし、手動でManagement Studioに移動し、フェールオーバーをDEV-AWEB6に設定すると、再び起動して実行され、DevListenerがもう一度接続を受け入れます。 これらの事実がフェイルオーバーが実際に機能していることを確認していること、コミットを同期して自動フェイルオーバーを構成していることを考えると、セットアップで誤動作した場合はどうなるかわかりません。 DEV-AWEB5を切断すると、レプリカが接続を保持し、DevListenerも保持されることを期待しています。自動フェイルオーバーにより、AGリスナーに透過的に接続できると思います。エンドユーザーの観点から見ると、Webシステムを使用している場合、DBサーバーの1つがダウンしたことは気付かないはずです。 私はここで立ち往生しています、誰かが私が間違っていることを教えてくれますか?

3
一度に1文字を取り除く値のループ
値をループして、値から一度に1文字を削除し、結果を表示したいと思います。 したがって、値を持つテーブルがある場合: ID ___ 34679 13390 89906 結果はこのようにしたい Id ---- 4679 679 79 9 3390 390 90 0 9906 906 06 6

4
SQL Server 2012コピーデータベースが失敗しました
同じSqlServerにデータベースのコピーを作成したい。そのため、データベースコピーウィザードを使用すると、エラーがスローされます。 設定: saユーザー メソッド:「SQL管理オブジェクトメソッドを使用する」 宛先データベースの新しい名前を選択しました。 エラー: TITLE:データベースコピーウィザード ジョブは失敗しました。詳細については、移行先サーバーのイベントログを確認してください。 ------------------------------ボタン: OK イベントログ: システム プロバイダー [名前] SQLSERVERAGENT イベントID 208 [修飾子] 16384レベル3タスク3キーワード0x80000000000000 TimeCreated [SystemTime] 2014-05-07T06:23:11.000000000Z EventRecordID 123672 Channel Application Computer Server1 Security EventData CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B Failed 2014-05-07 10:52:50ジョブが失敗しました。ジョブはユーザーsaによって呼び出されました。実行する最後のステップは、ステップ1(CDW_Server1_Server1_3_Step)でした。 ログファイルの最後の行: OnProgress、Server1、NT Service \ SQLSERVERAGENT、Server1_Server1_Transfer Objects Task、{066BD090-26F3-45D8-AD60-B207D56D44CE}、{1CF7B713-F747-45FB-8936-5522651E0C7A}、5/7/2014 10:08:46 AM、5 / 7/2014 10:08:46 AM、0,0x、1データベースのデータベース転送に失敗しました。OnProgress、Server1、NT Service \ …

1
大量(400万行)のmysqlデータを非常に定期的に効率的に削除する
常に約1200万行のmysqlテーブルがあります。テーブルのサイズをある程度管理しやすくするために、古いデータを削除する必要があります。 現在、cronジョブを使用して、このクエリを毎日午前0時に実行しています。 DELETE FROM table WHERE endTime < '1393632001' クエリが最後に実行されたとき、4,602,400が調べられ、3分以上かかり、CPUがルーフを通過しました。 古いデータをクリアしながら、CPU、同期db接続、ディスクキュー深度などが不当に急上昇しないようにするにはどうすればよいですか? PS:クエリが実際に使用サイクルのかなり都合の悪い時間に発生していることに気付くでしょう。クエリのタイミングを毎日使用する最低のポイントで発生するように既にシフトしていると仮定します。また、「endTime」にはインデックスがありません。非常に頻繁に挿入される大量のデータがあり、ルックアップが少ないため、可能であればそれを維持したいと思います。
10 php  mysql 

6
Oracle 12c作成ユーザー
Enterprise Oracle Database Systemでのユーザーの作成に問題があります。のようなコマンドを使用してユーザーを作成できませんでした create user name identified by password; 例外のため: ORA-65096:無効な共通ユーザーまたはロール名 だから私はグーグルで解決策を見つけました: alter session set container=PDBORCL; そしてその後-仕事です。ユーザーが作成されました。 しかし、私はこのアカウントにログインできません。なにが問題ですか?このアカウントにすべての特権を追加します(もちろん、CREATE SESSIONも追加します)。エラーが発生しました: ORA-01017:ユーザー名/パスワードが無効です。ログインが拒否されました。 一体何が起こっているのですか?

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