C# 索引子类别与动态查找子类别(性能)
我正在构建一个基于web的商店应用程序,我必须处理彼此之间的许多嵌套子类别。关键是,我不知道我的脚本是否能处理数千个(新系统将取代旧系统,因此我知道我需要的流量)-目前,本地服务器的响应延迟比其他页面多1-2秒,添加了大约30个不同类别的产品 我的代码如下: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
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
递归搜索子类别(父类别的子类别getKatNadrzedna
列,位于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,只是为了知道在那里可以做什么。。。