データベース管理者

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

1
大規模なレコードベースの数学データベースのプラットフォームは何ですか?
こんにちは私はプログラミングの経験を持つ土木技師ですが、今日利用できる幅広いオプションに精通していません。先に進むための最善の方法を教えてください。 地上レベルの測量測定値のデータベースをグリッド形式で作成して照会したいと考えています。土工作業を通じて、さまざまな時間に各グリッド位置の多くの測定値があるため、時間の4番目の次元があります。 ほとんどの場合、観測はテキストファイルから読み込まれます。各レコードには、(2 x整数)グリッド位置(行と列)、(浮動小数点)地上レベル、およびさまざまな文字列情報コード(合計で最大30文字)があります。 グリッドは、約10000行x 10000列にすることができます。グリッド上のすべての場所に各調査のレコードがあるわけではありませんが、通常、それらのレコードには最大100のレコードがあります。グリッドの場所の多くには、レコードがまったくありません(サイトは完全に長方形ではありません)。 レコードを検索し、データを抽出して、計算を行います。たとえば、グリッドの場所ごとに最低または最高の地上レベルを計算します。私は、これをFORTRAN、BASIC、Cなどの言語で配列を使用してかなり簡単にプログラムできると確信しています。配列要素の多くは空ですが、これは適切な方法ではないと思います。このような大きなデータベースには、使用方法を学ぶために特別なツールが必要になると思います。 私はプラットフォームの可能なオプションを考えています- データベースプログラムを使用します。これらがどれほど強力であるかについてはよく知りませんが、GUIではオーバーヘッドが多くなると思います。 SQLを使用しますか?これについてはあまり知りませんが、データベースの言語のようです。私は常に宣言型ではなく命令型言語を使用しており、ウィキペディアからSQLが宣言型であることを理解しているので、この変更には少し神経質になっています。使い方がよくわかりません。コンソールプログラムを作成するコンパイラはありますか?データベースはディスクに保存されていますか?そのような愚かな質問でごめんなさい。 c-treeACEのようなAPIを使用しますか?これは、「これを実行してから、それを実行する」という言語の親しみを私に提供する方法になると思います(残念ながら、これは私がエンジニアとして考える方法です!)。しかし、APIによって提供されるバックグラウンドのメモリと処理の管理が、巨大な配列で実現できるものよりも優れていることを期待しています。 または、オブジェクト指向言語でそれを行うことができ、コンピュータにストレージ要件を心配させることができます。たとえば、各レコードから必要な結果を得るのに役立つメソッドとプロパティを持つオブジェクトとしてレコードを保存した場合-3)に比べて巨大な肥大したプログラムになりますか 何億ものレコードが存在する可能性が高いため、Windowsを実行している最新のPCで、数時間ではなく数分(できれば数秒)でクエリを実行して処理できるようにしたいと考えています。より具体的には、Windows 7 64ビットを実行する6Gb ramと120Gb SSDを搭載したi7プロセッサーです。 誰かが知恵のいくつかの単語を初心者と共有する時間があることを願っています。

4
特定のユーザーのクエリが遅い
C#.NET Webアプリケーションから呼び出されるクエリがいくつかあります。これは常に高速です(SQL Serverのローカル管理者です)が、ユーザーのグループ(必要な権限を持つドメイングループ)の場合、クエリはアプリケーションでタイムアウトするポイント。 まったく同じクエリがユーザーごとに異なる動作をする原因は何ですか? より詳しい情報: クエリは、ストアドプロシージャではなく、C#コードのインラインSQLです。 アプリはドメイン認証を使用し、ユーザーと私はアプリを通じてクエリを実行します 問題は別のプランであるようで、1つはキャッシュされたため、ユーザーごとに異なっていました。クエリがアプリ経由で遅くなり、SQL Server Management Studioで高速になるため、何かがキャッシュに影響しています。

