索引子类别vs动态查找它们(性能)

本文关键字:性能 查找 子类 vs 动态 索引 | 更新日期: 2023-09-27 18:04:13

我正在构建一个基于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;博士*

我的函数PobierzPodkategorie递归地查找子类别(子类别为其父类别获得KatNadrzedna列,父类别位于IDAllegro中),选择具有子类别ID的所有产品并将其添加到Produkty列表中。数据库结构是相当邪恶的,因为类别列表是从另一个商店服务服务器下载的,它需要得到我们自己的ID列,以防外部服务器会改变结构。

在类别列表中有超过30,000个条目,其中一些将有5个或更多的父类,并且网站将仅显示主类别和子类别("较低"子类别是与SOAP连接的外部商店需要的)。

我的问题是

添加索引表到数据库(1231234, 12738的父类)是否会提高性能,或者只是浪费时间?(索引应该更新时版本API的变化,我不知道多久会更新一次)或者有其他的方法来做到这一点?

我问,因为改变脚本将不可能在生产中,我不知道db引擎如何处理大量的请求-我真的很感谢任何帮助与此。

数据库是MSSQL


*太多的代码;没有阅读

索引子类别vs动态查找它们(性能)

您可以获得的最大效率增益是在单个查询中加载所有子产品。减少网络传输所节省的时间是巨大的。如果1为根分类,12为子分类,则可以查询所有根分类及其子分类,如下所示:

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

Category上的索引对上面的查询没有帮助。但是在任何表上都有一个主键是很好的做法。我把Category设为主键。主键是唯一的,可以防止重复,并且会自动建立索引。

放弃RBAR(一行接一行)比正确调优数据库更有效。所以我要先处理这个

您绝对应该将递归移到数据库中。这可以使用WITH语句和公共表表达式来完成。然后创建视图或存储过程,并将其映射到您的应用程序。

你应该能够减少SQL查询到两个(甚至一个)。