データベース管理者

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

1
日付の比較を行うサブクエリのパフォーマンスが悪い
サブクエリを使用して、一致するフィールドを持つすべての以前のレコードの合計数を検索する場合、5万件のレコードがあるテーブルでパフォーマンスはひどいです。サブクエリがなければ、クエリは数ミリ秒で実行されます。サブクエリを使用すると、実行時間は1分以上になります。 このクエリの場合、結果は次のようになります。 特定の日付範囲内のレコードのみを含めます。 日付範囲に関係なく、現在のレコードを含まない、以前のすべてのレコードのカウントを含めます。 基本的なテーブルスキーマ Activity ====================== Id int Identifier Address varchar(25) ActionDate datetime2 Process varchar(50) -- 7 other columns サンプルデータ Id Address ActionDate (Time part excluded for simplicity) =========================== 99 000 2017-05-30 98 111 2017-05-30 97 000 2017-05-29 96 000 2017-05-28 95 111 2017-05-19 94 222 2017-05-30 推測される結果 日付範囲のため2017-05-29に2017-05-30 …

6
大量のデータの行間の違いの詳細を照会する
300を超える列を持つ大きなテーブルがいくつかあります。私が使用しているアプリケーションは、セカンダリテーブルに現在の行のコピーを作成して、変更された行の「アーカイブ」を作成します。 些細な例を考えてみましょう: CREATE TABLE dbo.bigtable ( UpdateDate datetime, PK varchar(12) PRIMARY KEY, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); アーカイブ表: CREATE TABLE dbo.bigtable_archive ( UpdateDate datetime, PK varchar(12) NOT NULL, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); で更新が実行される前dbo.bigtableに、行のコピーが作成されますdbo.bigtable_archive、次にdbo.bigtable.UpdateDate現在の日付で更新されます。 したがってUNION、2つのテーブルをまとめてグループ化するとPK、変更のタイムラインが作成されます。UpdateDateます。 次の形式で、並べUpdateDate替え、グループ化、行間の違いを詳細に説明するレポートを作成しPKます。 …

1
修復の実行中にCassandraクラスターに新しいノードを追加しても安全ですか?
既存のCassandraクラスターを拡張する準備ができています。修理を定期的に実行する予定です。クラスターに新しいノードを追加するときに修復を無効にする必要がありますか?または、クラスターの他の場所で修復が実行されている間に新しいノードをブートストラップできますか?

3
pgAdmin設定のバイナリパス
PostgreSQLをインストールしたの.backupは、別のプラットフォームにアップロードするために受け取った大きなファイルを復元する必要があるためです(3800万行で、他の方法でエクスポートするには大きすぎるようです)。pgAdmin 4で「復元」しようとすると、次のメッセージが表示されます。 [設定]ダイアログでPostgreSQLバイナリパスを設定してください。 これは、PostgreSQLフォルダーへの単なるパスですか?PostgreSQLサイトでこれに関するドキュメントを見つけることができません。私が見つけることができるのは: バイナリパスノードのフィールドを使用して、PostgreSQLバイナリユーティリティおよびEnterpriseDB Postgres Advanced Serverバイナリユーティリティへのパスを指定します。 pgAdmin以外の方法でデータベースを復元する簡単な方法はありますか?

2
300,000行のテーブルで実行するのに11分かかるクエリを結合します
以下のクエリの実行には11分以上かかります。 SELECT `c`.*, `e`.`name` AS `employee_name`, `e`.`emp_no`, `d`.`code` AS `department_code`, IF(ew.code IS NOT NULL, ew.code, egw.code) AS shift_code, IF(ew.code IS NOT NULL, ew.time_in_from, egw.time_in_from) AS time_in_from, IF(ew.code IS NOT NULL, ew.time_out_to, egw.time_out_to) AS time_out_to, IF(ew.code IS NOT NULL, ew.next_day, egw.next_day) AS next_day FROM `tms_emp_badge_card` AS `c` LEFT JOIN `tms_door_record_raw` AS …

