データベース管理者

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

2
数百万行にわたるカスタマイズ可能な並べ替えによるページングパフォーマンス
このアプリケーションには、ユーザーが多数のレコード(1000万から2000万)をページングできるグリッドがあります。グリッドは、多数の列(20以上)での昇順と降順の並べ替えをサポートしています。値の多くも一意ではないため、アプリケーションはidブレイクとしてidでソートして、行が常に同じページに表示されるようにします。例として、ユーザーがウィジェットサイズ(最大から開始)でソートする場合、アプリケーションは次のようなクエリを生成します。 SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC このクエリは(キャッシュデータを使用して)実行に約15秒かかります。主なコストは、widgetSizeで約130万行をソートすることです。このクエリを調整しようとしてWHERE、最大のWidgetSizesに制限された句を追加すると(上記のクエリでコメントアウトされている)、クエリはわずか〜800msかかることを発見しました(上位50,000の結果はすべてウィジェットサイズ> 100です) 。 WHERE句のないクエリが非常に遅いのはなぜですか?widgetSize列の統計情報を確認したところ、上位739行のWidgetSize> 506が示されています。30行しか必要ないため、SQLサーバーはこの情報を使用してウィジェットサイズの行のみを並べ替える必要があることを推測できませんどっちが大きい? 私はこのことができますことを知っている特定の上のインデックスに追加することにより、迅速に実行したクエリwidgetSizeとはid、しかし、このインデックスは、この特定のシナリオでのみ有用であり、(例えば)ユーザがソート方向を反転させる場合は無価値になります。このテーブルには多くの追加の列が含まれており、各インデックスは大きいため(〜200 MB)、すべての可能な並べ替え順序にインデックスを追加する余裕はありません。 すべての可能な並べ替え順序にインデックスを追加せずにこれらのクエリクエリを実行する方法はありますか?(ユーザーは20以上の列のいずれかでソートできます) 次のスクリプトは、上記のテーブルを作成し、代表的なデータを入力します。テーブルは実際のテーブルよりもはるかに狭いですが、私が見ているパフォーマンスを示しています。私のPCでは、where句のあるクエリは200ミリ秒かかりますが、where caluseのないクエリは800ミリ秒かかります。 警告:このスクリプトの実行後の結果のデータベースのサイズは最大2Gbです。 CREATE TABLE Test ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, …

6
MySQLの2つのテーブルの構造を比較するクエリ
MySQLデータベースの1つのバックアッププロセスを自動化するために、2つのテーブルの構造(現在のバージョンと古いバージョン)を比較したいと思います。 2つのテーブルを比較できるクエリを考えられますか? 比較できる表の例を次に示します。 CREATE TABLE product_today ( pname VARCHAR(150), price int, PRIMARY KEY (pname) ); CREATE TABLE product_yesterday ( pname VARCHAR(150), price int, PRIMARY KEY (pname) ); CREATE TABLE product_2days_back ( pname VARCHAR(15), price int, PRIMARY KEY (pname) ); 最初の2つのテーブルの構造は同じです。最後のものは異なります。2つのテーブルの構造が異なるかどうかを知る必要があるだけです。私はそれらがどのように異なるかに興味がありません。

3
真空凍結vs真空満杯
VACUUMPostgreSQLのこれらのタイプの違いを誰かが説明できますか? 私はドキュメントを読みましたが、それFULLはテーブルをロックしFREEZE、タプルを「フリーズ」するだけだと言っています。それは同じだと思います。私が間違っている?

4
メモリ最適化テーブル-メンテナンスが本当に難しいのでしょうか?
私は、MS SQL 2012から2014へのアップグレードの利点を調査しています。SQL2014の大きなセールスポイントの1つは、クエリを超高速にするメモリ最適化テーブルです。 メモリ最適化テーブルには、次のようないくつかの制限があることがわかりました。 いいえ(max)サイズのフィールドありません 行ごとに最大1 KB timestampフィールドなし 計算列はありません UNIQUE制約なし これらはすべて迷惑と見なされますが、パフォーマンス上のメリットを得るために本当に回避したい場合は、計画を立てることができます。 実際のキッカーは、ALTER TABLEステートメントを実行できないという事実であり、インデックスのリストにフィールドを追加するたびに、このリマロールを実行する必要がINCLUDEあります。さらに、ライブDBのMOテーブルにスキーマを変更するには、ユーザーをシステムから締め出す必要があるようです。 マイクロソフトがこの機能にこれほど多くの開発資金を投資したとは信じられないほど、これはまったくとんでもないことであり、維持するのは非常に実用的ではありません。これは、私がスティックの間違った終わりを得たに違いないという結論に私を導きます。メモリを最適化したテーブルについて誤解していたため、実際よりも保守がはるかに困難であると思われました。 それで、私は何を誤解しましたか?MOテーブルを使用しましたか?それらを使用および保守するのに実用的な何らかの種類の秘密のスイッチまたはプロセスがありますか?

