問題タブ [database-performance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - 各 N の最新レコードに対する最適な実行クエリ
これが私がいるシナリオです。
最新のレコードを照会する必要があるかなり大きなテーブルがあります。クエリの必須列の作成は次のとおりです。
ID 列は主キーであり、VehicleID と TimeStamp にはクラスター化されていないインデックスがあります
クエリを最適化するために取り組んでいるテーブルは 2,300 万行を少し超えており、クエリの操作に必要なサイズの 10 分の 1 にすぎません。
VehicleID ごとに最新の行を返す必要があります。
ここ StackOverflow でこの質問への回答を調べてきました。かなりの量のグーグルを実行しましたが、SQL Server 2005 以降でこれを行う一般的な方法が 3 つまたは 4 つあるようです。
これまでのところ、私が見つけた最速の方法は次のクエリです。
テーブル内の現在のデータ量では、実行に約 6 秒かかります。これは妥当な制限内ですが、ライブ環境でテーブルに含まれるデータ量では、クエリの実行が遅すぎます。
実行計画を見ると、SQL Server が行を返すために何をしているのかが気になります。
レピュテーションが十分に高くないため、実行計画の画像を投稿できませんが、インデックス スキャンがテーブル内のすべての行を解析しているため、クエリの速度が大幅に低下しています。
次のように SQL 2005 Partition メソッドを使用するなど、いくつかの異なる方法でクエリを書き直そうとしました。
しかし、そのクエリのパフォーマンスはさらに大幅に低下します。
このようにクエリを再構築しようとしましたが、結果の速度とクエリ実行計画はほぼ同じです。
テーブル構造に関してある程度の柔軟性を利用できるので (程度は限られていますが)、インデックス、インデックス付きビューなどを追加したり、データベースに追加のテーブルを追加したりできます。
ここで何か助けていただければ幸いです。
編集実行計画の画像へのリンクを追加しました。
c# - linq、外部キー関係、またはローカル リストを使用して最速のモデルはどれですか?
いくつかの基本
2 つのテーブルがあり、1 つはユーザーを保持し、もう 1 つはログインのログを保持しています。ユーザー テーブルには 15000 人以上のユーザーが保持され、ログイン テーブルは成長しており、150000 件以上の投稿に達しています。データベースは SQL Server 上に構築されています (Express ではありません)。
ユーザーを管理するために、ObjectDatasource から入力するグリッドビュー (Devexpress の ASPxGridView) を取得しました。
ユーザーが行ったログインの数を要約するときに知っておくべき一般的な注意事項はありますか?
物事は奇妙に遅くなっています。
関連するテーブルを示す図を次に示します。
私はいくつかのことを試しました。
実行時間: 01:29.316 (1 分 29 秒)
実行時間: 01:18.410 (1 分 18 秒)
実行時間: 01:15.821 (1 分 15 秒)
最高のパフォーマンスを発揮するモデルは、実際には辞書です。ただし、そのような大量のデータを処理するときにこの種のコーディングに「悪い」ものがある場合も、それについて聞きたいオプションがあれば知っています。
ありがとう
================================================== ======
更新 BrokenGlass の例によるモデルを使用
実行時間: 02:01.135 (2 分 1 秒)
これに加えて、単純なクラスを格納するリストを作成しました
そしてまとめ方では
実行時間: 00:36.841 (36 秒)
これまでの結論、linq での要約は遅いですが、私はそこに着きました!
database - YouTubeの視聴回数について
投稿が表示された回数を追跡するアプリを実装しています。しかし、私は追跡するための「スマートな」方法を維持したいと思います。つまり、ユーザーがブラウザーを更新したからといって、ビューカウンターを増やしたくないということです。
そのため、IPとユーザーエージェント(ブラウザー)が一意である場合にのみ、ビューカウンターを増やすことにしました。これは今のところ機能しています。
しかし、それから私は思った。Youtubeの場合、この方法でそれを行っており、数千または数百万の再生回数を持ついくつかのビデオがあります。これは、データベース内のビューテーブルにIPとユーザーエージェントが過剰に入力されることを意味します。
これは、彼らのビデオテーブルがビュー用のカウンターキャッシュを持っているという仮定に私をもたらします(すなわちviews_count
)。これは、ユーザーがビデオをクリックすると、IPとユーザーエージェントが保存されることを意味します。さらに、ビデオテーブルのカウンターキャッシュ列が増加します。
ビデオがクリックされるたび。Youtubeは、ビューテーブルをクエリし、エントリの数をカウントする必要があります。これはパフォーマンスに大きく影響しませんか?
これは彼らがそれを行う方法ですか?それとももっと良い方法はありますか?
database - ビットマップ インデックス操作の CPU バウンドが高いのはなぜですか?
ビットマップ インデックス操作で CPU バウンドが高くなるというトレードオフがあるのはなぜですか?
sql-server - 検索操作のパフォーマンスを解決するための最適な戦略 - SQL Server 2008
人気が高まっているモバイル Web サイトに取り組んでおり、これによりいくつかの主要なデータベース テーブルが増加しています。これらのテーブルにアクセスする際にパフォーマンスの問題が発生し始めています。私たちはデータベースの専門家ではありません (また、この段階で誰かを雇うお金もありません)、パフォーマンスの問題の原因を理解するのに苦労しています。私たちのテーブルはそれほど大きくないので、SQL Server はそれらをうまく処理できるはずであり、クエリの最適化に関して知っていることはすべて実行しました。したがって、(疑似)テーブル構造は次のとおりです。
これらの行数は大幅に増加すると予想されます (特に、user、content_group、および content テーブル)。はい、ユーザー テーブルにはかなりの数の列があります。他のテーブルに移動できるいくつかの列を特定しました。また、影響を受けるテーブルに適用した一連のインデックスも役に立ちました。
大きなパフォーマンスの問題は、ユーザーの検索に使用しているストアド プロシージャです (これには、content_group_id フィールドでのコンテンツ テーブルへの結合が含まれます)。WHERE
さまざまなアプローチを使用してand句を変更しようとしましたがAND
、できる限り良いものになったと思いますが、それでもまだ遅すぎます。
私たちが試したもう 1 つのことは、ユーザー テーブルとコンテンツ テーブルにインデックス付きビューを配置することでした。これを行ってもパフォーマンスが大幅に向上することはなかったので、ビュー レイヤーを使用することで複雑さが増すため、このアイデアを放棄しました。
それで、私たちの選択肢は何ですか?いくつか考えられますが、すべて長所と短所があります。
テーブル構造の非正規化
ユーザー テーブルとコンテンツ テーブルの間に複数の直接外部キー制約を追加します。これにより、コンテンツ サブタイプごとに異なる外部キーがコンテンツ テーブルに存在します。
長所:
- 主キーを使用すると、コンテンツ テーブルへの結合がより最適になります。
短所:
- 既存のストアド プロシージャと Web サイト コードに多くの変更が加えられます。
- 最大 8 つの追加の外部キー (より現実的には 2 つだけを使用します) を維持することは、現在の単一のキーほど簡単ではありません。
テーブル構造のさらなる非正規化
必要なフィールドをコンテンツ テーブルからユーザー テーブルに直接複製するだけです。
長所:
- コンテンツ テーブルへの結合が不要になり、SQL の作業が大幅に削減されます。
短所
- 上記と同じ: ユーザー テーブルで維持する追加フィールド、SQL および Web サイト コードの変更。
中間層のインデックス レイヤーを作成する
Lucene.NET などを使用して、データベースの上にインデックス レイヤーを配置します。これにより、理論的にはすべての検索のパフォーマンスが向上し、同時にサーバーの負荷が軽減されます。
長所:
- これは良い長期的な解決策です。Lucene は、検索エンジンのパフォーマンスを向上させるために存在します。
短所:
- 短期的にははるかに大きな開発コストが発生します。この問題を早急に解決する必要があります。
以上が私たちが思いついたことであり、現段階では 2 番目のオプションが最適であると考えています。私たちはその費用を支払う用意があります。
私たちのために働くかもしれない他のアプローチはありますか?上記で概説したアプローチに、私たちの決定に影響を与える可能性のある追加の長所や短所はありますか?
sql - SQL INNER JOINテーブル変数ON VS。INNER JOIN(セレクト)ON
テーブル変数を使用する方が、内部結合 (選択) を使用するよりも多かれ少なかれパフォーマンスが高いかどうか疑問に思っています
例:
大規模なクエリの場合、同じ結合を数回行う必要がある場合、最初の結合の方が維持しやすいですが、最もパフォーマンスが高いのはどれでしょうか?
ご挨拶
php - PHP または MySQL での優先度の低いリクエスト
私はサイトと 500 万行のデータベースを持っていますが、それは魅力的に機能しています。ただし、古いデータを「ログ」テーブルに配置して古いデータを削除するために、1 時間ごとにクリーンアップ cron ジョブを実行しています。この間、サーバーの応答は非常に遅くなります。PHP または MySQL を介してそのジョブの優先度を下げることは可能ですか?
sql - Oracle SQL Join でパフォーマンスを向上させる方法
状況は、10 を超える異なるテーブルに参加する必要があることです。SQL では、同じテーブルに 5 回参加しています。クエリは次のようになります。
この Tab10 が 5 回結合されている理由は、パラメーターに基づいて異なる値を取得するためです。Tab10 結合をより良い方法で書き直すことは可能ですか? また、このTab10の参加により、パフォーマンスが悪いことに気付きました。
mysql - インデックスが期待どおりに使用されていない日時フィールドの最適化
MySQL 5.0.77 で実行されているアプリケーションに、大きくて急速に成長しているログ テーブルがあります。メッセージの種類に応じて、過去 X 日間のインスタンスをカウントするクエリを最適化する最善の方法を見つけようとしています。
このテスト セットでは、テーブルに 668521 行あります。最適化しようとしているクエリは次のとおりです。
現在、そのクエリには 3 ~ 5 秒かかり、次のように見積もられています。
created_at インデックスを削除すると、次のようになります。
(はい、何らかの理由で、行の見積もりがテーブル内の行数よりも大きくなっています。)
したがって、明らかに、そのインデックスには意味がありません。
これを行うより良い方法は本当にありませんか?列をタイムスタンプとして試しましたが、遅くなりました。
編集:特定の日付の代わりに間隔を使用するようにクエリを変更すると、最終的にインデックスが使用され、行の見積もりが上記のクエリの約 20% に削減されることがわかりました。
なぜそうなったのかは完全にはわかりませんが、それを理解すれば、問題は一般的にもっと理にかなっているだろうと確信しています.
mysql - 複雑な結合のMYSQL EXPLAIN出力を解読するのに助けが必要です
私のサイトのホームページには、次のような複雑なクエリがあります。
正確な詳細については説明しませんが、簡単に説明します。基本的に、これはシステム内で発生したイベントのリストであり、ストリームのようなものです。イベントにはいくつかのタイプがあり、そのタイプに基づいて、さまざまなテーブルから特定のデータを結合する必要があります。
現在、このクエリの実行には 2 秒かかりますが、エントリの量が増えるにつれて時間の経過とともに遅くなります。したがって、私はそれを最適化しようとしています。MYSQL Explain の出力は次のとおりです。
EXPLAIN についての私の理解は、これを理解するにはあまりにも限られています。このクエリを (非正規化するのではなく) そのままにしておくことをお勧めしますが、適切なインデックスまたはその他のクイック ウィンを使用してパフォーマンスを向上させます。この説明の出力に基づいて、フォローアップできるものはありますか?
編集:ここで要求されたように、カルマログテーブルの定義: