データベース管理者

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

1
PostgreSQL ORDER BYで大文字と小文字が区別されないのはなぜですか?
DebianでPostgres 9.4.4を実行していますが、次のようORDER BYな動作になります。 veure_test=# show LC_COLLATE; lc_collate ------------- en_US.UTF-8 (1 row) veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1; regexp_split_to_table ----------------------- a A b c Capacitor CD d D (8 rows) そしてuname -a: Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux しかし、Postgres …

20
いデータベースに飛び込むには?
多くの人がmanyいデータベースを扱っている/使っていると確信しています。まったく正規化されていないデータベース、最も些細なデータを取得するために大きな苦痛を伴うクエリを実行する必要があるデータベース、運用中のデータベース、少し変更することはできません... 、 "それです"。 私の質問は、どのように対処しますか? 新しいデータベースを作成しようとしていますか? あきらめて、放っておけますか? どのようなアドバイスができますか?

2
PostgresでUUIDをインデックスするにはどうすればよいですか?
私はPostgreSQLが初めてであり、データベース全般については多少新しいです。PostgresでUUID値をインデックスする方法の確立された方法はありますか?ハッシュを使用するかトライを使用するかは、自動的に使用する組み込みのものが既に存在しない限り、分割されます。私が使用するものはすべて、膨大な量のデータを処理します。 SP-GiST演算子ファミリ「text_ops」は、トライを使用してインデックスを作成します。UUIDは非常に長く、非常に異なるため、完全一致検索のみを行う場合でも、これらのサウンドは魅力的です。 ハッシュオプションもあります。ハッシュはO(1)であり、もちろん平等以外の比較を行う必要はありませんが、UUIDは非常に長いため、ハッシュからハッシュを生成すると多くの時間が浪費されるのではないかと心配しています。 または、これはシステムに依存しすぎて、仕様を使用するものですか? ほとんどの場合、bigserialを使用したいのですが、これにはuuidを使用するように言われました。異なるデータベースを使用する複数のサーバーが存在する可能性があるため、uuidが必要です。したがって、一意のbigintがあることを保証するものではありません。サーバーごとに異なるシーケンス(およびシード)を使用できますが、それでもUUIDほど柔軟ではありません。たとえば、IDとその参照をどこでも変換しないと、データベースエントリをあるサーバーから別のサーバーに移行することはできません。
26 postgresql  index  uuid 

1
Mongodb増分バックアップ
私はMongoDBレプリカセットの増分バックアップを設定するタスクを開始点として与えられましたが、もちろんそれをグーグルで検索し、MongoDBドキュメントで何も見つかりませんでしたが、スタックオーバーフローでこの質問を見つけましたが、それは独自のソリューションの開発を奨励しましたタイラは非常に活発であるとは思わなかったので。 私は読んoplogし、ログを再生するために何かを開発することは非常に簡単でした実現し、それは私がように持っていなかったことが判明しmongorestoreていることが私のために行います。 これで、bashスクリプトを使用した実用的なソリューションが得られたため、非常に簡単でした。それが、ここに私のロジックに欠陥があるかどうか、または将来私に噛み付く何かを尋ねる理由です。 以下の実装方法: 完全バックアップ手順 セカンダリメンバーへのロック書き込み db.fsyncLock() スナップショットを撮ります oplogから最後の位置を記録する db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts 書き込みのロックを解除 db.fsyncUnlock() 増分バックアップ手順 セカンダリメンバーへのロック書き込み 完全(または最新の増分)バックアップで記録されたoplog位置からoplogをダンプします。 mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }' 最新のoplog位置を記録します(完全バックアップの場合と同じ方法)。 書き込みのロックを解除 完全バックアップの復元手順 のすべてのインスタンスを停止します mongod プライマリになるボックスのデータディレクトリにスナップショットをコピーしますが、必ずすべてを除外しlocal*てください。mongod.lock この復元手法は、ミラーを解除して再構成と呼ばれます プライマリを開始 replicasetを再構成する データなしでセカンダリを起動し、最初の同期を実行させます。または、新しいlocalデータベースを使用して新しいプライマリからデータをコピーします 増分バックアップを復元する 増分バックアップを作成すると、次のように保存されました。 /mnt/mongo-test_backup/1/local/oplog.rs.bson /mnt/mongo-test_backup/1/local/oplog.rs.metadata.json 私たちは詳しく調べてoplog.rs.bsonいますが、名前を変更する必要があるので、以下の手順を実行します …
26 backup  mongodb 

