C# 索引子类别与动态查找子类别(性能)

C# 索引子类别与动态查找子类别(性能),c#,sql-server,performance,C#,Sql Server,Performance,我正在构建一个基于web的商店应用程序,我必须处理彼此之间的许多嵌套子类别。关键是,我不知道我的脚本是否能处理数千个(新系统将取代旧系统,因此我知道我需要的流量)-目前,本地服务器的响应延迟比其他页面多1-2秒,添加了大约30个不同类别的产品 我的代码如下: BazaArkadiaDataContext db = new BazaArkadiaDataContext(); List<A_Kategorie> Podkategorie = new List<A_K

我正在构建一个基于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;
    }
BazaArkadiaDataContext db=new BazaArkadiaDataContext();
List Podkategorie=新列表();
公共整数IdKat{get;set;}
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
List Produkty=new List();//类别和剩余子类别中所有产品的列表
if(Page.RouteData.Values[“IdKategorii”]!=null)
{
字符串tmpkat=Page.RouteData.Values[“IdKategorii”].ToString();
int index=tmpkat.IndexOf(“-”);
如果(索引>0)
tmpkat=tmpkat.Substring(0,索引);
IdKat=db.A_Kategories.Where(k=>k.ID==Convert.ToInt32(tmpkat)).Select(k=>k.IDAllegro.FirstOrDefault();
}
其他的
返回;
PobierzPodkategorie(IdKat);
foreach(Podkategorie中的var项目)
{
var x=db.A_Produkties.Where(k=>k.IDKategorii==item.ID);
foreach(x中的var itemm)
{
产品添加(项目m);
}
}
//这里的数据绑定
}
}
列表PobierzPodkategorie(int-IdKat,List-kat=null)
{
List Kategorie=新列表();
如果(kat!=null)
康卡特(kat);
Kategorie=db.A_Kategories.Where(k=>k.KatNadrzedna==IdKat.ToList();
如果(Kategorie.Count()>0)
{
foreach(Kategorie中的var项目)
{
PobierzPodkategorie(IDAllegro项目,Kategorie);
添加(项目);
}
}
返回卡特戈里;
}
TMC;DR*

我的函数
PobierzPodkategorie
递归搜索子类别(父类别的子类别get
KatNadrzedna
列,位于
IDAllegro
),选择所有具有子类别ID的产品,并将其添加到
Produkty
列表中。数据库结构非常糟糕,因为类别列表是从另一个shop service server下载的,它需要获得我们自己的ID列,以防外部服务器更改结构

类别列表中有30000多个条目,其中一些条目将有5个或5个以上的家长,网站将只显示主要类别和子类别(“与SOAP连接的外部商店需要较低的”子类别)

我的问题是

将索引表添加到数据库(类别
123
1234
12738
…)会提高性能,还是只是浪费时间?(当API的版本发生变化时,索引应该更新,我不知道会多久更新一次)或者有其他方法吗

我这样问是因为在生产环境中不可能更改脚本,而且我不知道db引擎如何处理大量请求-我非常感谢在这方面提供的任何帮助

数据库是MSSQL



*太多的代码;没有读到

您肯定应该将递归移到数据库中。可以使用
WITH
语句和。然后创建一个视图或存储过程,并将其映射到您的应用程序


这样,您应该能够将SQL查询减少到两个(甚至一个)。

您可以获得的最大效率增益是在一个查询中加载所有子产品。减少网络旅行所节省的时间可能是巨大的。如果
1
是根类别,而
12
是子类别,则可以查询所有根类别及其子类别,如:

select  *
from    Categories
where   len(Category) <= 2
选择*
从类别

len(分类)我知道一点SQL,但我不知道这是可能的-谢谢你。是否有可能(和/或值得)将此函数放入
数据库方法中,以便以后使用?是的,我在每个表中都有带有
自动增量的主键,有时我甚至会生气为什么我的数据库在创建表时不能自动创建它;)感谢您的回复-我想我最终需要学习SQL,只是为了知道在那里可以做什么。。。