索引子类别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连接的外部商店需要的)。
我的问题是
添加索引表到数据库(123
是1234
, 12738
的父类)是否会提高性能,或者只是浪费时间?(索引应该更新时版本API的变化,我不知道多久会更新一次)或者有其他的方法来做到这一点?
我问,因为改变脚本将不可能在生产中,我不知道db引擎如何处理大量的请求-我真的很感谢任何帮助与此。
数据库是MSSQL
*太多的代码;没有阅读
您可以获得的最大效率增益是在单个查询中加载所有子产品。减少网络传输所节省的时间是巨大的。如果1
为根分类,12
为子分类,则可以查询所有根分类及其子分类,如下所示:
select *
from Categories
where len(Category) <= 2
Category上的索引对上面的查询没有帮助。但是在任何表上都有一个主键是很好的做法。我把Category设为主键。主键是唯一的,可以防止重复,并且会自动建立索引。
放弃RBAR(一行接一行)比正确调优数据库更有效。所以我要先处理这个
您绝对应该将递归移到数据库中。这可以使用WITH
语句和公共表表达式来完成。然后创建视图或存储过程,并将其映射到您的应用程序。
你应该能够减少SQL查询到两个(甚至一个)。