データベース管理者

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

4
2つのテーブルを相互に検証する簡単な方法
ETLプロセスを行っています。すべてを言い終えると、同一のテーブルがたくさんあります。(2つの異なるサーバー上の)それらのテーブルが実際に同一であることを確認する最も簡単な方法は何ですか。私はスキーマとデータの両方を話しています。 個々のファイルまたはファイルグループでできるように、テーブルでハッシュを実行できますか?Red-Gateのデータ比較がありますが、問題のテーブルにはそれぞれ数百万の行が含まれているため、もう少しパフォーマンスの高いものが欲しいです。 私の興味を引く1つのアプローチは、組合声明のこの創造的な使用です。しかし、可能であれば、ハッシュのアイデアをもう少し詳しく調べたいと思います。 回答の更新後 将来の訪問者のために...ここに私が取った正確なアプローチがあります。これは非常にうまく機能し、各データベースのすべてのテーブルで実行しています。私を正しい方向に向けてくれた以下の回答に感謝します。 CREATE PROCEDURE [dbo].[usp_DatabaseValidation] @TableName varchar(50) AS BEGIN SET NOCOUNT ON; -- parameter = if no table name was passed do them all, otherwise just check the one -- create a temp table that lists all tables in target database CREATE TABLE #ChkSumTargetTables ([fullname] varchar(250), [name] …

1
SQL Server 2005からSQL Server 2012へのアップグレード
次のテスト環境をセットアップしています。 仮想マシン(Hyper-V) Windows Server 2008 R2 SP1(x64ビット) Windows SQL Server 2005 Developer Edition SP4(x64ビット)(デフォルトのインスタンス名) マージレプリケーションが設定された1つのデータベース...それぞれ2つのサブスクライバを持つ3つのパブリケーション。 SQL Server 2012 Developer Edition(sp1)へのアップグレード手順をテストしています... 64ビットSQL Server 2012開発用のisoをダウンロードしました。(sp1)MSDN(フルライセンスコピー)からアップグレードパスを開始しました。さまざまな基準のチェックを開始する最終段階の1つで、以下に概説する奇妙な問題に遭遇します。 Rule "Upgrade architecture mismatch" failed. The CPU architectures of upgrading feature(s) are different. To upgrade these features, Setup architecture must be the same as the features being …

2
ETL:200のテーブルから抽出-SSISデータフローまたはカスタムT-SQL?
私の分析に基づいて、データウェアハウスの完全な次元モデルでは、200を超えるソーステーブルから抽出する必要があります。これらのテーブルの一部は増分ロードの一部として抽出され、他のテーブルは全ロードになります。 注目に値するのは、すべて同じスキーマを持つ約225のソースデータベースです。 私が見てきたことから、OLE DBソースとOLE DB宛先を使用してSSISで単純なデータフローを構築するには、設計時に列とデータ型を決定する必要があります。つまり、最終的には抽出だけのために200以上のデータフローが発生することになります。 保守性の観点から、これは大きな問題として私を襲います。抽出コードに何らかの抜本的な変更を加える必要がある場合、200の異なるデータフローを変更する必要があります。 代替オプションとして、メタデータテーブルのセットから抽出するソースデータベース、テーブル名、および列を読み取る小さなスクリプトを作成しました。コードは複数のループで実行され、動的SQLを使用して、リンクサーバーとOPENQUERYを介してソーステーブルから抽出します。 私のテストに基づいて、これはまだOLEDBのソースと宛先でSSISデータフローを使用するほど高速ではありません。だから私は私がどんな種類の選択肢を持っているのかと思っています。これまでの考えは次のとおりです。 EZAPIを使用して、シンプルなデータフローでSSISパッケージをプログラムで生成します。抽出するテーブルと列は、前述の同じメタデータテーブルから取得されます。 サードパーティソフトウェア(動的データフローコンポーネント)を購入する これにアプローチする最良の方法は何ですか?.NETプログラミングに関しては、私は初心者なので、基本だけで立ち上がるのに必要な時間も心配です。

3
ゾーン名がPostgreSQLのバグの「AT TIME ZONE」
私はこのstackoverflowの質問に答えていて、奇妙な結果を見つけました: select * from pg_timezone_names where name = 'Europe/Berlin' ; name | abbrev | utc_offset | is_dst ---------------+--------+------------+-------- Europe/Berlin | CET | 01:00:00 | f そして次のクエリ select id, timestampwithtimezone, timestampwithtimezone at time zone 'Europe/Berlin' as berlin, timestampwithtimezone at time zone 'CET' as cet from data ; id | timestampwithtimezone | …

2
ARITHABORT ONに変更するリスク
私はベンダーとコアアプリケーションを提供する取り決めで作業しており、コアアプリケーションを変更しない限り、独自の拡張機能を構築できます。SQL Server 2005データベースに接続するColdFusionに組み込まれています。 私が作成したレポートの一部は、コアテーブルから計算された関数を使用するビューに依存しており、テーブルが大きくなるとレポートが非常に遅くなります。レポートを高速化するために、インデックス付きビューを使用します。しかし、テスト環境でインデックス付きビューを作成した後、コアアプリケーションはコアテーブルに挿入できなくなりました(インデックス付きビューを使用ARITHABORTするONときに必要なエラーメッセージが返されました)。 そのため、インデックス付きビューを使用SET ARITHABORT ONするには、コアテーブルを挿入/更新するたびにコアアプリケーションが必要になるようです。テスト環境でこれを実行しました: ALTER DATABASE MyDatabase SET ARITHABORT ON; そして、それはうまくいくようです。しかし、私のベンダーは、アプリケーションには何千ものクエリがあるため、この設定がこれらのクエリのいずれかを破壊するリスクがある可能性があり、将来の予期しないデータベースの問題がある場合、デフォルト設定を復元すると主張します。 壊れる実際のクエリはありSET ARITHABORT ONますか?保管した方が良い状況はありますOFFか? TL; DR新しいインデックス付きビューを機能さARITHABORT ONせるには、データベース全体を設定する必要がありますが、ベンダーは自分の責任でそれを行うと警告しています。実際にリスクはありますか?

2
Single_Userモードでデータベースを削除する方法
DatabaseName (Single User)名前として表示されているデータベースを削除するにはどうすればよいですか? 削除しようとすると、次のエラーが表示されます。 データベース 'DatabaseName'の変更に失敗しました。(Microsoft.SqlServer.Smo) ALTER DATABASEステートメントが失敗しました。(Microsoft SQL Server、エラー:5064) ALTER以下を実行しようとしましたが、まだ同じ問題があります。 ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT



1
デフォルトのcharacter_set_serverがlatin1なのはなぜですか?
私はMySQL 5.5を使用していますが、文字セットに関する変数を表示すると、 +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ …

1
Oracle Databaseのコミットvs高速コミットvsコミットアウト
Oracle Databaseに関連するこれら3つの用語の違いについて、誰かが私の理解を検証できるかどうか疑問に思っていました。 多くの情報源はこれらの用語を混同し、それらを詳細に説明していないため、情報を見つけるのは少し難しいものでした。 私が収集したものから: コミットと高速コミットはまったく同じです。すべてのコミットは高速コミットです。 基本的に、高速コミットは、元に戻す/ロールバックセグメントヘッダーのトランザクションテーブルのフラグを更新するだけで、トランザクションがコミットされたことを示します。ただし、実際のブロックは再検討されません。つまり、データブロックのヘッダーにある対象トランザクションリスト(ITL)のUNDOバイトアドレス(UBA)は、対応するUNDOセグメントのトランザクションテーブルを指します。さらに、対応する行のロックバイトは解放されず、ITLのロックカウントは変更されません(行はロックされたままです)。 コミットクリーンアウトでは、ブロックが再訪され、ITLがコミットSCNで更新されます。ただし、ITLのロックカウントと各行に格納されているロックバイトはまだ更新されず(高速コミットのように行はロックされたままです)、ブロックが変更されても、REDOは生成されません。 正常にコミットされた(==高速コミットされた)ブロックは、次にタッチされたときに遅延ブロッククリーンアウトを実行します(そしてREDOを生成します)。 コミットクリーンアウトが行われたブロックは、次にタッチされたときに遅延ログブロッククリーンアウトが行われます(そして、REDOが生成されます)。 誰かがこれらのポイントを検証できることを願っています!ありがとう!

