データベース管理者

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

4
InnoDBの行ロック-実装方法
私は今、mysqlサイトを読んで見回していますが、それがどのように機能するかを正確に見ることができません。 書き込みの結果を選択して行ロックし、変更を書き込み、ロックを解除します。audocommitはオンです。 スキーム id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) ステータスが保留中のアイテムを選択し、作業中に更新します。排他的な書き込みを使用して、同じアイテムが2回ピックアップされないようにします。 そう; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" 結果からIDを取得します "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> ロックを解除するために何かする必要がありますか?
13 mysql  innodb  locking 

1
20〜60秒ごとに起動するDBCC CHECKDB
実稼働環境への展開に急速に近づいている開発環境があり、ログで約20秒ごとにメッセージが表示されることに気付きました。 Starting up database 'dbname' CHECKDB for database 'dbname' finished without errors これに気づいたのは、これをテストしているエンドユーザーに問題があり、Windowsイベントログ(アプリケーションログ)でエラーに気付いたためです。 The log for database 'dbname' is not available. Check event log for related messages. ちなみに、関連するメッセージは見つかりませんでしたが、オフライン/オンラインサイクルで解決しました。 私が考えることができる唯一のことは、このアプリケーションが1msごとにデータを収集することですが、このデータのすべてがデータベースに挿入されるわけではありません。開発サーバーであるため、ログとデータが同じドライブ上にあるように構成されました。これら2つの情報を念頭に置いて、私はこれがIOの問題であり、サーバーがそのストレージ(SAN)への接続の損失から回復しようとしていることに傾倒しています。しかし、これでもすべてのデータベースが失われるわけではないため、これだけでは意味がありません。他に何がこれを引き起こしているのでしょうか? プラットフォーム:Windows Server 2008 R2(標準)上のSQL Server 2008 R2(Ent。)

1
スロット配列と総ページサイズ
以下に示すように、多くのフォーラムや多くのブログでページが構成されていることを読み続けています。ページサイズ:16 x 512B = 8192Bページヘッダー:= 96B最大行数行:= 8060B これにより、(8192-96-8060)B = 36Bになります。 わかりました、これは論理的で正しいです。私の質問はこれです。なぜ多くの人が、残りの36Bがスロットアレイ用に予約されていると言うのですか 明らかに、スロット配列はページの行ごとに2Bを提供します。そのため、最小2B、最大1472Bになります。 2B:1行* 2B = 2B 1472B:8096B = n * 9B(オーバーヘッドを伴う最小行サイズ...単一のTINYINT列を考えてください)+ n * 2B(行ごとのスロット配列コスト)=> 8096 = 11n => n = 8096/11 = 736 736 * 2B = 1472B。 14Bバージョンタグにより、これで20になります。 USE master ; GO CREATE DATABASE test ; GO USE test …

1
削除とバキュームのディスクファイル効果
私は、2億4000万行の非常に頻繁に更新されるテーブルを持っています(そして成長しています)。3時間ごとに150万行が挿入され、150万行が削除されます。クラスターをSSDに移動すると、この一括挿入(コピーを使用)時間は22分から2.3分に短縮されました。削除時間も改善されました。この一括更新は2時間ごとまたは1時間ごとに行う予定です。 現在のパフォーマンス(SSD後)は、より頻繁な更新と互換性がありますが、書き込みの増幅と組み合わされたNANDの耐久性の限界によるSSDの死に関するいくつかの恐ろしい話を読みました。SSDは高価なので、可能な限り将来的にその死を押し上げたいと思います。したがって、私の質問:削除とその後のバキュームでディスクファイルは実際にどうなりますか?私は2つのディスク書き込みがあると思います。1つは行を削除済みとしてマークし、もう1つはバキュームして上書き可能としてマークします。削除とバキュームを行う代わりに、一括挿入/削除のたびにテーブルを作成および削除するテーブルをパーティション分割すると、SSDの摩耗を最小限に抑えることができますか?

