データベース管理者

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

10
SQL Serverで発生するパフォーマンスの上位3つの問題は何ですか?
私はアイントホーフェンのフォンティス大学の学生です。現在、SQL Serverツールの開発を支援するために一連のインタビューを実施しています。この分野の専門家からフィードバックをもらいたいと思います。 私の質問の1つは次のとおりです。 SQL Serverインスタンスで発生する上位3つのパフォーマンスの問題と、それらの問題の特定方法を教えてください。 特に、これを測定するために使用されるスクリプトとツールに興味があります。

3
.my.cnf設定が機能しないのはなぜですか?
デスクトップのホームディレクトリに.my.cnfファイルがあります。 [dbid] user = myusername password = mypassword database = dbname host = server.location.com 正しく思い出すと、Ubuntu 10.04から11.04にアップグレードする前に、次のコマンドを使用できました。 mysql dbid データベースに直接接続するには しかし、今日私はこのエラーを受け取ります: ERROR 1049 (42000): Unknown database 'dbname' 私は何か間違ったことをした?


3
MyISAMからInnoDBへの変換の高速化
私は4GBを占有する約450のテーブルのデータベースを持つmysql 5.1サーバーを持っています。これらのテーブルの大部分(2つを除くすべて)はMyIsamです。ほとんどの場合これで問題ありません(トランザクションは必要ありません)が、アプリケーションはトラフィックを獲得しており、更新時のテーブルロックにより特定のテーブルが影響を受けています。これが、テーブルの2つがInnoDBになった理由です。 小さなテーブル(10万行)での変換にはまったく時間がかからず、ダウンタイムが最小限に抑えられます。ただし、追跡テーブルのいくつかは5,000万行に近づいています。ALTER TABLE...ENGINE InnoDB大きなテーブルでを高速化する方法はありますか?そうでない場合、これらの書き込みが多いテーブルでダウンタイムを最小限に抑える変換方法はありますか?

1
datetime2(0)vs datetime2(2)
ドキュメントdatetime2(Transact-SQL)によると: ストレージサイズは 、精度が3未満の場合は6バイトです。 精度3および4の 場合は7バイトです。他のすべての精度には8バイトが必要です。 大きさはdatetime2(0)、datetime2(1)、datetime2(2)ストレージの同量(6バイト)を使用します。 datetime2(2)サイズコストを追加せずに精度の利点を享受することもできると言って正しいでしょうか? ご注意ください: この列はPKでインデックス付けされ、複合クラスター化インデックスを形成します(テーブルパーティションに使用) ミリ秒は気にしません うdatetime2(0)where句で使用された場合、より多くのCPU効率的であること、またはインデックスを通じて追求するとき? これは巨大なテーブルなので、最小の最適化で大きな違いが生じます。

