タグ付けされた質問 「optimization」

データベースのコンテキストでは、最適化とは、クエリオプティマイザが効率的な物理実行プランを選択するプロセスを指します。

3
インデックスに対してDateAdd()によって制約されたビューの1行の推定を改善する方法
Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)の使用。 与えられたテーブルとインデックス: create table [User].[Session] ( SessionId int identity(1, 1) not null primary key CreatedUtc datetime2(7) not null default sysutcdatetime()) ) create nonclustered index [IX_User_Session_CreatedUtc] on [User].[Session]([CreatedUtc]) include (SessionId) 次の各クエリの実際の行は310万です。推定行はコメントとして表示されます。 これらのクエリがView内の別のクエリをフィードすると、1行の推定値のため、オプティマイザはループ結合を選択します。 親クエリの結合ヒントを上書きしたり、SPに頼ったりしないように、この基本レベルでの見積もりを改善するにはどうすればよいですか ハードコードされた日付を使用するとうまくいきます: select distinct SessionId from [User].Session -- 2.9M (great) where CreatedUtc > '04/08/2015' -- but …

2
タイムスタンプの範囲(1列)でのクエリの最適化
HerokuでPostgres 9.3を使用しています。 毎日多くの挿入と更新を行う100万件以上のレコードを含む「トラフィック」テーブルがあります。このテーブル全体でさまざまな時間範囲でSUM操作を実行する必要があります。これらの呼び出しには最大40秒かかる可能性があり、それを改善する方法に関する提案を聞きたいです。 このテーブルには次のインデックスが設定されています。 CREATE INDEX idx_traffic_partner_only ON traffic (dt_created) WHERE campaign_id IS NULL AND uuid_self <> uuid_partner; SELECTステートメントの例を次に示します。 SELECT SUM("clicks") AS clicks, SUM("impressions") AS impressions FROM "traffic" WHERE "uuid_self" != "uuid_partner" AND "campaign_id" is NULL AND "dt_created" >= 'Sun, 29 Mar 2015 00:00:00 +0000' AND "dt_created" <= 'Mon, 27 …

2
SQLサーバーテーブルの挿入パフォーマンスの最適化
設定 データウェアハウスでは、ファクトテーブルを20ディメンションに結合しています。ファクトテーブルには、3,200万行と30列があります。これは一時的なステージングテーブルなので、他のユーザーがテーブルを読み書きする必要はありません。ベーステーブルから10列、それぞれのディメンションから20列を選択します。ディメンションテーブルは小さい(3〜15.000行)。結合されるフィールドは、整数とnvarcharの両方です。SELECT ... INTOステートメントを使用しています。テーブルにインデックスはありません。 このクエリの実行速度は遅すぎるため、役に立ちません。 試してみたソリューション クエリの処理に時間がかかりすぎるため、次の解決策を試しました。 20の結合を5つのテーブルの4つの結合に分割します。ただし、クエリのパフォーマンスは低いままです。 外部キー列にインデックスを配置します。時間の大幅な短縮はありません。 結合条件のフィールドが整数であることを確認してください。パフォーマンスが25%向上しました。私が探しているものではありません。 select intoではなく、insert intoステートメントを使用します。データベースは単純復旧モードですが、ログファイルの増大によりパフォーマンスが低下します。 これらの調査結果から、コストの89%が表の挿入にあるという実際の実行計画を含めることにしました。その他のコストは、ファクトテーブルの8%のテーブルスキャンと、内部結合のハッシュマッチングの2%です。 ご質問 遅いテーブル挿入の考えられる理由は何ですか? 実行計画なしでこのボトルネックを特定する方法は何ですか? テーブル挿入のコストを削減するためにどのようなアクションを実行できますか?