3
SQL Serverのテーブルに複数のNULL可能FKを設定するのは悪い習慣と見なされますか
SQL Serverのデータベース構造には、注文に関するさまざまな情報を必要とする3種類の製品があります。だから、私は1つ作成しCustomers、テーブルと三つの異なる受注テーブルを:OrdersForProductAs、OrdersForProductBs、OrdersForProductCs。すべての注文表には、1対多の関係がありCustomersます。 Payments支払いの詳細を内部に保持する別のテーブルもあります。しかし、ここでそれをどのように構成するかについて疑問があります。 複数の製品タイプがあり、顧客が複数の製品を同時に注文する可能性があるため、これら3つの注文テーブルをPaymentsテーブルに関連付ける必要があります。 もう1つの問題は、顧客が1種類の製品のみを注文する可能性があることです。したがって、PaymentsテーブルのFK列はである必要がありますnullable。 私の質問は、これらのnullableFKカラムが長期的には頭痛の種になるかどうかです。一般的に、テーブルにNULL入力可能FK列を設定することは悪い習慣と見なされますか?

3
存在しない場合は同時に挿入
ストアドプロシージャへの挿入で並行性の問題が発生しています。手順の関連部分は次のとおりです。 select @_id = Id from table1 where othervalue = @_othervalue IF( @_id IS NULL) BEGIN insert into table1 (othervalue) values (@_othervalue) select @_id = Id from table1 where othervalue = @_othervalue END これらのストアドプロシージャを3つまたは4つ同時に実行すると、複数の挿入が発生することがあります。 私はこれを次のように修正することを計画しています: insert into table1 (othervalue) select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) where NOT EXISTS …

