データベース管理者

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

3
テーブルの行と一致しない値の特定
クエリで指定された一意の識別子のうち、テーブルに存在しない一意の識別子を簡単に確認できるようにしたいと思います。 よりよく説明するために、リスト「1、2、3、4」のどのIDがテーブルに存在しないかを確認するために、私が今行うことは次のとおりです。 SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')、テーブルにID 2の行が含まれていないとしましょう。 結果をExcelにダンプする 結果リストの各リスト値を検索する元のリストでVLOOKUPを実行します。 結果となるVLOOKUP #N/Aは、テーブルで発生しなかった値になります。 これを行うにはもっと良い方法があるはずだと思います。私は理想的には次のようなものを探しています チェックするリスト->チェックするテーブルにクエリ->テーブルにないリストのメンバー


2
時間データ型に分を追加するにはどうすればよいですか?
2つのレコードをテーブルに挿入するストアドプロシージャがあります。レコード間の違いは、2番目のレコードの時間列が@MinToAdd最初のレコードの後であることです。 CREATE PROCEDURE CreateEntry /*Other columns*/ @StartTime time(2), @EndTime time(2), @MinutesToAdd smallint AS BEGIN SET NOCOUNT ON; SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed? IF (@MinutesToAdd > 0) BEGIN INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime) OUTPUT inserted.id VALUES (/*Other columns*/ @StartTime, @EndTime), (/*Other columns*/ @StartTime + …

1
pg_dumpとエラー:トースト値のチャンク番号0がありません
PostgreSQL 8.4.15を使用しています。pg_dumpデータベースのバックアップを実行しているときに、次のエラーが発生しました。 pg_dump: SQL command failed pg_dump: Error message from server: ERROR: missing chunk number 0 for toast value 123456789 in pg_toast_987654321 pg_dump: The command was: COPY public.my_table (id, .... all the columns ...) このエラーメッセージを検索したところ、テーブルのインデックスを再作成することを提案する参照(hereおよびhere)がいくつか見つかりました。(これらの議論ではpg_class、正しいpg_toast_XXXXXX値を見つけるためにテーブルをクエリすることへの言及がありましたが、それはエラーメッセージに表示されなかったためであると思われました。エラーメッセージに値が表示されたため、この部分をスキップしました。それ以降のバージョンのPostgreSQLが原因で便利になると思います。) 私は以下を実行しました: REINDEX table pg_toast.pg_toast_987654321; VACUUM ANALYZE my_table; pg_dumpエラーなしで使用できるようになりました。 pg_toastこれらのコマンドは実際に何をして何をしたのですか?これらは単に単純なクリーンアップに関するものですか、それともそのテーブルの一部の行を削除できたのでしょうか?そもそも何が問題の原因でしたか? このテーブルには約300000行ありますが、前回の正常なバックアップ以降、約250行しかないと予想されます(このテーブルはINSERT / SELECTにのみ使用され、UPDATEには使用されません)。
10 postgresql 

3
SQL Serverデータベースシャーディング-一般的なデータ/シャーディングされていないデータをどうするか
非常に大規模なエンタープライズレベルのデータベースがあります。私たちのビジネスモデルの一部として、すべてのWebユーザーが毎月同時にWebサーバーにアクセスし、それがSQLボックスに影響を与えています。トラフィックは非常に重く、会社が大きくなるほど大きくなります。sql proc最適化が実行され、ハードウェアはすでに非常に高いレベルに拡張されています。 現在、データベースを分割して、会社の成長と将来の負荷に対応できるようにしています。 どの特定のデータをシャーディングするかを決定しました。これは、高度に利用されているデータベースのサブセットです。 しかし、私の質問は、一般的/普遍的な非分割データに関するものです。このようなデータの例としては、たとえばInventoryテーブルや、おそらくEmployeeテーブル、userテーブルなどがあります。 この共通/普遍的なデータを処理する2つのオプションが表示されます。 1)設計1-共通/汎用データを外部データベースに配置します。すべての書き込みはここで行われます。その後、このデータは各シャードに複製され、各シャードがこのデータを読み取り、t-sql procでこのデータに内部結合することができます。 2)デザイン2-各シャードに、すべての共通/ユニバーサルデータの独自のコピーを提供します。各シャードがこれらのテーブルにローカルに書き込み、SQLマージレプリケーションを利用して、他のすべてのシャードでこのデータを更新/同期します。 設計に関する懸念#1 1)トランザクションの問題:シャードでデータを書き込んだり更新したりしてから、たとえば1つのストアドプロシージャで共通/ユニバーサルテーブルを書き込んだり更新したりする必要がある場合、これを簡単に行うことはできなくなります。現在、データは別個のSQLインスタンスとデータベースに存在しています。これらの書き込みは別のデータベースにあるため、トランザクションにラップできるかどうかを確認するために、MS DTSを使用する必要がある場合があります。ここではパフォーマンスが問題であり、シャーディングされた一般的なデータに書き込むプロシージャの場合、書き換えが発生する可能性があります。 2)参照整合性の喪失。データベース間の参照整合性を行うことはできません。 3)システムの広い領域を再コード化して、共通データを新しいユニバーサルデータベースに書き込み、共通データをシャードから読み取るようにします。 4)。データベーストリップの増加。上記の#1のように、シャーディングされたデータと共通データを更新する必要がある状況に遭遇した場合、データが別のデータベースにあるため、これを達成するために複数のラウンドトリップを実行することになります。ここでは多少のネットワーク遅延が発生しますが、この問題については上記3ほど心配していません。 設計に関する懸念#2 デザイン#2では、各シャードがすべての共通/ユニバーサルデータの独自のインスタンスを取得します。これは、一般的なデータに参加または更新するすべてのコードが、今日と同じように引き続き機能/実行されることを意味します。開発チームが必要とする再コーディング/書き換えはほとんどありません。ただし、この設計はすべてのシャード間でデータの同期を維持するためにマージレプリケーションに完全に依存しています。dbasは非常に熟練しており、マージレプリケーションがこれを処理できない可能性があり、マージレプリケーションが失敗した場合に非常に懸念しています。 デザインオプション#2を使用した人がいるかどうか知りたいです。また、表示されていない3番目または4番目のデザインオプションを見落としているかどうかも知りたいです。 前もって感謝します。
10 sql-server 

