データベース管理者

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

1
SQL Serverからデフォルトで取得できるイベント情報は何ですか?
特定の事柄が発生したかどうか、いつ発生したか、誰がアクションを実行したかを人々が知りたい質問をよく見ます。多くの場合、SQL Serverはこの情報を独自に追跡しません。例えば: ストアドプロシージャを最後に実行したのは誰dbo.MyProcedureですか? テーブルのsalary列を更新したのは誰dbo.Employeesですか? 誰が最後にdbo.OrdersManagement Studioにテーブルを照会しましたか? ただし、SQL Server がデフォルトで一時的に追跡するイベントは他にもいくつかあり、次のような質問にネイティブに答えることができます。 AdventureWorksデータベースで自動拡張が最後に行われたのはいつで、どのくらいかかりましたか? 誰がdbo.EmployeeAuditDataいつテーブルを削除しましたか? 今日、メモリ関連のエラーがいくつ発生しましたか? この情報を取得するにはどうすればよいですか?

3
UUIDまたはGUIDを主キーとして使用する場合の欠点は何ですか?
分散システムを構築したいと思います。データベースにデータを保存する必要がありますが、一部のテーブルの主キーとしてUUIDまたはGUIDを使用すると便利です。UUID / GUIDは非常に大きく、ほとんどランダムであるため、この設計の欠点だと思います。別の方法は、自動インクリメントのINTまたはLONG​​を使用することです。 テーブルの主キーとしてUUIDまたはGUIDを使用することの欠点は何ですか? おそらく、DBMSとしてDerby / JavaDB(クライアント上)とPostgreSQL(サーバー上)を使用します。

2
インデックスが存在しない場合は作成します
インデックスが存在しない場合にインデックスを追加できる機能に取り組んでいます。比較するインデックスのリストを取得できないという問題に直面しています。何かご意見は? これは、次のコードで解決される列作成の問題と同様の問題です:https : //stackoverflow.com/a/12603892/368511

5
varcharとnvarcharの違いを記述する
現在、SQL Server 2012データベースではを使用していますが、これvarcharを変更したいと考えていnvarcharます。そのためのスクリプトを生成しました。 私の質問は、SQL Serverがvarchar列に書き込む方法と列に書き込む方法に違いはありnvarcharますか?私が心配している多くのバックエンド手順があります。 編集: これが役立つかどうかはわかりませんが、列にはインデックス、f / k、またはそれらの制約がありません。


3
固定サイズのフィールドでCHARとVARCHARを使用すると、パフォーマンスにどのような影響がありますか?
MD5ハッシュを格納するインデックス列があります。したがって、列には常に32文字の値が格納されます。何らかの理由で、これはcharではなくvarcharとして作成されました。データベースを移行してcharに変換する手間をかける価値はありますか?これは、InnoDBを使用したMySQL 5.0にあります。

6
シングルスレッドデータベースとマルチスレッドデータベースのパフォーマンスについて
H2は、パフォーマンスに関して高い評価を得ているシングルスレッドデータベースです。他のデータベースはマルチスレッドです。 私の質問は、いつマルチスレッドデータベースがシングルスレッドデータベースよりも興味深いものになるのかということです。ユーザー数は?プロセスはいくつですか?トリガーは何ですか?誰もが共有する経験がありますか? 概要 通常のボトルネックはディスクアクセスです SSDは高速ですが、壊れやすい(故障手順は必須です) シングルスレッドシステムでの1つの長いクエリは、他のすべてをブロックします マルチスレッドシステムの構成は難しい場合があります マルチスレッドデータベースは、シングルコアシステムでも有益です。

3
階層型フィールドの最高レベルを検索:CTEありとなし
注:この質問は、現在MySQLを使用していることを反映するように更新されました。これを行ったので、CTEをサポートするデータベースに切り替えるとどれほど簡単になるかを知りたいと思います。 主キーidと外部キーを持つ自己参照テーブルがありますparent_id。 +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL …


5
各グループの最初の行を選択する方法は?
このようなテーブルがあります: ID | Val | Kind ---------------------- 1 | 1337 | 2 2 | 1337 | 1 3 | 3 | 4 4 | 3 | 4 私はSELECT、それぞれの最初の行だけを返すようにVal、並べ替えKindます。 サンプル出力: ID | Val | Kind ---------------------- 2 | 1337 | 1 3 | 3 | 4 このクエリを作成するにはどうすればよいですか?

9
アプリケーションコードを記述する前にデータベースを設計する必要がありますか?
データベースを設計する最も簡単で効率的な方法は何ですか?私の観点から、アプリケーションのデータストア設計にはいくつかのオプションがあります。 アプリケーションコードを記述する前に、できる限りデータベースを最適に設計します。これにより、基本的なデータ構造を利用できるという利点が得られます。私の意見では、この欠点は、アプリケーションの開発サイクル全体でデータの内容/場所/方法が変化するため、アプリケーションの仕様として多くの変更が加えられることです。 アプリケーションが実を結ぶようにデータベースを設計します。アプリケーションの作成時にデータベースオブジェクトが必要な場合は、アプリケーションと並行して(年代順に)データベースを開発します。利点は、データベース構造の変更が少ないことです。欠点は、アプリケーションコードとデータベース開発の間で時間と開発の労力が分割されることです。 あなたの経験では、最も生産的で効率的な方法は何だと思いますか?