2
データベースの再設計の機会:このセンサーデータ収集に使用するテーブル設計は?
バックグラウンド 約2000個のセンサーのネットワークがあり、各センサーには10分間隔で収集する約100個のデータポイントがあります。これらのデータポイントは通常int値ですが、一部は文字列と浮動小数点です。このデータは90日間保存する必要がありますが、可能であればさらに保存し、効率的です。 データベース設計 もともとこのプロジェクトを担当していたとき、私は各センサーにコンマ区切りファイルを書き込むC#アプリを作成しました。当時はそれほど多くはありませんでしたが、誰かがトレンドを調べたいときは、ExcelでCSVを開き、必要に応じてグラフ化しました。 事態は拡大し、MySQLデータベースに切り替えました。センサーごとにテーブルを作成しました(はい、たくさんのテーブルがあります!)。うまく機能していますが、いくつかの制限があります。非常に多くのテーブルがあるため、特定の値を検索するときにすべてのセンサーからデータを検索するクエリを作成することは明らかに不可能です。 次のバージョンでは、Microsoft SQL Server Expressに切り替えて、すべてのセンサーデータを1つの大きなテーブルに入れました。これも機能し、クエリを実行して、関心のあるすべてのセンサーから値を見つけることができます。ただし、Expressバージョンでは10 GBの制限に達したため、SQL Server Standardに投資するのではなく、MySQLに切り替えることにしました。 質問 私はMySQLのパフォーマンスとスケーラビリティに満足していますが、1つのテーブルにすべてを収めたアプローチに固執するのが最善かどうかはわかりません。1つのテーブルで10 GBが異なるデザインを要求しているようです。グラフ作成のためにデータを照会する必要性はまだあることに言及する必要があります。たとえば、1つのセンサーの温度データを90日間にわたってグラフ化する照会のパフォーマンスの問題があることを懸念しています。(つまり、グラフは、目的のセンサーを分離するためだけにSQLがデータの山を並べ替えるのを待たずに、すぐに作成できるものでなければなりません。) パフォーマンスを向上させるために、このテーブルを何らかの方法で分割する必要がありますか?それとも、そのような大きなテーブルを持つことは珍しくありませんか? Sensor ID列とTimestamp列にインデックスがあります。これは、ほとんどすべてのクエリの定義境界です。(つまり、時間Aから時間BまでのセンサーXのデータを取得します)。 シャーディングとパーティション分割について少し読んだことがありますが、この場合は適切であるとは感じません。 編集: これまでのコメントと回答に基づいて、いくつかの追加情報が役立つ場合があります。 無期限のストレージではない:現在、90日以上データを保存していません。毎日、90日より古いデータを削除するクエリを実行します。将来的に重要になる場合は、さらに保管しますが、今のところはそれで十分です。これにより、サイズを抑えることができ、パフォーマンスが向上します。 エンジンタイプ:元のMySQL実装はMyISAMを使用しました。今回は、新しい実装(多くではなく1つのデータテーブル)用にテーブルを作成するときに、デフォルトでInnoDBを使用しました。どちらか一方に要件があるとは思わない。 正規化:もちろん、データ収集テーブルの他に他のテーブルがあります。これらのサポートテーブルには、センサーのネットワーク情報、ユーザーのログイン情報などが保存されます。正規化することはあまりありません(私の知る限り)。データテーブルに非常に多くの列があるのは、各センサーからの変数が非常に多いためです。(複数の温度、光レベル、気圧など)私にとっての正規化とは、冗長なデータや繰り返しグループがないことを意味します。(少なくとも1NFの場合)特定のセンサーの場合、特定の時間にすべての値を保存するには1行のデータが必要で、1:N関係は関係していません(私は見ています)。 テーブルを機能的に分解し、(たとえば)1つのテーブルにすべての温度関連の値を作成し、別のテーブルにすべての空気圧関連の値を作成できます。これにより、温度のみのクエリを実行するユーザーの効率が向上する可能性がありますが、すべてのデータを一度に挿入する必要があります。それでも、SELECT操作の効率向上は価値があるかもしれません。明らかに、ユーザーがデータを要求する頻度に基づいて、テーブルを縦に分割した方が良いでしょう。おそらくこれが私がすべきことのすべてです。私は質問をする際に、これを行うことが価値があることの確認を探していると思います。 編集2: データの使用:通常、問題のあるアイテムのみに焦点を合わせるため、データの大部分は見られたり必要とされたりすることはありません。しかし、問題を見つけようとする際には、さまざまなツールを使用してデータを検索し、拡大するアイテムを決定します。 たとえば、メモリ使用量の値(顧客固有の独自のソフトウェアプログラム)と再起動/クラッシュの間に相関関係があることがわかりました。収集したデータポイントの1つはこのメモリ使用量に関連しており、特定のメモリ使用量を超えた後にデバイスが不安定になることを示す履歴データを見ることができました。今日、このソフトウェアを実行しているデバイスのサブセットについて、この値を確認し、値が高すぎる場合は再起動コマンドを発行します。これが発見されるまで、このデータの収集は価値があるとは思いませんでした。 このため、値に疑問がある場合でも、約100個のデータポイントを収集して保存することを維持しています。しかし、通常の日常的な使用では、ユーザーは通常、これらのパラメーターを十数個検討します。ユーザーが特定の地理的領域に興味を持つようになると、(ソフトウェアを使用して)おそらく数十個のセンサーのデータのグラフまたはスプレッドシートを生成できます。温度、気圧、光レベルなどを示す2つまたは3つのプロット線で30日間のグラフを見るのは珍しいことではありません。これを行うと、次のようなクエリが実行されます。 SELECT sensor_id, location, data_timestamp, temp1, air1, light1 FROM data WHERE data_timestamp >= '2012-02-01' AND sensor_id IN (1, 2, 3); (各センサーに独自のテーブルがある元のMySQLバージョンでは、3つの個別のクエリが発行されますが、結果はソフトウェアで結合されてグラフを作成します。) dataテーブルには非常に多くの行(〜1000万)が含まれているため、インデックスがidおよびdata_timestampになっているにもかかわらず、パフォーマンスは複数テーブルシナリオよりも著しく劣っています(この例では1秒未満ではなく、9秒で4500行が返されます)。特定の条件を満たすセンサーを見つける機能は、複数テーブルスキーマでは実質的にゼロであるため、単一のテーブルに移行する理由です。 …