4
データベース 'database_name'のトランザクションログは、 'XTP_CHECKPOINT'が原因でいっぱいです。
について質問がありXTP_CHECKPOINTます。 SQL Server 2014を使用しています。シンプルリカバリモデルモードのデータベースがあります。また、複製されています。 開いているトランザクションはありません。私は実行しDBCC OPENTRAN、それが返されます: 「アクティブなオープントランザクションはありません。」 しかし、テーブルを作成または削除、またはデータを削除しようとするたびに、このメッセージが表示され続けます (実際のデータベース名をに置き換えましたdatabase_name)。 「データベース「database_name」のトランザクションログは、「XTP_CHECKPOINT」が原因でいっぱいです」 なぜこれが起こっているのか誰も知っていますか、そしてもっと重要なことは、どうすればそれを止めることができますか? そして、はい、データベースは本当に単純復旧モデルモードです。つまり、トランザクションログは自動的に切り捨てられます。 ちなみに、完全復旧モードで使用している別のデータベースは同じことを行い、同じエラーを返し始めました。 データベース 'database_name'のトランザクションログは、 'XTP_CHECKPOINT'が原因でいっぱいです。 ログの増加設定を無制限の増加に変更しようとしましたが、同じエラーが返されてしまいました。 ファイルグループのみを除いて、XTPを一切使用せずに問題を再現できます。方法は次のとおりです。http://pastebin.com/jWSiEU9U

3
SQL ServerはA <> BをA <B OR A> Bに分割し、Bが非決定的である場合に奇妙な結果をもたらします
SQL Serverで興味深い問題が発生しました。次の再現例を検討してください。 CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; フィドル s_guid &lt;&gt; NEWID()条件が完全に役に立たないように見えることをしばらく忘れてください-これは単なる最小の再現例です。NEWID()特定の定数値と一致する確率は非常に小さいため、毎回TRUEと評価される必要があります。 しかし、そうではありません。このクエリを実行すると、通常 1行が返されますが、時々(非常に頻繁に、10回のうち1回以上)0行が返されます。私のシステムでSQL Server 2008を使用して複製しました。上記のリンク(SQL Server 2014)を使用してオンラインで複製できます。 実行プランを見ると、クエリアナライザーは明らかに条件をs_guid &lt; NEWID() OR s_guid &gt; NEWID()次のように分割していることがわかります。 ...これが失敗する理由を完全に説明します(最初に生成されたIDが小さく、2番目のIDが指定されたIDよりも大きい場合)。 式の1つが非決定的であっても、SQL ServerはA …

1
同じLOBデータにアクセスする場合、論理読み取りが異なる
同じデータを読み取りながら、非常に異なる論理読み取りを報告する3つの簡単なテストを次に示します。 セットアップ 次のスクリプトは、100個の同一行を持つテストテーブルを作成します。各行には、行外に格納されるのに十分なデータを含むxml列が含まれます。私のテストデータベースでは、生成されるxmlの長さは各行で20,204バイトです。 -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X xml; SET @X = ( SELECT TOP (100) …

6
ONとWHEREのインデックスパフォーマンス
私は2つのテーブルを持っています @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) これらのテーブルには、(Id、Date)に非クラスター化インデックスがあります そして、私はこれらのテーブルに参加します SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date &lt;= GETDATE() AND t2.Date &lt;= GETDATE() これは次のように書くこともできます SELECT * FROM T1 AS t1 INNER …

4
SQLクエリでのGROUP BYなしのHAVINGの使用
HAVINGSQLクエリで使用するにはGROUP BY、列名を集約する必要がありますか? SQLクエリHAVINGなしで使用できる特殊なケースはありGROUP BYますか? 同時に共存する必要がありますか?
26 aggregate 

2
SQL Server 2014でLEN()関数がカーディナリティを過小評価するのはなぜですか?
文字列列と特定の長さの行をチェックする述語を持つテーブルがあります。SQL Server 2014では、チェックする長さに関係なく、1行の推定値が表示されます。実際には数千または数百万の行があり、SQL Serverはこのテーブルをネストされたループの外側に配置することを選択しているため、これは非常に貧弱な計画を生み出しています。 SQL Server 2012で31,622行を見積もる一方で、SQL Server 2014の1.0003のカーディナリティの見積もりについての説明はありますか?良い回避策はありますか? 問題の簡単な複製を次に示します。 -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT INTO #customers WITH (TABLOCK) (cust_nbr) SELECT TOP 1000000 CONVERT(VARCHAR(10), ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) AS cust_nbr FROM master..spt_values v1 CROSS …