7
簡単な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか?
単純な銀行データベースのスキーマを書いています。基本的な仕様は次のとおりです。 データベースは、ユーザーと通貨に対するトランザクションを保存します。 すべてのユーザーは通貨ごとに1つの残高を持っているため、各残高は特定のユーザーと通貨に対するすべてのトランザクションの合計です。 残高をマイナスにすることはできません。 銀行のアプリケーションは、ストアドプロシージャを介してデータベースとのみ通信します。 このデータベースは、1日に数十万件の新しいトランザクションを受け入れ、さらに高いレベルでクエリのバランスを取ることを期待しています。残高を非常に迅速に提供するには、事前に集計する必要があります。同時に、残高が取引履歴と矛盾しないことを保証する必要があります。 私のオプションは次のとおりです。 別のbalancesテーブルを用意して、次のいずれかを実行します。 トランザクションをテーブルtransactionsとbalancesテーブルの両方に適用します。TRANSACTIONストアドプロシージャレイヤーのロジックを使用して、残高とトランザクションが常に同期されるようにします。(Jackによるサポート。) transactionsテーブルにトランザクションを適用balancesし、トランザクション量でテーブルを更新するトリガーを使用します。 balancesテーブルにトランザクションを適用transactionsし、トランザクション量とともにテーブルに新しいエントリを追加するトリガーを使用します。 ストアドプロシージャの外部で変更が行われないようにするには、セキュリティベースのアプローチに頼る必要があります。そうしないと、たとえば、一部のプロセスがtransactionsテーブルにトランザクションを直接挿入し、スキーム1.3の下で関連するバランスが同期しなくなる可能性があります。 balancesトランザクションを適切に集約するインデックス付きビューを用意します。残高はトランザクションと同期するようにストレージエンジンによって保証されているため、これを保証するためにセキュリティベースのアプローチに依存する必要はありません。一方、ビュー(インデックス付きビューでも)にCHECK制約を設定することはできないため、バランスを負以外に強制することはできません。(Dennyによるサポート。) transactionsテーブルだけがありますが、そのトランザクションの実行直後に有効な残高を保存するための追加の列があります。したがって、ユーザーと通貨の最新のトランザクションレコードには、現在の残高も含まれます。(Andrewが以下に提案。garikが提案したバリアント。) この問題に最初に取り組んだとき、私はこれら 2つの議論を読み、オプションを決定しました2。参考のために、ここでそれのベアボーン実装を見ることができます。 このようなデータベースを高負荷プロファイルで設計または管理しましたか?この問題の解決策は何ですか? 私が正しいデザインを選んだと思いますか?留意すべきことはありますか? たとえば、transactionsテーブルのスキーマを変更するには、balancesビューを再構築する必要があることを知っています。データベースを小さく保つためにトランザクションをアーカイブしている場合でも(たとえば、他の場所に移動してサマリートランザクションに置き換えることで)、スキーマの更新ごとに数千万のトランザクションからビューを再構築する必要がある場合、展開ごとのダウンタイムが大幅に長くなる可能性があります。 インデックス付きビューを使用する方法がある場合、マイナスの残高がないことをどのように保証できますか? トランザクションのアーカイブ: アーカイブトランザクションと上記の「サマリートランザクション」について少し詳しく説明します。まず、このような高負荷システムでは定期的なアーカイブが必要になります。古い取引を別の場所に移動できるようにしながら、残高と取引履歴の間の一貫性を維持したいと思います。これを行うには、アーカイブされたトランザクションのすべてのバッチを、ユーザーと通貨ごとの金額のサマリーに置き換えます。 したがって、たとえば、このトランザクションのリスト: user_id currency_id amount is_summary ------------------------------------------------ 3 1 10.60 0 3 1 -55.00 0 3 1 -12.12 0 アーカイブされ、これに置き換えられます: user_id currency_id amount is_summary ------------------------------------------------ 3 1 -56.52 1 …



5
ALTER COLUMN to NOT NULLが大量のログファイルの増加を引き起こすのはなぜですか?
データ用にディスク上に4.3 GBを使用する64m行のテーブルがあります。 各行は約30バイトの整数列に加えて、NVARCHAR(255)テキスト用の可変列です。 data-typeのNULLABLE列を追加しましたDatetimeoffset(0)。 次に、すべての行でこの列を更新し、すべての新しい挿入でこの列に値が配置されるようにしました。 NULLエントリがなくなったら、このコマンドを実行して新しいフィールドを必須にしました。 ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL その結果、トランザクションログサイズが大幅に増加しました。スペースがなくなるまで、6GBから36GBを超えました。 SQL Server 2008 R2がこの単純なコマンドでこのような大きな成長をもたらすために一体何をしているのか、誰にもわかりませんか?

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