4
PostgreSQL 9.6の列の削除とCTEを使用したSQL関数への副作用
3列(A、B、Dなど)のテーブルがあり、新しい列を導入しなければならなかった場合、Dの現在の位置を置き換えるためにCと言います。次の方法を使用します。 CおよびD2として2つの新しい列を導入します。 Dの内容をD2にコピーします。 Dを削除します D2の名前をDに変更します。 新しい順序は、A、B、C、およびDです。 (これまでのところ)問題が発生しなかったため、これは正当な慣行だと思いました。 しかし、今日、同じテーブルでステートメントを実行する関数が次のエラーを返したときに問題に遭遇しました。 table row type and query-specified row type do not match そして次の詳細: Query provides a value for a dropped column at ordinal position 13 私はPostgreSQLを再起動して、こことここでVACUUM FULL提案されているように最後に関数を削除して再作成しようとしましたが、これらの解決策は機能しませんでした(システムテーブルが変更された状況に取り組むことを除いて)。 非常に小さなデータベースで作業する余裕があったので、エクスポートし、削除してから再インポートしました。これにより、機能に関する問題が修正されました。 ここに見られるように、システムテーブルを変更する(pg_attributeなどで手を汚す)ことによって、列の自然な順序をいじってはならないという事実を知っていました。 Postgresの列の自然な順序を変更することは可能ですか? 私の関数によってスローされたエラーから判断すると、私のメソッドで列の順序をシフトすることもまたノーであることがわかりました。誰が私がやっていることも間違っている理由についていくつかの光を当てることができますか? Postgresバージョンは9.6.0です。 関数は次のとおりです。 CREATE OR REPLACE FUNCTION "public"."__post_users" ("facebookid" text, "useremail" text, "username" text) …

7
エラーログの場所?
MySQLはログファイルを書き込みますか?はいの場合、そのパスは何ですか(ubuntu / Linuxの場合)?
15 mysql  log 

3
最も近い値を見つけるためにSQL Serverでクエリを作成する方法
私はテーブルに次の整数値があるとしましょう 32 11 15 123 55 54 23 43 44 44 56 23 OK、リストは続行できます。関係ありません。ここで、このテーブルにクエリを実行し、特定の数のを返しclosest recordsます。numer 32に最も近いレコードを10個返したいとしましょう。これを効率的に達成できますか? SQL Server 2014にあります。

2
非ASCII文字を確認する方法
VARCHARフィールドに非ASCII文字が含まれているかどうかを確認する最良の方法は何ですか? CHAR(1)スルーCHAR(31)とCHAR(127)スルーCHAR(255)。 使用PATINDEXしてみましたが、次の問題に遭遇しました。 低い範囲のチェックは正常に機能しました。 SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 私のデータには0x1Eのレコードが3つあり、3つすべてが返されました。 しかし、上の範囲だけをチェックすると: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 テーブル内のすべてのレコード(テーブルカウント170737および返されたカウント170735)に近い値を返します。この範囲の値がデータにないため、レコードが返されなかったはずです。

2
サブクエリを使用してSQLを削除する方法
次のコードは、テーブルから重複するレコードを削除するために開発者の1人によって追加されました。 DELETE SubQuery FROM ( SELECT ID ,FK1 ,FK2 ,CreatedDateTime ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber FROM Table ) AS SubQuery WHERE RowNumber > 1 コードをレビューするとき、私はそれが機能しないと仮定しましたが、テスト環境(SQL 2014)でテストするとそれが機能することがわかります! SQLはサブクエリを解決し、レコードを削除する方法をどのように知っていますかtable?

1
複数のインデックスが欠落している実行計画
「実際の実行プランを含める」でクエリを実行すると、プランは欠落しているインデックスも提案します。インデックスの詳細はMissingIndexes、XML 内のタグです。計画に複数のインデックスの提案が含まれている状況はありますか?さまざまなSQLクエリを試しましたが、2つ以上の欠落インデックスを生成するクエリを思い付くことができませんでした。

2
SQL Serverの新しいバージョンは不安定ですか?
データベースアーキテクトは、SQL Server 2014には2012年のパフォーマンスと安定性の利点がないため、2012年よりもSQL Server 2014の選択が適切ではないとクライアントに説明しました。私が読んだことはすべてこれと矛盾します。 アーロン・バートランド氏はまったく正反対であり、私がMSから読んだすべてのホワイトペーパーも同意しています。2014年は強化され、2012年に人々が抱えていたAGの問題のいくつかを解決しました。 2012年よりも2014年を選択した場合、見落としている大きな欠点はありますか?