2
SELECT TOPでインデックスが使用されないのはなぜですか?
要約は次のとおりです。選択クエリを実行しています。WHEREand ORDER BY句のすべての列IX_MachineryId_DateRecordedは、キーの一部として、またはINCLUDE列として、単一の非クラスター化インデックスに含まれます。すべての列を選択しているので、ブックマークルックアップTOP (1)になりますが、を取得するだけなので、サーバーはルックアップを最後に一度だけ実行する必要があることを確認できます。 最も重要なことは、クエリでindexを使用するように強制するとIX_MachineryId_DateRecorded、1秒未満で実行されることです。使用するインデックスをサーバーに決定させると、サーバーが選択しIX_MachineryId、最大1分かかります。これは、私がインデックスを正しく作成したことを本当に示唆しており、サーバーは単に悪い判断を下しています。どうして? CREATE TABLE [dbo].[MachineryReading] ( [Id] INT IDENTITY (1, 1) NOT NULL, [Location] [sys].[geometry] NULL, [Latitude] FLOAT (53) NOT NULL, [Longitude] FLOAT (53) NOT NULL, [Altitude] FLOAT (53) NULL, [Odometer] INT NULL, [Speed] FLOAT (53) NULL, [BatteryLevel] INT NULL, [PinFlags] BIGINT NOT NULL, [DateRecorded] DATETIME NOT …

2
MySQL-行のカウントにcount(*)とinformation_schema.tablesを使用することの違い
数百万行のテーブル内の行数をすばやくカウントする方法が必要です。Stack Overflowで「MySQL:行数をカウントする最も速い方法」という投稿を見つけました。これは私の問題を解決するように見えました。バユアはこの答えを提供しました: SELECT table_rows "Rows Count" FROM information_schema.tables WHERE table_name="Table_Name" AND table_schema="Database_Name"; スキャンの代わりにルックアップのように見えるので私は好きでしたので、高速でなければなりませんが、テストすることにしました SELECT COUNT(*) FROM table パフォーマンスの違いがどれほどあったかを確認します。 残念ながら、以下に示すように異なる回答が得られます。 質問 回答が約200万行異なるのはなぜですか?全表スキャンを実行するクエリの方が正確な数値であると推測していますが、この遅いクエリを実行せずに正しい数値を取得する方法はありますか? 実行ANALYZE TABLE data_302しましたが、0.05秒で完了しました。クエリを再度実行すると、34384599行という非常に近い結果が得られますが、それでもselect count(*)34906061行と同じ数ではありません。分析テーブルはすぐに戻り、バックグラウンドで処理されますか?これはテストデータベースであり、現在は作成されていないことに言及する価値があると思います。 テーブルがどれだけ大きいかを誰かに伝えるだけの場合は誰も気にしませんが、その数字を使用してデータベースを照会する「同じサイズの」非同期クエリを作成するコードに行カウントを渡したいと思いました。並行して、「Alexander Rubinによるパラレルクエリの実行によるクエリパフォーマンスの低下」で示した方法に似ています。現状では、最高のIDを取得するだけでSELECT id from table_name order by id DESC limit 1、テーブルが断片化しすぎないように願っています。
15 mysql  mysql-5.6  count 

1
varchar(n)のオーバーヘッドは何ですか?
型に関するPostgres docからこのフラグメントの意味を尋ねたいと思いましたvarchar(n)。 短い文字列(最大126バイト)のストレージ要件は、1バイトに実際の文字列を加えたもので、文字の場合はスペースの埋め込みが含まれます。長い文字列には、1ではなく4バイトのオーバーヘッドがあります。 私にはvarchar(255)フィールドがあると仮定しましょう。そして今、次のステートメント: このフィールドが10バイトの文字列を保持する場合、オーバーヘッドは1バイトです。したがって、文字列は11バイトを使用します。 フィールドに140バイトを使用した文字列が含まれている場合、オーバーヘッドは4バイトです。したがって、文字列は144バイトを使用します。 上記のステートメントは真実ですか?ここで誰かが私と同じようにドキュメントを理解していますが、ここでは誰かがオーバーヘッドが常に4バイトであると述べていますか?

1
インデックスは `= any()`では使用されず、 `in`で使用されます
テーブルにtは2つのインデックスがあります。 create table t (a int, b int); create type int_pair as (a int, b int); create index t_row_idx on t (((a,b)::int_pair)); create index t_a_b_idx on t (a,b); insert into t (a,b) select i, i from generate_series(1, 100000) g(i) ; any演算子ではインデックスは使用されません。 explain analyze select * from t where (a,b) = …

3
MySQL InnoDB page_cleaner設定は最適ではない可能性があります
mysqld.logでこのメモを確認します。 [Note] InnoDB: page_cleaner: 1000ms intended loop took 15888ms. The settings might not be optimal. (flushed=200 and evicted=0, during the time.) このようなことについてここで言及されているようです: 「同期インデックスを実行中」のMySQLインスタンスのストール 私の質問は、このメモがログに記録された場合、どのようなアクションが実行されるべきかということです。 MySQLおよびOSバージョン: mysql-community- server- 5.7.9 -1.el7.x86_64 centos-release-7-1.1503.el7.centos.2.8.x86_64 実行SHOW変数は「%InnoDBの」のような。提案されているように: innodb_page_cleaners | 1

2
変更の記録を保持するデータベースとテーブルを設計する最良の方法は?
以前の変更を追跡するために、プロジェクトに履歴機能を設定する必要があります。 今、2つのテーブルがあるとします。 NOTES TABLE (id, userid, submissionid, message) SUBMISSIONS TABLE (id, name, userid, filepath) 例:ノートに行があり、ユーザーがメッセージを変更したい。変更前と変更後の状態を追跡したい。 これらの各テーブルに列を設定する最善の方法は、アイテムが「古い」かどうかを示すことです。0アクティブであればOR削除/不可視の場合は1。 また、以前の状態、新しい状態、これらのIDが関連するAUDIT TRAILテーブルを保持する履歴()テーブルを作成したいのですが。idid

2
ビューでNOT NULL計算列がNULL可能と見なされるのはなぜですか?
私はテーブルを持っています: CREATE TABLE [dbo].[Realty]( [Id] [int] IDENTITY(1,1) NOT NULL, [RankingBonus] [int] NOT NULL, [Ranking] AS ([Id]+[RankingBonus]) PERSISTED NOT NULL .... ) そしてビュー: CREATE View [dbo].[FilteredRealty] AS SELECT realty.Id as realtyId, ... COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X, COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y, realty.Ranking, ... FROM realty JOIN Category ON realty.CategoryId = …

1
日付範囲の一意性制約
pricesこれらの列を持つテーブルを考えてみましょう。 id integer primary key product_id integer -- foreign key start_date date not null end_date date not null quantity integer price numeric データベースには、日付範囲内の特定の数量で1つの価格しか持てないというルールを適用したいのですが(を介してwhere <date> BETWEEN start_date AND end_date)。 この種の範囲ベースの制約は実行可能ですか?

2
SQLエージェントジョブの詳細な出力を取得する
サーバー上のすべてのデータベースのインデックスを再作成するメンテナンスプランを実行するSQL Serverエージェントジョブがあります。最近、これは失敗しましたが、ジョブ履歴は問題を診断するのに十分な情報を提供していません。 ジョブ履歴に「ジョブが失敗しました」と表示されます。ジョブはユーザーfoo \ barによって呼び出されました。実行する最後のステップはステップ1(インデックスの再構築)でした。 詳細ウィンドウには、次の形式の複数のメッセージがあります。 Executing query "ALTER INDEX [something] ON [a...".: 0% complete End Progress Progress: 2015-03-15 22:51:23.67 Source: Rebuild Index Task 実行中のSQLステートメントは切り捨てられており、ステートメントの出力も切り捨てられているため、どの特定のステートメントが失敗したのか、その理由を特定できないと思います。これらのメッセージの全文を抽出する方法はありますか?

4
pg_dumpで拡張機能をスキップするにはどうすればよいですか?
これは9.3にありますが、7.x以降に発生した同様のことを覚えています。そこで、データベースを作成し、plpgsql拡張機能をインストールします。後でpg_dumpを作成し、それをデータベースに復元する前に、plpgsql拡張機能も持っていることを確認します。次に、これを復元するときに発生します: pg_restore: creating EXTENSION plpgsql pg_restore: creating COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql …

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