0

私はWebベースのストアアプリケーションを構築しており、相互にネストされた多くのサブカテゴリを処理する必要があります。重要なのは、スクリプトが数千を処理するかどうかわからないことです(新しいシステムが古いシステムに置き換わるため、予想されるトラフィックを把握しています)。現在、ローカルサーバーからの応答の遅れは1〜2です。他のページよりも数秒多く、さまざまなカテゴリに約30の製品が追加されています。

私のコードは次のとおりです。

    BazaArkadiaDataContext db = new BazaArkadiaDataContext();
    List<A_Kategorie> Podkategorie = new List<A_Kategorie>();

    public int IdKat { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            List<A_Produkty> Produkty = new List<A_Produkty>(); //list of all products within the category and remaining subcategories

            if (Page.RouteData.Values["IdKategorii"] != null)
            {
                string tmpkat = Page.RouteData.Values["IdKategorii"].ToString();
                int index = tmpkat.IndexOf("-");
                if (index > 0)
                    tmpkat = tmpkat.Substring(0, index);
                IdKat = db.A_Kategories.Where(k => k.ID == Convert.ToInt32(tmpkat)).Select(k => k.IDAllegro).FirstOrDefault();
            }
            else
                return;

            PobierzPodkategorie(IdKat);

            foreach (var item in Podkategorie)
            {
                var x = db.A_Produkties.Where(k => k.IDKategorii == item.ID);
                foreach (var itemm in x)
                {
                    Produkty.Add(itemm);
                }
            }

            //data binding here
        }
    }

    List<A_Kategorie> PobierzPodkategorie(int IdKat, List<A_Kategorie> kat = null)
    {
        List<A_Kategorie> Kategorie = new List<A_Kategorie>();
        if (kat != null)
            Kategorie.Concat(kat);

        Kategorie = db.A_Kategories.Where(k => k.KatNadrzedna == IdKat).ToList();

        if (Kategorie.Count() > 0)
        {
            foreach (var item in Kategorie)
            {
                PobierzPodkategorie(item.IDAllegro, Kategorie);
                Podkategorie.Add(item);
            }
        }
        return Kategorie;
    }

TMC; DR *

私の関数は、サブカテゴリ(に配置されている親カテゴリのPobierzPodkategorieサブカテゴリ取得列)を再帰的に検索し、サブカテゴリIDを持つすべての製品を選択して、リストに追加します。カテゴリリストは別のショップサービスサーバーからダウンロードされ、外部サーバーが構造を変更する場合に備えて独自のID列を取得する必要があるため、データベース構造はかなり邪悪です。KatNadrzednaIDAllegroProdukty

カテゴリリストには30000を超えるエントリがあり、そのうちのいくつかには5つ以上の親があり、Webサイトにはメインカテゴリとサブカテゴリのみが表示されます(「下位」サブカテゴリはSOAPに接続された外部ショップで必要です)。

私の質問は

データベースにインデックステーブルを追加すると(カテゴリ123はの親です123412738...)、パフォーマンスが向上しますか、それとも時間の無駄ですか?(APIのバージョンが変更されたときにインデックスを更新する必要がありますが、どのくらいの頻度で更新されるかわかりません)または、他の方法はありますか?

スクリプトを変更することは本番環境では不可能であり、dbエンジンが多くのリクエストをどのように処理するかわからないため、質問しています。これについて助けていただければ幸いです。

データベースはMSSQLです


*コードが多すぎます。読んでいない

4

2 に答える 2

1

再帰をデータベースに移動する必要があります。WITHこれは、ステートメントと共通テーブル式を使用して実行できます。次に、ビューまたはストアドプロシージャを作成し、それをアプリケーションにマップします。

これにより、SQLクエリを2つ(または1つ)に減らすことができるはずです。

于 2013-03-17T12:41:28.267 に答える
1

あなたが得ることができる大きな効率の向上は、単一のクエリですべてのサブプロダクトをロードすることです。ネットワークトリップを減らすことで節約できる時間は膨大なものになる可能性があります。1がルートカテゴリと子カテゴリの場合12、次のようにすべてのルートカテゴリとその子をクエリできます。

select  *
from    Categories
where   len(Category) <= 2

カテゴリのインデックスは、上記のクエリには役立ちません。ただし、任意のテーブルに主キーを設定することをお勧めします。したがって、Categoryを主キーにします。主キーは一意であり、重複を防ぎ、自動的にインデックスが付けられます。

RBARから離れる(行を苦しめることによる行)は、データベースを適切に調整するよりも効果があります。だから私は最初にそれに取り組みます。

于 2013-03-17T12:41:59.493 に答える