問題タブ [sqlperformance]
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 - サブクエリを削除してクエリ速度を向上させる
このクエリの高速化を目指しています。現時点では、実行に20秒強かかりますが、これはひどいことです。
および JOIN 関数を使用してサブクエリを削除する方法が見つかりません。
SQL:
usersデータベース構造を理解するために、 用と用の 2 つのメイン テーブルがありますmanual。他のテーブルには追加のデータが保持され、ユーザーの ID とリンクされており、ユーザーがmanual属しているデータベースを確認するために呼び出される別のフィールドがあります。
私が抱えている問題は、他のテーブルに追加のデータがあるかどうかを示すために、そのユーザーのデータが必要なことです。JOIN 関数を使用してこれをテストしたところ、レコードは結果から完全に削除されました。
LEFT JOIN書き換えが必要なクエリの主要部分はsだと思います。私はこれと同じことをする方法を見つけることができません:LEFT JOIN orders ON users.id = orders.user AND orders.id = (SELECT MAX(id) FROM orders WHERE status = 3 AND user = users.id)
sql - SQL ビューで選択されていない列は実行されますか?
これに対する答えを検索するための適切なキーワードを思いつくことができなかったので、既に答えられていたら申し訳ありません。
次の SQL ビューを検討してください。
次のクエリを実行すると、サブクエリが実行されますか、それとも SQL Server がクエリを最適化しますか?
私はこれをパフォーマンスの観点から見ています。たとえば、ビューにかなりの数のサブクエリがある場合です (内部選択が大きなテーブルを参照している場合、集計には時間がかかる可能性があります)。
私は SQL Server 2008 R2 を使用していますが、答えが 2012 または MySQL で異なるかどうかを知りたいです。
ありがとう。
sql - TSQL - 小さなリストには IN (リスト) を使用するか、NOT IN (リスト) を使用する方が高速ですか?
私の列の 1 つは、4 つの可能な値 ( val1、val2、val3)のみを含むことができますval4。
WHEREこれらの 4 つの値 (つまり ) の 1 つを除外するには、句に追加のフィルターを追加する必要がありますval4。
使用するのが速くなるでしょうかNOT IN ('val4')、それともIN ('val1','val2','val3')?
mysql - FINd_IN_SET と IN 句の使用 MYSQL ストアド プロシージャ
以下のようなストアドプロシージャがあります
ここTagにIntegerコラムがあります。
コンマ区切りの値を文字列としてストアド プロシージャに渡すのにうんざりしましたが、機能しません。次に、以下のようなストアドプロシージャを使用しました
これは非常にうまく機能します。唯一の問題は、テーブルが非常に大きいことです。何百万もの行があり、FIND_IN_SET を使用すると、直接 SQL ステートメントを実行する場合に IN に比べて時間がかかりすぎます。
使用するのに最適なパフォーマンス最適化オプションは何ですか?
IDを整数に変換し、IN句の準備ができて解析できる分割関数はありますか? それが最良の選択肢になると思います。提案やアイデアはありますか?
sql - 時間間隔をクエリするときの SQL パフォーマンス
tickets関連する 3 つの列を含む 1 つのテーブルがあります: id、where 、startおよびare 。finishstartfinishtimestamps
intervals関連する列が 1 つだけの 2 番目のテーブル ( ) がありtime pointます。time_pointもtimestampです。time_point常に 15 分ごとです。この 2 番目のテーブルの内容は次のとおりです。
最初のテーブル (チケット) には 400 万件のレコードがあります。2 番目には 96 レコードしかありません (24 * 4)。
開いているチケットの数を選択する必要がありますtime_point
次のクエリを書きました: (簡易版)
これは機能しますが、遅すぎます。問題は、両方のテーブル間に実際の結合がなく、すべての行に対して完全なテーブル スキャンが実行されることです。
ここでパフォーマンスを向上させるにはどうすればよいですか?
ありがとう!
編集: これは Oracle DB です。
sql-server-2008 - 相関更新の最適化
次のクエリのパフォーマンスを向上させるにはどうすればよいですか:
tもっている:
- recent_5_min - money null -もちろん null 可能です。これはジョブによってのみ入力されるためです。
- value - お金、null 以外
- 日付 - int、クラスター化されたインデックスを持つ PK。これは、テーブルの唯一のインデックスです。
t900K のレコードがあり、統計は最新であり、クエリの実行には時間がかかります。
更新 1 - 最初に投稿したクエリによって生成されたサンプル データ。
前:
後:
c# - SQL Server の挿入が遅い - SqlBulkCopy のパフォーマンス
3,000 万行のデータベースがあります。PK クラスター化インデックスは、生成されたコードGUIDです。
表は次のとおりです。
簡単に言えば、画像検索エンジンです。
imageEventGUIDはコード固有の識別子です。imageSHAID画像 URL の SHA256 です。queryGUIDコードで生成された FK です (簡潔にするために create ステートメントから除外されます)。eventTypeイベントの種類に割り当てられた番号ですeventValue通常、画像の URI です。たとえば、" http://mywebpage.com/images/image123456789.jpg "です。
かなり標準的なコードを使用して、定期的に via SqlBulkCopy(from a ) をこのテーブルに挿入します。DataTable
通常、1 回の一括挿入で 5k から 10k 行を挿入しようとしています。この一括コピーの挿入結果がひどいです。私はこの DB を SSD (SATA 1 のみが接続されている) で実行していましたが、非常に高速でした (500 ミリ秒未満)。SSD の空き容量がなくなったので、DB を 1TB 7200 キャッシュ回転ディスクに交換しました。完了時間が 120 秒 (120000 MS) を超えているためです。一括挿入が実行されているとき、約 1MB/秒のディスク アクティビティが見られ、CPU 使用率が低いことがわかります。
このテーブルには、PK 以外のインデックスはありません。
あなたへの私の質問は次のとおりです。
これを引き起こす原因となる、私が間違っていることは明らかですか?
「あなたの回転するディスクは、このサイズのDBには十分な速度ではありません」という単なるケースですか?
このデータの挿入で正確に何が起こっているのでしょうか? クラスター化されたインデックスであるため、挿入時にディスク上のデータ ページを再配置しますか? 本質的に順序付けされていない GUID を挿入しようとしているため、この「ランダムな挿入の性質」により、読み取り/書き込みヘッダーがディスク上の別のページに頻繁に移動する可能性がありますか?
御時間ありがとうございます。
sql - SQL Server : MERGE のパフォーマンス
500 万行のデータベース テーブルがあります。クラスター化インデックスは自動インクリメント ID 列です。PK は、URL の SHA256 ハッシュである 256 バイトVARCHARで生成されたコードです。これは、テーブルの非クラスター化インデックスです。
表は次のとおりです。
imageSHAID" http://blah.com/image1.jpg " などの画像 URL の SHA256 ハッシュで、長さ 256 の varchar にハッシュされます。imageGUID画像を識別するコード生成された GUID です (後でインデックスとして使用されますが、今のところ、この列をインデックスとして省略しています)imageURL画像の完全な URL です (最大 2000 文字)showCountは、画像が表示される回数です。これは、この特定の画像が表示されるたびに増加します。imageURLIndexは 450 文字に制限された計算列です。これにより、必要に応じて imageURL でテキスト検索を実行できます。インデックス化可能です (ここでも簡潔にするためにインデックスは省略されています)。autoIncIDはクラスター化インデックスであり、データの挿入を高速化する必要があります。
定期的に、一時テーブルからテーブルにマージしstore_imageます。一時テーブルの構造は次のとおりです (store_image テーブルと非常によく似ています)。
マージ プロセスが実行DataTableされると、次のコードを使用して一時テーブルに a を書き込みます。
次に、merge コマンドを実行して、に基づいて一時テーブルからマージすることによりshowCount、テーブル内のを更新します。画像が現在テーブルに存在しない場合は、作成します。store_imageimageSHAIDstore_image
私は通常、store_image1 つのマージ プロセスで一時テーブルからテーブルに 2,000 ~ 5,000 行をマージしようとしています。
私はこの DB を SSD (SATA 1 のみが接続されている) で実行していましたが、非常に高速でした (200 ミリ秒未満)。SSD の空き容量がなくなったので、DB を 1 TB 7200 キャッシュ回転ディスクに交換しました。これは、完了時間が 6 ~ 100 秒 (6000 ~ 100000MS) を超えているためです。一括挿入の実行中は、ディスク アクティビティが約 1MB ~ 2MB/秒で、CPU 使用率が低いことがわかります。
これは、この量のデータの典型的な書き込み時間ですか? 少し遅いように思えますが、パフォーマンスが遅い原因は何ですか? 確かimageSHAIDにインデックス化されているので、これよりも速いシーク時間が期待できるでしょうか?
どんな助けでも大歓迎です。
御時間ありがとうございます。