1
インデックスのロック順序による2つの更新でのSQL Serverのデッドロック
2つのUPDATEがあります。ステータス列も更新されているため、1つは最初にCIをロックし、次にNCI(ステータス)をロックします。もう1つは、NCIが変更中であることを認識しているため、すでにNCIのUロックを所有しており、CIのUロックを取得しようとします。 これらを強制的にシリアル化する最も簡単な方法は何ですか?これは内部インデックスの問題であるため、TABLEレベルのヒントを使用するのは奇妙に思われます-関係するテーブルは1つだけです-UPDLOCK、HOLDLOCKはそのテーブルで必要なすべてのインデックスに自動的に適用され、それによって強制的にシリアル化されますか? クエリは次のとおりです。 UPDATE htt_action_log SET status = 'ABORTED', CLOSED = GETUTCDATE() WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}' AND status = 'OPEN'; その1つのXが(CREATED列で)CIの行をロックし、ステータス列を含むNCIでXロックを試みます。 UPDATE htt_action_log SET status = 'RUNNING {36082BCD-EB52-4358-E3D3-4D96FD5B9F0F} 1360094342' WHERE action_uuid = (SELECT TOP 1 action_uuid FROM htt_action_log WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}' AND status = 'OPEN' ORDER BY action_seq) この1つのUは同じNCIをロックします-私が推測するネストされたクエリの場合、更新のためにCIをロックします。 …

2
異なるバージョン/エディションのバックアップファイルからデータベースを復元する
下位互換性の理由から、古いバージョンから新しいバージョンに復元している限り、SQL Serverでデータベースを復元することは可能であると読みました。 SQL Serverの異なるエディションの* .bakファイルからデータベースを復元できるかどうか、誰もが手に負えないでしょうか?非常に大規模なデータベースをFTP経由で移動するので、数日かかるので、これは1回だけ行うようにします。FTP経由でデータベースを転送するまでに誰も応答しない場合は、これを試し、テストで機能するかどうかを確認し、独自の質問に答えます。 以下は、SQL Serverのバージョンの詳細を取得するクエリです。のproductversion形式です{major revision}.{minor revision}.{release revision}.{build number}。私の場合、に{release revision}は5500ソースと5512ターゲットのの値があります。これで問題ありません。ただし、これeditionは異なります。 クエリ: SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition') ソースデータベース: 10.0.5500.0 SP3 Developer Edition (64-bit) ターゲットデータベース: 10.0.5512.0 SP3 Enterprise Edition (64-bit)

1
SQL Serverクエリが7 MB /秒を超えるディスクI / Oを使用しないのはなぜですか
IOmeterテストを使用して、200 MB /秒を超えるパフォーマンスを示すSSDを持っています。しかし、ローカルマシンからSQLクエリを実行すると、Windowsリソースモニターに7MB /秒を超えるディスクIOが表示されません。これは、実行に2分以上かかるクエリでも当てはまります。SSDから7MB /秒しか使用していないことがボトルネックになるのは何ですか? 私は走っています: Windows Server 2012スタンダード SQL Server 2008 R2 Intel i7 3820 32GBのRAM sandisk SSD

1
Qcache_free_memoryがいっぱいになっていませんが、たくさんのQcache_lowmem_prunesを取得しています
CMSのクエリキャッシュを少し始めました。 誰かが半分以上が無料であるときになぜ私が多くを得るのか私に言うことができますか(または少なくとも推測を与えることができますか)?Qcache_lowmem_prunesQcache_free_memory query_cache_size=512M query_cache_limit=1M 約12時間後の様子です show status like '%qcach%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 10338 | | Qcache_free_memory | 297348320 | | Qcache_hits | 10254104 | | Qcache_inserts | 6072945 | | Qcache_lowmem_prunes | 725279 | | Qcache_not_cached | 2237603 | | Qcache_queries_in_cache | 48119 …

1
PostgreSQL pg_stat_activityはCOMMITを示します
最近、データベースサーバーを、4 xクアッドコアCPUと32GbのRAMを備えたアップグレードされたマシンに置き換えました。また、古いボックスを再利用して、ストリーミングレプリケーションのスレーブとして機能させました。どちらのボックスもCentOS 6.3とPostgreSQL 9.2を実行しています。Postgresは、各ボックスで実行されている唯一のものです。 この構成は約1か月ほど前から行われていましたが、トラフィックが増加し始めたときに突然、いくつかの問題が発生し始めました。私たちが見始めているのは、ときどき非常に高いCPU負荷であり(上部は270の負荷平均を示しています)、pg_stat_activityこれを見ると、ほとんどの接続がCOMMIT状態にあることがわかります。そのままにしておくと、これは最終的に終了し、システムは接続がになるのに応答しIDLEます。レプリケーションを無効にして、それが問題であるかどうかを確認しましたが、問題は解決しません。 何が起こっているのかを診断してみましたが、少し迷っています。実行からの出力はperf、以下のようなものを示しており、私は何を0x347ba9表しているのかわかりません。 + 41.40% 48154 postmaster 0x347ba9 f 0x347ba9 ◆ + 9.55% 10956 postmaster 0x2dc820 f set_config_option ▒ + 8.64% 9946 postmaster 0x5a3d4 f writeListPage + 5.75% 6609 postmaster 0x5a2b0 f ginHeapTupleFastCollect ▒ + 2.68% 3084 postmaster 0x192483 f build_implied_join_equality ▒ + 2.61% 2990 postmaster 0x187a55 …
11 postgresql 

