問題タブ [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 。finish
start
finish
timestamps
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。これは、テーブルの唯一のインデックスです。
t
900K のレコードがあり、統計は最新であり、クエリの実行には時間がかかります。
更新 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_image
imageSHAID
store_image
私は通常、store_image
1 つのマージ プロセスで一時テーブルからテーブルに 2,000 ~ 5,000 行をマージしようとしています。
私はこの DB を SSD (SATA 1 のみが接続されている) で実行していましたが、非常に高速でした (200 ミリ秒未満)。SSD の空き容量がなくなったので、DB を 1 TB 7200 キャッシュ回転ディスクに交換しました。これは、完了時間が 6 ~ 100 秒 (6000 ~ 100000MS) を超えているためです。一括挿入の実行中は、ディスク アクティビティが約 1MB ~ 2MB/秒で、CPU 使用率が低いことがわかります。
これは、この量のデータの典型的な書き込み時間ですか? 少し遅いように思えますが、パフォーマンスが遅い原因は何ですか? 確かimageSHAID
にインデックス化されているので、これよりも速いシーク時間が期待できるでしょうか?
どんな助けでも大歓迎です。
御時間ありがとうございます。