「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > SQLクエリが遅い?このテクニックでアプリのパフォーマンスを向上させる

SQLクエリが遅い?このテクニックでアプリのパフォーマンスを向上させる

2024 年 11 月 6 日に公開
ブラウズ:709

Slow SQL Queries? Boost Your App

挑戦

私のアプリ (React Spring Boot Oracle) では、大規模なデータセットを処理すると、処理時間がイライラするほど遅くなりました。精度や完全性を損なうことなくパフォーマンスを向上させるソリューションが必要でした。

解決策: NTILE 並列処理

NTILE は、結果セットを指定された数のほぼ同じサイズのチャンク (「タイル」と呼ばれる) に分割するように設計された強力な SQL ウィンドウ関数です。各行には、順序付きセット内の位置に基づいてパーティション番号が割り当てられます。

NTILE を使用することで、クエリ結果を管理可能なチャンクに分割し、これらのパーティションを並列処理しました。このアプローチにより、データのフェッチと処理を同時に行うことができ、待ち時間が大幅に短縮されました。

これを実装する方法の実際的な例を次に示します:

WITH PartitionedSales AS (
    SELECT 
        sales_id,
        sales_amount,
        sales_date,
        NTILE(2) OVER (ORDER BY sales_id) AS partition_number -- Assigns a partition number (1 or 2) to each row
    FROM 
        sales
    WHERE 
        sales_date BETWEEN '2023-01-01' AND '2023-12-31'
)
SELECT * 
FROM PartitionedSales
WHERE partition_number = :partitionNumber -- Replace :partitionNumber with the actual partition number (1 or 2)

上記の SQL スニペットでは:

  • NTILE(2) は、データを 2 つの等しいチャンクに分割し、sales_id に基づいて並べ替えます。
  • 対応するパーティションからデータをフェッチするには、:partitionNumber を 1 または 2 に置き換えます。

フロントエンドでは、並列処理を使用して各パーティションを効率的にフェッチできます:

async function fetchPartition(partitionNumber) {
    const response = await fetch('/api/sales?partition='   partitionNumber});
    return response.json();
}

async function fetchData() {
    try {
        const [partition1, partition2] = await Promise.all([
            fetchPartition(1), // Fetch the first partition
            fetchPartition(2)  // Fetch the second partition
        ]);

        // Combine and process results
        const combinedResults = [...partition1, ...partition2];
        processResults(combinedResults);
    } catch (error) {
        console.error('Error fetching data:', error);
    }
}

このコード内:

  • fetchPartition は、特定のパーティションのデータを取得します。
  • fetchData は両方のフェッチ操作を並行して実行し、結合された結果を処理します。

あなたにもできる方法

  • 重いクエリを特定する: アプリの速度を低下させているクエリを見つけます。
  • NTILE の適用: NTILE 関数を使用して、クエリ結果をより小さな部分に分割します。
  • 並列処理: 同時タスクを処理するアプリの機能を活用して、これらの小さなクエリを並列実行します。

データ量の多いアプリケーションのパフォーマンスを向上させたい場合は、この方法を試してみてください。これは、クエリの実行時間を長くするのではなく、よりハードに実行するための賢明で効果的な方法です。

重要な考慮事項

同時リクエストを処理する場合、データベース接続の需要が大きくなる可能性があります。この接続の多用によりデータベースに負担がかかり、パフォーマンスのボトルネックが発生する可能性があります。データベースの応答性を維持し、効率的に実行できるようにするには、同時リクエストの数を監視および管理することが不可欠です。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/ritesh_rungta_e849b30e0b6/slow-sql-queries-boost-your-apps-performance-with-this-technique-3gnp?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3