2
トランザクションログファイルの内容の詳細
トランザクションログ(略してLDFと呼ぶ)の内容について質問があります。完全復旧モデルのデータベースを想定しています。 私は、LDFファイルに(ログ)データベースへのすべての操作(つまり、完全復旧モード)が含まれていることを読みました。ロギング中とどう違うのBEGIN TRAN; COMMAND(s); COMMITですか?どうやらトランザクションはロールバックできますが、標準コマンド(完全復旧モード)はロールバックできないので、私は尋ねています。 トランザクション中にLDFファイルに記録される内容は、通常の完全復旧ロギングの場合とは異なると思います。そうですか?どう違うの?各アクションに「元に戻す」操作が含まれているだけですか? 関連するメモとして、完全復旧LDFファイルを使用して標準クエリを「ロールバック/元に戻す」ための商用ツールがあると聞きました。どうやってやっているの?彼らはLDFの内容を分析し、逆/元に戻す操作を考え出そうとしますか?

1
上位の呼び出しスタックからのDB_IDコンテキスト
SQL ServerではDB_ID、コールスタックの上位からコンテキストからを取得できますか? 私の目標は、開発サンドボックスデータベースに便利な(そして確かにハッキーな)ユーティリティ関数を作成して、短い名前または断片化された名前を与えられたオブジェクトの完全修飾名を簡単かつ簡潔に取得し、さらに同じ短い名前を使用してオブジェクトを削除することです。これらのユーティリティ関数は単一のユーティリティデータベースにありますが、同じサーバー上の他のデータベースから呼び出されます。 私がテストから見ることができるものから: ORIGINAL_DB_NAME()意図したとおり、現在のコンテキスト(によって設定USE [dbname])ではなく、接続文字列にあるものを返します。 関数で呼び出されると、その関数が定義されてDB_NAME()いるデータベースの名前を返します。別の言い方をすると、関数またはストアドプロシージャ内のコンテキストは、それが定義されているデータベースのコンテキストです。 エンジンがコールスタックの上下にある各データベースコンテキストを追跡していることを知っています(証明については以下を参照してください)。この情報にアクセスする方法はありますか? 実行中のコードが同じデータベース内にない場合でも、呼び出し元のデータベースのコンテキストでオブジェクトを検索して操作できるようにしたい。例えば: use SomeDB EXEC util.dbo.frobulate_table 'my_table' 私はできることを知っています EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table' しかし、この方法でコールスタックをクエリできるかどうかは、私が本当に興味があるだけです。 更新/メモ Gabriel McAdamsのブログからコードを読んでダウンロードしました。これにより、スタックの上下の呼び出しプロシージャIDの記録が提供されますが、すべてが同じデータベースにあると見なされます。 SQL ServerがDBコンテキストのアップとダウンのコールスタックを記憶していることの証明 例:データベースTestDB1とTestDB2を持つ開発サーバー use TestDB1 GO CREATE FUNCTION dbo.ECHO_DB_NAME() RETURNS nvarchar(128) BEGIN RETURN DB_NAME() END GO use TestDB2 GO CREATE PROCEDURE dbo.ECHO_STACK AS BEGIN DECLARE @name nvarchar(128) SET …
11 sql-server 

8
WindowsアカウントでSqlLocalDBインスタンスを開始できません
私は管理者であり、次のコマンドを実行するだけです。 sqllocaldb start v11.0 結果: Start of LocalDB instance "v11.0" failed because of the following error: Error occurred during LocalDB instance startup: SQL Server process failed to sta rt. イベントビューアログイベントID:528 Windows API呼び出しWaitForMultipleObjectsがエラーコードを返しました:575。Windowsシステムエラーメッセージ:{アプリケーションエラー}アプリケーションを正しく開始できませんでした(0x%lx)。[OK]をクリックしてアプリケーションを閉じます。行で報告:3621。 別の(ユーザーと管理者)アカウントを試しましたが、問題はありませんでした。 SQLLocalDB.msiの2012バージョンをアンインストールして再インストールしましたが、うまくいきませんでした。何かアイデアと修正はありますか?