2
複雑な基準を使用したインデックス付き読み取りの最小化
作業チケットのFirebird 2.5データベースを最適化しています。それらはそのように宣言されたテーブルに保存されます: CREATE TABLE TICKETS ( TICKET_ID id PRIMARY KEY, JOB_ID id, ACTION_ID id, STATUS str256 DEFAULT 'Pending' ); 通常、処理されておらずPendingステータスにある最初のチケットを見つけたいです。 私の処理ループは次のようになります: 最初のチケットを取得する場所 Pending チケットを使用してください。 チケットステータスの更新=> Complete 繰り返す。 派手なものは何もありません。このループの実行中にデータベースを監視している場合、各反復でインデックス付き読み取りの数が増えていることがわかります。パフォーマンスは、私が知ることができるほどひどく低下するようには見えませんが、私がテストしているマシンはかなり速いです。ただし、一部のユーザーから時間の経過とともにパフォーマンスが低下するという報告を受けました。 にインデックスがありますStatusが、それでもTicket_Id繰り返しごとに列をスキャンするようです。私は何かを見落としているように見えますが、何がわからないのですか。このようなものに対するインデックス付き読み取りの増加数は予想されていますか、それともインデックスが何らかの形で誤動作していますか? -コメントの編集- Firebirdでは、次のように行の取得を制限します。 Select First 1 Job_ID, Ticket_Id From Tickets Where Status = 'Pending' だから、「最初」と言うとき、私はそれをどこに限定レコードセットを要求しているだけですStatus = 'Pending'。

1
大容量メモリ環境でのSQL Server TempDBの動作
この質問を読んで、私が少し前に持っていた質問を思い出しました。 512 GBのRAMを搭載したSQL Serverがあり、メインデータベースは450 GBです。TempDBには非常に多くのアクションがあります(わかりました、「かなり多くのアクション」だと思います-そうでないかもしれません!)。RamDisk Plus Serverのデモ版をインストールし、50GBのRAMドライブを作成し、TempDBを指定しましたが、パフォーマンスの改善はまったく見られませんでした。 TempDBへの書き込みは常にディスクへの実際の物理的な書き込みになりますか、それともWindowsファイルシステムキャッシュのような遅延書き込みのためにSQL ServerによってTempDBの書き込みがキャッシュされますか? このシナリオではラムディスクは無意味ですか? SQL Server 6.5がTempDB-In-Ramをサポートしていたことは知っていますが、それはずっと前に廃止されたようです!