2
COALESCE(…)でサブクエリの選択を最適化する
アプリケーション内から使用する大きなビューがあります。私はパフォーマンスの問題を絞り込んだと思いますが、それを修正する方法がわかりません。ビューの簡略版は次のようになります。 SELECT ISNULL(SEId + '-' + PEId, '0-0') AS Id, *, DATEADD(minute, Duration, EventTime) AS EventEndTime FROM ( SELECT se.SEId, pe.PEId, COALESCE(pe.StaffName, se.StaffName) AS StaffName, -- << Problem! COALESCE(pe.EventTime, se.EventTime) AS EventTime, COALESCE(pe.EventType, se.EventType) AS EventType, COALESCE(pe.Duration, se.Duration) AS Duration, COALESCE(pe.Data, se.Data) AS Data, COALESCE(pe.Field, se.Field) AS Field, pe.ThisThing, se.OtherThing …


1
MySQLでInnoDBテーブルを最適化する方法
私はMySQLで断片化されたテーブルのみを最適化する方法を調査しており、テーブルの最適化に関するこの投稿をレビューしました。基本的には、任意のテーブルについてinformation_schemaデータベースに対してクエリを実行し、それらのテーブルのみdata_free > 0に対するSQLステートメントを作成しますOPTIMIZE。このクエリを実行したところ、最適化のために148のテーブルが特定されました。識別されたすべてのテーブルはInnoDBテーブルです。結果の最適化SQLスクリプトを実行した後、元のスクリプトを再実行して断片化されたテーブルを識別し、最初のパスでまったく同じテーブルを返しました。 InnoDBテーブルとOPTIMIZEコマンドに関して競合する投稿を見ました。OPTIMIZEInnoDBテーブルでは機能せず、実行する必要があると言う人もいますALTER TABLE table_name ENGINE=INNODB。InnoDBテーブルに対して実行するときOPTIMIZEに実際にALTER TABLEコマンドを呼び出すという人もいます。そのことを念頭に置いて、ALTER TABLEフラグメント化されていると識別されたInnoDBテーブルの1つに対してコマンドを実行し(data_free > 0)、data_freeその後は変更されないことがわかりました。それはまだ0より大きいです。また、MySQLを再起動し、同じ結果を見つけるためだけにチェックしました。 これで、MySQL 5.5.29を実行しているサーバーがいくつか組織にあり、それらすべてに対してクエリを実行して、InnoDBテーブルを特定しましたがDATA_FREE=0 or NULL、何も返されませんでした。それらはすべてゼロより大きいです。 また、ゼロより大きいOPTIMIZEいくつかのMyISAMテーブルに対してコマンドを実行し、DATA_FREE後でそれがゼロであることを確認しました。 誰かがこれについて私にいくつかの光を当てることができますか?InnoDBテーブルから断片化を削除する適切な方法は何ですか?断片化されたInnoDBテーブルを特定する適切な方法は何ですか? ありがとう

2
JOINを使用してテーブルを効率的に更新する
世帯の詳細が記載されたテーブルと、その世帯に関連するすべての人物の詳細が記載されたテーブルがあります。世帯テーブルには、2つの列を使用して定義された主キーがあります- [tempId,n]。personテーブルには、3つの列を使用して定義された主キーがあります。[tempId,n,sporder] 主キーのクラスター化インデックスによって指示された並べ替えを使用して、各世帯[HHID]および各人の[PERID]レコードに一意のIDを生成しました(以下のスニペットはPERIDを生成するためのものです): ALTER TABLE dbo.persons ADD PERID INT IDENTITY CONSTRAINT [UQ dbo.persons HHID] UNIQUE; 今、私の次のステップは、各人を対応する世帯に関連付けることです。マップ[PERID]には[HHID]。2つのテーブル間の横断歩道は、2つの列に基づいています[tempId,n]。このため、次の内部結合ステートメントがあります。 UPDATE t1 SET t1.HHID = t2.HHID FROM dbo.persons AS t1 INNER JOIN dbo.households AS t2 ON t1.tempId = t2.tempId AND t1.n = t2.n; 私は合計で1928783世帯の記録と5239842人の記録を持っています。現在、実行時間は非常に長くなっています。 さて、私の質問: このクエリをさらに最適化することは可能ですか?より一般的には、結合クエリを最適化するための経験則は何ですか? より良い実行時間で私が望む結果を達成できる別のクエリ構造はありますか? 私がしている実行計画アップロード SQLPerformance.comに全体のスクリプトは、SQL Server 2008によって生成されたが

1
一時データ用のPostgreSQLの最適化
非常に揮発性の高いデータを保持する整数型の100〜300列のテーブルがいくつかあります。データセットは1つまたは2つの主キーでキー設定され、更新が発生すると、データセット全体が削除され、新しいデータが1つのトランザクションに挿入されます。データセットのサイズは通常数百行ですが、極端な場合には最大数千行になることがあります。更新は1秒に1回行われ、さまざまなキーのデータセットの更新は通常ばらばらであるため、テーブルの削除と再作成は実行できません。 そのような負荷を処理するようにPostgresをどのように調整しますか?違いがある場合は、最新かつ最高のバージョンを使用できます。


4
MySQLサブクエリが大幅にスローダウンしますが、独立して正常に動作します
クエリ1: select distinct email from mybigtable where account_id=345 0.1秒かかります クエリ2: Select count(*) as total from mybigtable where account_id=123 and email IN (<include all from above result>) 0.2秒かかります クエリ3: Select count(*) as total from mybigtable where account_id=123 and email IN (select distinct email from mybigtable where account_id=345) 22分かかり、90%が「準備中」の状態です。なぜこんなに時間がかかるのですか? テーブルはMySQL 5.0で3.2mil行のinnodbです

1
MySQLはテーブルごとに読み取り/書き込み
DBを最適化しています。本質的に私は私たちのデータベースで最も多く書かれ最も多く読まれたテーブルを見つけようとしています。その後、それらのテーブルを個別のドライブにシンボリックリンクします。 各テーブルのアクティビティを追跡する方法はありますか?以下のように、IOPS、テーブルごとの書き込み、読み取り?

2
挿入が多いInnoDBテーブルがCPUをすべて使用しない
パケットログデータベースを持っていますが、ほとんど照会されません。挿入時に高速である必要があります。ACIDコンプライアンスを維持したいので、InnoDBを使用しています。1つのパケットを失うだけでも、お客様に損害を与える可能性があるからです。パフォーマンス調整シナリオでは、複数のDB接続を介して1,000,000パケットをサーバーに送信します。しかし、my.cnfでどの設定を使用しても、12コアのシステムでmysqldプロセスが900%を超えるCPUを使用することはできません。(ボックスでは他に何も実行されていません。) 以下を設定しました innodb_file_per_table = 1 innodb_write_io_threads = 64 innodb_read_io_threads = 64 innodb_thread_concurrency = 0 MyISAMを使用すると、すべてのパケットを約6秒で書き込むことができます。しかし、InnoDBは約25必要です。MySQLに残りのシステムリソースを使用させ、より速く挿入できますか? 編集:これはテーブルのスキーマです: +-------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+-------+ | t | bigint(20) unsigned | YES | | NULL | | | a | char(1) | YES | …

4
MySQLで「列を表示」を高速化するにはどうすればよいですか?
私のアプリケーションは、特定のテーブルの「列の表示」の実行に依存しています。実行には約60ミリ秒かかりますが、他のすべてのクエリには1ミリ秒未満かかります。information_schema直接のクエリはさらに遅くなります。 データベースには約250のデータベースが含まれ、データベースごとに100から200のテーブル(合計で約2万テーブル)があります。 これらの操作が非常に遅い理由を知るにはどうすればよいですか? 実行を高速化したり、SQL側にキャッシュしたりするために変更できる設定はありますか? (アプリケーションは、ページの読み込みごとにこのようなクエリを約14回実行します。このレガシーコードをクリーンアップする必要があることは承知していますが、長期的な修正に取り組んでいる間、可能なオプションを探しています。)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.