2
切り捨て/大きな挿入の後にインデックスを再構築する必要がありますか?
(他のテーブルのデータ、計算などに基づいて)新しいデータを挿入する前に、約175万行のテーブルを切り捨てるストアドプロシージャがあります。 基本的なアウトラインは非常に簡単です: テーブルを切り捨て 1回あたり約75,000の「バッチ」に175万行を挿入します。 このプロセスでいつでも明示的にインデックスを再構築する必要があるかどうか疑問に思っていますか?例えば テーブルを切り捨て ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [または類似の何か] 175万行挿入 多分 ALTER INDEX ALL ON xxx DISABLE テーブルを切り捨て 175万行挿入 ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90) [または類似の何か] どんな支援も感謝します... DBAではなく-DBをかなりよく知っている開発者はより正確です!

1
MySQLでUPDATEクエリをバッチ処理する最も効率的な方法は何ですか?
大量の更新をデータベースに長期間フラッシュする必要があるアプリケーションを作成していますが、クエリを最適化する方法に行き詰まっています。現在私はを使用していますINSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE。これは、すべての値を1つのクエリにバッチ処理するように機能しますが、大きなテーブルでは非常に遅く実行されます。実際に行を挿入する必要はありません。 私が見た他のアプローチは、更新を使用SET value = CASE WHEN...することです(これはクエリを構築している方法のために生成するのが難しくCASE、数百/数千のキーのパフォーマンスについてはわかりません)、そして単に複数の連結アップデート。これらのどちらが私の現在の方法よりも速いでしょうか? 私の知る限り、MySQLでこれを行うための慣用的で効率的な方法はないことに戸惑います。よりも高速な方法がない場合ON DUPLICATE KEY、PostgreSQLに切り替えてそのUPDATE FROM構文を使用する価値はありますか? 他の提案も大歓迎です! 編集:頻繁に更新されるテーブルの1つを次に示します。無関係であるため、列名を削除しました。 CREATE TABLE IF NOT EXISTS `table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `a` bigint(20) unsigned NOT NULL DEFAULT '0', `b` bigint(20) unsigned NOT NULL DEFAULT '0', `c` enum('0','1','2') …
10 mysql  update 

2
SELECT / INSERTデッドロック
このインスタンスは、SharePoint 2007データベース(SP)をホストします。SPコンテンツデータベース内の使用率の高い1つのテーブルに対して、多数のSELECT / INSERTデッドロックが発生しています。関連するリソースを絞り込みました。両方のプロセスで非クラスター化インデックスのロックが必要です。INSERTはSELECTリソースでIXロックを必要とし、SELECTはINSERTリソースでSロックを必要とします。デッドロックグラフは、3つのリソースを示しています。1)SELECT(プロデューサー/コンシューマーパラレルスレッド)からの2つ、および2)INSERTです。確認のためにデッドロックグラフを添付しました。これはMicrosoftのコードとテーブルの構造であるため、変更を加えることはできません。 ただし、MSFT SPサイトで、MAXDOPインスタンスレベルの構成オプションを1に設定することを推奨していることを確認しました。このインスタンスは他の多くのデータベース/アプリケーション間で共有されているため、この設定を無効にすることはできません。 したがって、私はこれらのSELECTステートメントが並列にならないようにすることを試みました。これは解決策ではなく、トラブルシューティングに役立つ一時的な変更であることがわかっています。そのため、ワークロードが変更されていない(SELECT / INSERTが頻繁に発生する)にもかかわらず、デッドロックがなくなったにもかかわらず、「並列処理のコストしきい値」を標準の25から40に増やしました。私の質問はなぜですか? SPID 356 INSERTは、非クラスター化インデックスに属するページにIXロックを持っています SPID 690 SELECT実行ID 0は、同じ非クラスター化インデックスに属するページにSロックを持っています 今 SPID 356はSPID 690リソースのIXロックを要求しますが、SPID 690がSPID 690によってブロックされているため、それを維持 できません。 1はSPID 356によってブロックされており、デッドロックが発生しています。 実行計画は私のSkyDriveにあります 完全なデッドロックの詳細はここにあります 誰かが私になぜそれを本当に感謝するか理解するのを手伝ってくれるなら。 EventReceiversテーブル。 Id uniqueidentifier no 16 Name nvarchar no 512 SiteId uniqueidentifier no 16 WebId uniqueidentifier no 16 HostId uniqueidentifier no 16 HostType …

4
テーブルデータのサブセットを製品データベースからローカルのテストデータベースにエクスポートするにはどうすればよいですか?
比較的大きな量のpostgresベースのデータベースがあります:〜20GB。PostgreSQLデータベースはherokuでホストされています。 テーブルデータの小さなサブセットをローカルデータベースにコピーして、本番環境で作業することなく、それらに対していくつかのテストを実行したいと考えています。 自分でサンプルデータを生成するのではなく、本番環境にすでに存在するデータを使用します。 データベースの各テーブルから最大100行で十分です。これを達成する簡単な方法はありますか?

2
sqlnet.oraまたはtnsnames.oraの変更には再起動が必要ですか?
Oracleのsqlnet.oraまたはtnsnames.oraファイルを変更するときはいつでも、システムを再起動する必要がありますか?私のインスタンスでは、参照しているマシンにOracleクライアントしかインストールしていませんが、好奇心から、Oracleサーバーのインストールにはどのような意味がありますか?

3
ユーザーはSSMSでデフォルト以外のスキーマのテーブルを表示できません
あるVIEW DEFINITIONユーザーのスキーマレベルで適切に権限を設定する際に問題が発生しました。スキーマTestSchemaを作成し、いくつかのテーブルを追加しました。ユーザーは、現在のアクセス許可は、アクセスに設定&(テーブルを変更しているSELECT、UPDATE、DELETEを介して、など)dbo_datareaderとdbo_datawriterロール。ただし、SSMSオブジェクトエクスプローラーでテーブルを表示することはできません。 定義を表示する権限を付与しようとしました: grant view definition on SCHEMA :: [TestSchema] to [User] それはうまくいきませんでした。テーブルレベルの権限を設定してみました: grant view definition on [TestSchema].[NewTable] to [User] それもうまくいきませんでした。それから私は全面的な助成金を試してみました: grant view definition to [User] そして、それはうまくいきました。これTestSchemaで、だけでなく、アクセスしてはならない他のスキーマも表示できるようになりました。 ここでの目標は、ユーザーが特定のスキーマ内のすべてのテーブルを表示できるようにすることです。どうすればそれを達成できますか?デフォルトでこれを実行できるようにする必要がある場合、なぜそれができないのかを見つけるためにどのようなアクセス許可を確認する必要がありますか?

1
プロファイルデッドロックレポートで「* password ------------」はどういう意味ですか?
SQL Server 2008 R2では、入力バッファーに "* password ------------"が含まれるいくつかのデッドロックレポートが表示されました。それは攻撃のように見えますが、その場合、理由や攻撃の種類はわかりません。 (ログはエキスパートDBAがどのように多くの経験を持っているかによって生成され、私ではなく、私にそれを伝えました) 誰か知っていますか?ありがとう! 例: <?xml version="1.0"?> <blocked-process> <process id="process879948" taskpriority="0" logused="0" waitresource="KEY: 5:72057602473263104 (1d69201d0ba6)" waittime="5185" ownerId="88389135" transactionname="SELECT" lasttranstarted="2012-09-25T18:11:02.507" XDES="0x1f7d2a590" lockMode="S" schedulerid="2" kpid="4552" status="suspended" spid="86" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2012-09-25T18:11:02.507" lastbatchcompleted="2012-09-25T18:11:02.507" lastattention="2012-09-25T18:07:35.740" clientapp=".Net SqlClient Data Provider" hostname="IP-xxxxxxxx" hostpid="4868" loginname="sa" isolationlevel="read committed (2)" xactid="88389135" currentdb="1" lockTimeout="4294967295" …

1
列の値ごとにSELECT LIMIT 1?
次の表があるとしましょう ----------------------------- | user_id | comment | ----------------------------- | 2 | thats cool | | 2 | awesome | | 3 | i hate this | | 3 | okay | | 6 | this is weird | | 6 | hello? | | 6 | what is it | …

1
HDDクラッシュ後にPostgreSQLサーバーを起動するとFAILED STATEになります
で使用Fedora 15していPostgreSQL 9.1.4ます。Fedoraは最近クラッシュしました: PostgreSQLサーバーを起動する試み: service postgresql-9.1 start 与える Starting postgresql-9.1 (via systemctl): Job failed. See system logs and 'systemctl status' for details. [FAILED] ただし、システムの再起動後に初めてサーバーを起動すると、サーバーは正常に起動します。 しかし、使用しようとするとpsqlこのエラーが発生します: psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? .s.PGSQL.5432ファイルはシステムのどこにも存在しません。Aはlocate …
10 linux  postgresql 

1
巨大なテーブルにシリアル列を追加する最も効率的な方法
BIGSERIAL列を巨大なテーブルに追加する最も速い方法は何ですか(〜3 Bil。行、〜174Gb)? 編集: 列を既存の行の増分値にしたい(NOT NULL)。 フィルファクターを設定しませんでした(振り返ってみると、これは悪い決定のように見えます)。 ディスク容量に問題はありません。できるだけ高速にしてください。

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