2
SQL Serverシステムテーブルは最適化できますか?
多数のテーブルが作成および削除されるデータベースがいくつかあります。SQL Serverはシステムベーステーブルの内部メンテナンスを行っていないため、時間の経過とともに非常に断片化し、サイズが肥大化する可能性があります。これにより、バッファプールに不必要な圧力がかかり、データベース内のすべてのテーブルのサイズの計算などの操作のパフォーマンスにも悪影響が及びます。 これらのコア内部テーブルの断片化を最小限に抑えるための提案はありますか?明らかな解決策の1つは、非常に多くのテーブルの作成を回避する(またはtempdbですべての一時テーブルを作成する)ことですが、この質問の目的のために、アプリケーションには柔軟性がないとしましょう。 編集:さらなる研究により、この未回答の質問が示されてALTER INDEX...REORGANIZEいます。これは密接に関連しているように見え、何らかの形での手動メンテナンスがオプションである可能性があることを示しています。 初期調査 これらのテーブルに関するメタデータは、次で表示できますsys.dm_db_partition_stats。 -- The system base table that contains one row for every column in the system SELECT row_count, (reserved_page_count * 8 * 1024.0) / row_count AS bytes_per_row, reserved_page_count/128. AS space_mb FROM sys.dm_db_partition_stats WHERE object_id = OBJECT_ID('sys.syscolpars') AND index_id = 1 -- row_count: 15,600,859 -- …

3
トランザクションログバックアップのシリアルまたはパラレル?
SQL Server 2012 Standard Editionを使用しています。また、Ola Hallengrenのスクリプトを使用して、バックアップとメンテナンスを行うための簡単で柔軟なフレームワークを提供することもあります。 この質問は、オラのスクリプトに関するものではなく、ベストプラクティスに関するものです。究極の答えは「あなたの会社の要件に依存する」ことです。しかし、私は会社の要件について理解したことをどのように実現するのが最善かについて、コミュニティのアドバイスを求めています。 15分ごとにトランザクションログのバックアップを設定したい。このようにして、15分以内のデータが失われることを願っています。ALL_DATABASESを使用する1つのジョブをセットアップする必要がありますか?または、データベースごとに1つのジョブを設定し、それらをすべて並行して開始する方が良いでしょうか?私は、バックアップがシリアルで開始されるというオラのスクリプトの機能をどのように見ているかに基づいているので、私は尋ねます。シリアルの欠点は、連続する各バックアップが他のバックアップが完了するまで待機することです。これにより、バックアップ間の時間が長くなる可能性があります(15分以上)。さらに、1つのバックアップで障害が発生すると、他のバックアップが停止するのではないかと心配になります。そのようなことはしたくありません。他の人にバックアップを続けてほしい。 それでは、Olaのスクリプトがシリアルで実行され、失敗が連続したバックアップを停止するというのは本当ですか? そして、データベースごとに仕事をする方が良いでしょうか?またはすべてを行う単一のジョブですか?私の傾向は、別々の仕事に向かうことですが、SQL Server DBAの一般的な傾向を理解したいと思います。

3
EXISTSクエリがインデックスシークの代わりにインデックススキャンを行うのはなぜですか?
いくつかのクエリの最適化に取り組んでいます。 以下のクエリの場合、 SET STATISTICS IO ON; DECLARE @OrderStartDate DATETIME2 = '27 feb 2016'; DECLARE @OrderEndDate DATETIME2 = '28 feb 2016'; SELECT o.strBxOrderNo , o.sintOrderStatusID , o.sintOrderChannelID , o.sintOrderTypeID , o.sdtmOrdCreated , o.sintMarketID , o.strOrderKey , o.strOfferCode , o.strCurrencyCode , o.decBCShipFullPrice , o.decBCShipFinal , o.decBCShipTax , o.decBCTotalAmount , o.decWrittenTotalAmount , o.decBCWrittenTotalAmount …

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