1
テキスト列でtext_pattern_opsにインデックスを付けるのはなぜですか?
今日、Seven WeeksのSeven Databasesでは、オペレーターごとのインデックスを紹介しました。 text_pattern_ops値が小文字でイ​​ンデックス付けされている限り、演算子クラスインデックスを作成することにより、以前のクエリに一致するパターンの文字列にインデックスを付けることができます。 CREATE INDEX moves_title_pattern ON movies ( (lower(title) text_pattern_ops); text_pattern_opsタイトルがテキストタイプであるため、これを使用しました。あなたは、インデックスのvarchar、文字、または名前に必要な場合は、関連するオペレーションを使用しますvarchar_pattern_ops、bpchar_pattern_opsとname_pattern_ops。 この例は本当に紛らわしいと思います。なぜこれが便利なのですか? 列がテキストタイプの場合、他のタイプ(varchar、char、name)は検索値として使用される前にテキストにキャストされませんか? そのインデックスは、デフォルト演算子を使用したインデックスとどのように動作しますか? CREATE INDEX moves_title_pattern ON movies (lower(title));

3
AWS RDS PostgreSQLインスタンスからWALファイルを取得する
Amazon Web ServicesにPostgres RDSインスタンスがあります。自動バックアップが有効になっており、スナップショットを毎日取得しています。自分で管理できるRDSインスタンスのローカル「最新」バックアップを生成したいと思います。インスタンスに対してpg_dumpを実行するだけでは十分ではありません。データベースを任意の時点に復元できるようにするためです。バックアップが取得されてから、RDSとすべてのWALファイルのローカルバックアップが必要です。質問: RDSがバックアップルーチンで自動的に生成しているWALファイルとバックアップにアクセスできますか?これは理想的です。それらのローカルコピーをダウンロードしたいと思います。最初の調査の後、この質問に対する答えは「いいえ」だと感じています。RDSがWALファイルとバックアップをS3に保存しているように聞こえますが、アクセスできなくなります。確認をお願いします。 RDSインスタンスで発生したトランザクション(WALファイル)にアクセスする他の方法はありますか?EC2でPostgresデータベースを作成し、プライマリ「ライブ」RDSインスタンスからこのEC2インスタンスにトランザクションを「フィード」できるはずだと思います。EC2インスタンスが更新されると、そこからWALファイルを取得できます。なんて頭痛ですか?:/このセットアップは可能ですか?RDSインスタンスからEC2インスタンスに「フィード」して、常に最新の状態にする魔法とは何ですか? ありがとう!


2
Postgresで1時間ごとに増分バックアップを行う方法は?
単一のPostgresサーバー(Win7 64)の1時間ごとの増分バックアップを試行しています。 私は次のセットアップをしていますpostgresql.conf: max_wal_senders = 2 wal_level = archive archive_mode = on archive_command = 'copy "%p" "c:\\postgres\\foo\\%f"' (再起動) で基本バックアップを行いました pg_basebackup -U postgres -D ..\foo -F t -x フォルダーに大きなbase.tarファイルをfoo作成し、16,384 KBのファイルを追加しました。これはWALであると思われます。 私が理解していないのは、WAL fooが変わらない理由です。data/pg_xlog変更中のWAL 。pgはそれらをコピーすることになっていないのですか?どのように決定するのですか? おそらく設定する必要がありarchive_timeout=3600ますか? pg_start_backup()とpg_stop_backup()を呼び出す必要があると言っているサイト(pgのメーリングリスト、baculaのpostgresページ)を見てきましたが、それらは必須ではないと思います。本当? 二次的な質問: WALはどのくらいの頻度でdata/pg_xlog書かれますか?何が書き込みをトリガーしますか? \qpsqlでDMLを実行すると、WALが更新されるようです。または、pgAdminでテーブルを編集してからウィンドウを閉じます。私はそれがコミット時に書き込むだろうと思った。 ベストプラクティス?pg_basebackupは週に1回ですか?WALをPGと同じマシンまたはリモートマシンにアーカイブしますか?


2
サブクエリを介して複数の列を選択する
次のクエリのサブクエリから2列を選択しようとしていますが、選択できません。エイリアステーブルを作成しようとしましたが、まだ取得できませんでした。 SELECT DISTINCT petid, userid, (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate, (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID FROM pet LEFT JOIN comments ON pet.id = comments.petid WHERE userid='ABC' AND deviceID!='ABC' AND comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH); 基本的に、私は同じ行からlastComDate&を取得しようとしていますlastPosterID-特定のペットのコメントの最新の行です。効率的な方法でそれらを取得する方法を提案してください。 上記のクエリは機能しますが、同じ行が2回フェッチされるため、過剰に思えます。さらに、ORDER BYクエリのプロファイリング中に見つけたように、句は集計関数よりもかなり遅くなります。そのため、ソートを回避するソリューションが必要です。

2
DELETE + REORGがディスクスペース(DB2)を解放しないのはなぜですか?
DB2には、大きなバイナリデータを含むテーブルがあります。今、テーブル全体をパージし、runstats、reorg、runstatsを実行しましたが、使用されたディスク容量は変わりません。ここで何が間違っているのでしょうか? テーブルは、次のように作成した独自のテーブルスペースにあります。 CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096; CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING; 私は次のように削除/再編成しました: DELETE FROM MY_TBL RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED …

3
多くの結合を持つSQLクエリを小さな結合に分割すると役立ちますか?
SQL Server 2008 R2で毎晩レポートを作成する必要があります。レポートの計算には数時間かかります。時間を短縮するために、テーブルを事前計算します。このテーブルは、12の非常に大きな(数百万行)テーブルを結合して作成されます。 この集計テーブルの計算には、数日前までに約4時間かかりました。DBAは、この大きな結合を3つの小さな結合(それぞれ4つのテーブルに結合)に分割しました。一時的な結果は毎回一時テーブルに保存され、次の結合で使用されます。 DBA拡張の結果、集計テーブルは15分で計算されます。私はそれがどのように可能か疑問に思いました。DBAは、サーバーが処理しなければならないデータの数が少ないためだと言いました。言い換えれば、大きな元の結合では、サーバーは合計された小さな結合よりも多くのデータを処理する必要があります。ただし、元の大きな結合でオプティマイザが効率的に処理し、結合をそれ自体で分割し、次の結合に必要な数の列のみを送信すると仮定します。 彼が行ったもう1つのことは、一時テーブルの1つにインデックスを作成したことです。ただし、オプティマイザーは必要に応じて適切なハッシュテーブルを作成し、計算を全体的に最適化すると思います。 私はこれについてDBAと話しましたが、彼は処理時間の改善がどのように行われたのかについては不確かでした。彼は、そのようなビッグデータを計算するのは圧倒される可能性があり、最適化プログラムが最適な実行計画を予測するのに苦労する可能性があるため、サーバーを非難しないと述べました。これは理解していますが、正確な理由についてより明確な答えが欲しいです。 したがって、質問は次のとおりです。 大きな改善をもたらす可能性があるものは何ですか? 大きな結合を小さな結合に分割する標準的な手順ですか? 複数の小さな結合の場合、サーバーが処理する必要があるデータの量は本当に少ないですか? 元のクエリは次のとおりです。 Insert Into FinalResult_Base SELECT TC.TestCampaignContainerId, TC.CategoryId As TestCampaignCategoryId, TC.Grade, TC.TestCampaignId, T.TestSetId ,TL.TestId ,TSK.CategoryId ,TT.[TestletId] ,TL.SectionNo ,TL.Difficulty ,TestletName = Char(65+TL.SectionNo) + CONVERT(varchar(4),6 - TL.Difficulty) ,TQ.[QuestionId] ,TS.StudentId ,TS.ClassId ,RA.SubjectId ,TQ.[QuestionPoints] ,GoodAnswer = Case When TQ.[QuestionPoints] Is null Then 0 …

6
ストアドプロシージャにトランザクションを使用しないでください
いくつかのコマンドを実行するストアドプロシージャがあります。これらのコマンドがストアドプロシージャのトランザクションにラップされないようにします。4番目のコマンドが失敗した場合、1番目、2番目、および3番目のコマンドをロールバックではなく、そのままにしておきます。 すべてが1つの大きなトランザクションとして実行されないような方法でストアドプロシージャを記述することは可能ですか?

1
mdfファイルとldfファイルのシャドウボリュームバックアップに依存しても安全ですか?
従来のSQLサーバーのバックアップを、mdfおよびldfファイルのVSSベースのバックアップに置き換えることを検討しています。dbの人として、私はこれについていくらか動揺していますが、これが機能しないという証拠は見つかりませんか? この戦略でトランザクションを失う可能性のある場所を実証するためにセットアップできる試用版を誰でも提案できますか?[長時間のトランザクション中に電源コードを抜くことは問題ありません]。 私たちが見ているシステムは、mdfファイルとldfファイルの初期スナップショットを作成してから、変更全体をコピーします。失敗するシナリオは想像できません。 従来のバックアップを保持する必要があることを上司に納得させてください。
18 sql-server 

1
データベースアーカイブソリューション
私が投稿した質問に続いて、大量のアクセス頻度の高いテーブルを別のデータベースに移動することをお勧めしますか?、PostgreSQLでのデータベースアーカイブに利用できるさまざまなテクニック/ソリューションを探しています。 私が考えることができるいくつかのソリューションは次のとおりです。 テーブルのパーティション分割 別のテーブルスペースおよび/またはスキーマ アーカイブされたレコード/テーブルを別のハードディスクに移動する 他の提案/ポインター/ソリューションは本当に歓迎され、高く評価されています。 注: CentOS5.2でPostgreSQL v9.1.3を実行しています

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