ホームページ  >  記事  >  ウェブフロントエンド  >  SQLクエリが遅い?このテクニックでアプリのパフォーマンスを向上させる

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

DDD
DDDオリジナル
2024-09-25 06:30:32179ブラウズ

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 関数を使用して、クエリ結果をより小さな部分に分割します。
  • 並列処理: 同時タスクを処理するアプリの機能を利用して、これらの小さなクエリを並列実行します。

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

重要な考慮事項

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

以上がSQLクエリが遅い?このテクニックでアプリのパフォーマンスを向上させるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。