2
innodb_flush_method = O_DIRECTとLVMディスクパーティションのあるext3のO_DSYNCパフォーマンスへの影響
私の実稼働環境の1つでは、RedHatクラスター上で2つのインスタンスが実行されており、1つの実稼働インスタンスがクラスターに関連付けられています。 インスタンス1が占有する24G InnoDBバッファープールと、インスタンス2が占有する12Gの125Gメインメモリがあり、RedHatクラスターに関連付けられていません。データとトランザクションログは両方とも、ext3ファイルシステムのあるLVMディスクパーティションにあります。 パフォーマンスの向上とI / Oスループットの向上のために、に変更innodb_flush_methodすることにしましたO_DIRECT。 MySQLドキュメントを参照して: InnoDBのデータファイルとログファイルがSAN上にある場合、に設定innodb_flush_methodするとO_DIRECT、単純なSELECTステートメントのパフォーマンスが3倍低下することがわかっています。 ハイパフォーマンスMySQL Ver 2および3を参照すると、InnoDB開発者がを使用してバグを発見したと述べていinnodb_flush_method=O_DSYNCます。O_SYNCとO_DSYNCに類似しているfsync()とfdatasync():O_SYNC一方、同期データとメタデータの両方、O_DSYNCのみ同期データ。 それがアドバイスなしで多くの説明のように思えた場合、ここにアドバイスがあります: Unixライクなオペレーティングシステムを使用しており、RAIDコントローラーにバッテリバックアップ式の書き込みキャッシュがある場合は、を使用することをお勧めしますO_DIRECT。そうでない場合は、O_DIRECTアプリケーションに応じて、デフォルトまたはおそらく最適な選択肢のいずれかです。 グーグルで、私はこのベンチマークレポートを得ました:オンO_DSYNC対O_DIRECT ベンチマークレポート: =================== 1B行の複雑なトランザクションテスト、64スレッド * SAN O_DIRECT:読み取り/書き込み要求:31560140(8766.61毎秒) * SAN O_DSYNC:読み取り/書き込み要求:5179457(1438.52毎秒) * SAN fdatasync:読み取り/書き込み要求:9445774(毎秒2623.66) *ローカルディスクO_DIRECT:読み取り/書き込み要求:3258595(毎秒905.06) *ローカルディスクO_DSYNC:読み取り/書き込み要求:3494632(1秒あたり970.65) *ローカルディスクfdatasync:読み取り/書き込み要求:4223757(1秒あたり1173.04。 ただし、O_DIRECTOSレベルのキャッシュを無効にします。ダブルキャッシュを無効にすると、I / Oスループットが向上します。 O_DIRECTよりも一緒に行くのは良いO_DSYNCですか?これら2つのオプションは少しわかりにくいです。特に本番環境でデータ、読み取り/書き込みに影響を与えることなく、I / Oスループットの向上とパフォーマンスの向上を示すオプションはどれですか?あなたの個人的な経験に基づいたより良い提案はありますか? 投稿で Rolando Updateを見ることができました: それでも、これらのパラメーターの両方にわずかな混乱があります。私が使用して生産の設定テンプレートのほとんどを見ることができた場合はO_DIRECT推薦ところ、私は任意のを見ていませんO_DSYNC。 システム MySQL 5.1.51-enterprise-gpl-pro-log Red Hat Enterprise Linux Serverリリース5.5 バッテリーライトバックキャッシュ512MBのRAIDコントローラーを搭載したDELL DRAC バッテリーバックアップユニット(BBU)を搭載したDell …

1
ミラーリング-サーバーのネットワークアドレスに到達できません
SQL Server 2008 R2がインストールされています。3つのインスタンスが含まれています。 デフォルト(MSSQLServer) 最初のインスタンス 2番目のインスタンス これらはすべて、ネットワークサービスとしてログオンです。 デフォルトのインスタンスはプリンシパルサーバーです。最初のインスタンスはミラーリングです。2番目のインスタンスは監視サーバーです。 最初に、プリンシパルデータベースのフルバックアップとトランザクションログバックアップを取得しました。同じデータベース名を保持して最初のインスタンスに復元し、リカバリ状態はリカバリなしです 最後に、ミラーリングを開始しましたが、次に示す2つのエラーメッセージが表示されます。

2
このクエリで非クラスター化インデックスが使用されないのはなぜですか?
クエリパフォーマンスの向上に関するこの質問に続き、デフォルトでインデックスを使用する方法があるかどうかを知りたいと思います。 このクエリは約2.5秒で実行されます。 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; これは約33msで実行されます。 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' ORDER BY [DateEntered], [DeviceID]; [ID]フィールド(pk)にクラスター化インデックスがあり、[DateEntered]、[DeviceID]に非クラスター化インデックスがあります。最初のクエリはクラスター化インデックスを使用し、2番目のクエリは非クラスター化インデックスを使用します。私の質問は2つの部分です。 なぜ、両方のクエリに[DateEntered]フィールドにWHERE句があるため、サーバーは2番目ではなく最初のクラスター化インデックスを使用するのですか? orderbyがなくても、このクエリでデフォルトで非クラスタ化インデックスを使用するにはどうすればよいですか?(または、なぜそのような振る舞いを望まないのでしょうか?)

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