4
シノニムを使用して、重複したテーブルを作成しないようにすることをお勧めしますか?
まったく同じデータベースのコピーが3つあります。3つのデータベースにはすべてUsersテーブルがあり、ユーザーは常に3つのデータベースすべてにまったく同じ設定で存在します。ユーザーを追加または編集する場合は、3つのデータベースを更新する必要があります。 Usersデータベース2と3からテーブルを削除し、Synonymデータベース1を指すものに置き換える方が良いでしょうか? ここに私が考えることができる長所/短所があります: 長所 簡単なメンテナンス。3つではなく1つの場所でユーザーを更新できます ユーザーIDはデータベース間で一致します(多くのアドオンアプリはUserIdに基づいているため重要です) 短所 これは標準的な手順だとは思わないでください。 ユーザーはデータベース間で同一の設定をする必要があります (下記のgbnの回答から)データベース1がダウンした場合、データベース2と3も利用できなくなります。また、復元のイベントでデータが一貫していないという潜在的な問題があります これは、テーブルだけでなく、データベース間で同一の設定を含むいくつかの異なるテーブルに対して検討しているオプションですUsers。わかりやすいので、この例ではユーザーを使用しています。

3
使用していないときにSQL Serverをオフにする最良かつ最も簡単な方法は何ですか?
状況:通常、クライアントツールを使用して他の非ローカルSQLサーバーに接続するだけの開発者ワークステーション。ただし、ローカル開発を行うためにフルバージョンのsqlサーバーを使用することが有益な場合はまれです。常にSQLサーバーを実行しているシステムリソースを無駄にしないために、クライアントツール(管理スタジオなど)の使用を許可しながら、「オフ」にする最良の方法を知りたいと思います。
13 sql-server 

4
インデックスの追加が非常に遅い…ETAを取得したり進捗を表示したりするmysqlコマンドはありますか?
現在、インデックスを追加するために、テーブル(20Mエントリ)でalterクエリを実行しています。すでに3日以上実行されています(「tmpテーブルへのコピー」でスタックします)。 クエリの進行状況を確認する方法はありますか、言い換えると、完了の推定時間を取得する方法はありますか? ありがとう。
13 mysql 

2
デッドロックエラーがデッドロックSQLを返していません
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Webサイトの1つがビジーになると、このエラーがランダムに発生します。どのテーブルのセットが起こっているかは大体わかっていますが、他のプログラムでの経験では、通常、デッドロックが起こっている場所でSQLが返されます。これを可能にするためにオンにする必要があるフラグはありますか? これは今のところ私の主な質問なので、デッドロック自体を別の問題としてデバッグしてみます。 SQL Server 2008 Standard Editionを使用しています。

5
PostgreSQLデータベース内のすべてのオブジェクトの所有者を同時に設定する方法はありますか?
/programming/1348126/modify-owner-on-all-tables-simultaneously-in-postgresqlは、テーブルやその他のオブジェクトを特定のユーザーに変更するいくつかの気の利いた方法を説明します。提案は、私が作成した関数を無視するようです。 関数を含む、データベース内のすべてのオブジェクトの所有者をリセットするかなり簡単な方法はありますか?手作業で行うことは非常に望ましくありません。

2
PostgreSQLで既存のインデックスを主キーに昇格させる方法
テーブル内で主キーを作成する方法は知っていますが、既存のインデックスを主キーにするにはどうすればよいですか?あるデータベースから別のデータベースに既存のテーブルをコピーしようとしています。テーブルを表示すると、下部のインデックスは次の形式になっています。 "my_index" PRIMARY KEY, btree (column1, column2) 私はインデックスを作成しました: CREATE INDEX my_index ON my_table (column1, column2) しかし、私はそれを主キーにする方法を知りません... 更新:サーバーのバージョンは8.3.3です

3
オープンソースのメタデータ管理ソリューションはありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、データベース管理者のStack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 オープンソースのメタデータ管理ソリューションはありますか?何百ものエンタープライズデータベースのデータベーススキーマ、テーブル、データ項目のメタデータの詳細を保持するメタデータリポジトリを作成したいと思います。 特に、データベースのスキーマデータを自動的にクエリして、テーブルに関連するメタデータの変更を追跡できるものに興味があります。すなわち、列のデータサイズの変更、追加されたテーブルと列など。
13 schema  metadata 

7
統計の自動更新を無効にする理由は?
私が勤務しているクライアント企業が、一部のSQL Serverの統計情報の自動更新オプションをオフにすることを決定したことと、DBAがパフォーマンスの問題が発生したときに手動でトラブルシューティングすることを知りました。 しかし、この種のことは私には意味がありません。統計が更新されないようにしたいのはなぜですか?

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