2
テーブルがそれ自体を参照するときにすべての循環参照を見つけるクエリを作成する方法は?
次のスキーマ(名前が変更されています)がありますが、変更することはできません。 CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); つまり、各レコードは別のレコードの子です。レコードParentIdがに等しい場合、そのIdレコードはルートノードと見なされます。 すべての循環参照を検索するクエリを実行したい。たとえば、 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); クエリは返す必要があります Id | Cycle 2 | 2 …

2
innodb_file_per_tableがautoextendに設定された「エラー1114(HY000)テーブルがいっぱいです」
私は大量のデータを保持するMySQLデータベースを持っています(100-200GB-科学的測定の束)。データの大部分は1つのテーブルに格納されますSample。現在、データベースのスレーブレプリカを作成innodb_file_per_tableしています。このプロセスの利点を活用したかったのです。そこでinnodb_file_per_table、スレーブ構成に設定し、データベースのダンプをインポートしました。驚いたことに、失敗しました 5602行目でエラー1114(HY000):テーブル 'Sample'がいっぱいです ファイルSample.ibdは現在約93GBであり、パーティションで600GB以上の空き容量が利用できるため、ディスクの空き容量の問題ではありません。いずれの種類のファイルシステムの制限にも達していないようです(ext4を使用しています)。 何が原因であるか、何を調査するべきかについてのアイデアに感謝します。 更新:を使用していmysql Ver 14.14 Distrib 5.1.66, for debian-linux-gnu (x86_64)ます。 SELECT @@datadir; -- returns `/home/var/lib/mysql/` SHOW VARIABLES LIKE '%innodb_data_file_path%'; -- ibdata1:10M:autoextend df -h /home/var/lib/mysql/ 768G 31G 699G 5% /home

4
CDCを使用して履歴を追跡する場合
SQL Server変更データキャプチャは、SQL Serverトランザクションログから履歴データを読み取り、特別なテーブルに保存する機能です。 特別なテーブル値関数(TVF)を使用することにより、ユーザーはこのデータをクエリすることができ、特定のテーブルのすべての変更を取得するか、特定の時間内の変更に起因するネット変更のみを取得することができます。 CDCには特定の利点があります 特定のテーブルまたは列のみを追跡するように構成できます。 モデルの変更をある程度まで処理できます。 トランザクションログを処理するため、トリガーほどパフォーマンスに大きな影響を与えません。 簡単に有効/無効にでき、追跡する必要のあるテーブルの追加の列は必要ありません。 また、いくつかの欠点もあります。 履歴データの量は非常に速くなる可能性があります。 誰が変更を行ったかを追跡することはできません(少なくとも削除はできません)。 履歴データはトランザクションログに基づいているため、追いつくのに時間がかかります。 SQL Serverエージェントに依存します。エージェントが実行されていないかクラッシュした場合、履歴は追跡されません。 私はCDCについて多くのことを読みましたが、CDCの使い方を知っていますが、それが自分にとって適切なツールかどうかはまだわかりません。 CDCが適切なツールとなるのはどのタスク/シナリオですか?(たとえば、ユーザーがデータオブジェクトを特定の時点に復元できるようにしますか?監査しますか?データの完全な履歴を表示しますか?) いつCDCを使用せず、カスタムトリガーベースのソリューションに頼るべきですか? 運用データベースでCDCを使用し、運用アプリケーション内でCDCデータを利用しても大丈夫ですか?(例:エンドユーザーに表示する)またはこれは明らかにこの機能の誤用ですか? CDCは監査ツールであるとよく聞きますが、SQL Server Auditの目的はそれではありませんか?両方とも同じタスクの異なるツールですか?または、CDCを他のものに使用できますか? 私の現在のシナリオでは、将来の複数のアプリケーションの基礎となる信頼できるデータフレームワークを構築するように求められます。正確な要件はあいまいですが、1つは、データ履歴を追跡し、他のテーブルのすべての関連データとともに古いエントリを復元できる必要があることです。私は現在、CDCをオプションとして評価していますが、推奨されるユースケースが実際には見つからないため、これが進むべきかどうかは不明です。 私は特定のシナリオに対するアドバイスに感謝しますが、回答では、Change Data Captureを使用するタイミングまたは使用しないタイミングに関する一般的なアドバイスを提供する必要があります。


6
多数の行を削除した後、SQL Serverデータベースのサイズは減少しませんでした。
この質問は、データベース管理者のStack Exchangeで回答できるため、スーパーユーザーから移行されました。 7年前に移行され ました。 私はSQLが得意ではありませんが、保守するデータベースがあります。 残っている場所がほとんどないので、たとえば2008年のすべてのデータを削除することにしました。削除クエリ(約100,000行が削除されました)を実行し、トランザクションログを削除した後、アクションはデータベースのサイズには影響しませんでした。他に何かしなければならないことはありますか?

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