2
innodb_flush_log_at_trx_commitへの動的な変更
これはこの質問に関連しています。InnoDBテーブルのパフォーマンスを向上させるのに役立ちます。 MySQLマニュアルによれば、innodb_flush_log_at_trx_commitはグローバル動的変数です。したがって、SET GLOBALコマンドを使用して変更でき、正常に機能しているようです。 mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2; Query OK, 0 rows affected mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 2 | +--------------------------------+-------+ 1 row in set ただし、実際のMySQL設定は変更されませんでした。my.cnfを更新し、MySQLサーバーを再起動すると、機能しました。それで、実行時にグローバル変数を変更できませんか? 私はデフォルト値を好みinnodb_flush_log_at_trx_commit=1ますが、高速化するために大規模なデータベースの復元プロセスを実行する前に、それを2に変更する必要があります。しかし、プロセスが完了したら、値を1に戻したいと思います。実行時にこれを行うことは可能ですか? 共有ホスティングサーバーのmy.cnfにアクセスできません。

1
関数呼び出しによる推定クエリプランと実際のクエリプラン
SQLサーバーにこのクエリがあります。マージレプリケーションクエリです。 SELECT DISTINCT b.tablenick, b.rowguid, c.generation, sys.fn_MSgeneration_downloadonly ( c.generation, c.tablenick ) FROM #belong b LEFT OUTER JOIN dbo.MSmerge_contents c ON c.tablenick = b.tablenick AND c.rowguid = b.rowguid; 推定クエリプランには、3つのクエリに関する情報が含まれます。 上記のクエリ fn_MSgeneration_downloadonlyへの関数呼び出し fn_MSArticle_has_downloadonly_propertyへの関数呼び出し 実際のクエリプランには、次の情報のみが含まれます。 上記のクエリ 関数については何もありません。実際のプランで機能情報が欠けているのはなぜですか? 私はこれらのオプションを試しました: SET STATISTICS PROFILE ON SET STATISTICS XML ON 実際のプランを作成しましたが、Management Studioで実際のクエリプランオプションを使用したときと同じように、パート2と3が欠落していました。 たとえば、プロファイラーを使用して関数呼び出しに関する情報を取得する場合、どのイベントを選択しますか? クエリプランに特に関連する回答は見つかりませんでしたが、SP:StmtStartingおよびSP:StmtCompletedのプロファイルを作成したところ、関数呼び出しが表示されました。

1
SQL ServerのキャッシュフラッシュとディスクI / O
.NET 4.0で開発したOLTPシステムの負荷テストに忙しく、SQL Server 2008 R2を背後で実行しています。システムはSQL Server Service Brokerキューを使用します。これは非常にパフォーマンスが高いキューですが、処理中に独特の傾向が発生しています。 SQL Serverは、1分の猛烈な速度で要求を処理し、その後、約20秒のディスク書き込みアクティビティが増加します。次のグラフは問題を示しています。 Yellow = Transactions per second Blue = Total CPU usage Red = Sqlsrv Disk Write Bytes/s Green = Sqlsrv Disk Read Bytes/s トラブルシューティング中に、パターンに大きな変更を加えることなく次のことを試みました。 SQL Serverエージェントを停止しました。 実行中の他のほぼすべてのプロセスを強制終了(A / V、SSMS、VS、Windowsエクスプローラーなど) 他のすべてのデータベースを削除しました。 すべての会話タイマーを無効にしました(トリガーは使用しません)。 メッセージキュー主導のアプローチから、シンプル/粗いテーブルモニタリングデザインに移行しました。 軽いものから重いものまで、さまざまな負荷を使用しました。 すべてのデッドロックを修正しました。 SQL Serverがキャッシュを構築し、特定の時間ベースの間隔でディスクに書き込んでいるように見えますが、この理論をサポートするオンラインのものが見つかりません。 次に、ソリューションを専用のテスト環境に移動して、問題を再現できるかどうかを確認します。暫定的な支援をいただければ幸いです。 Update 1 要求に応じて、チェックポイントページ/秒、ページの平均寿命、およびいくつかのディスク遅延カウンターを含むグラフがここにあります。 チェックポイント(水色の線)が、パフォーマンスの低下(黄色の線)の原因であるように見えます。^ …


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