[第一次发贴]如何提高如下sql的查询效率(C#),在线

llddyy123wq 2010-06-03 06:04:07
现在有如下六张表:

1.学科表[Subject](sub_id,subName),
2.版本表[Edition](edi_id,ediName),
3.学科版本关系表[sub_edi_rel](ser_id,sub_id,edi_id),--关系表ID,学科ID,版本ID(因为学科和版本是同级,所以..)
4.册表[Volume](vol_id,volName,),
5.章表[Chapter](cha_id,chaName,vol_id),
6.节表[Section](sec_id,secName,cha_id)

他们的关系是1是2的父级,2是3是父级,3是4是父级,4是5的父级。
介于层次关系比较多,所以呢查询起来非常慢,请问怎么样提高查询效率呢?
最好提供C#代码和sqlserver代码。

希望代码简洁,条理清晰,有注释。最重要的是效率要高。
欢迎大家积极发言。来者感谢之。

分数分配不用担心我会尽量做到合理分配,呵呵。

...全文
281 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
怫悰 2010-06-05
  • 打赏
  • 举报
回复
冒泡接分帮顶
O15013245O 2010-06-04
  • 打赏
  • 举报
回复
建立视图也是种方法,把网状的数据再转换成树状的
O15013245O 2010-06-04
  • 打赏
  • 举报
回复
回楼主,只要不在循环里访问数据库,基本就能解决效率的问题
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
貌似没有人来回答这个问题了。
哎,只好结贴了。
不想太拖拉了。
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 deknight 的回复:]
全加索引那就是全文了,一个个去加你没有那么大的索引空间
我的意思是,你的某些字段是否经常用到,且用它做为条件或分组等等等等操作,如果是,那有索引肯定会快的
表很多,若你left join 那不用问,数据肯定很大.
[/Quote]
很明显像我种情况,常用的字段肯定是主键和名称字段了。
加索引也只能加在主键ID上了。
要么就是连Name也加上,但是后者明显不太合理。
至于你所说的left join视图的问题,我目前正在用这种方式。不然还是得不断的在后台连数据库,就算加了索引,我感觉还是不会太快。
FtLover 2010-06-04
  • 打赏
  • 举报
回复
with  name  as ()


我相信你们会喜欢的。
deknight 2010-06-04
  • 打赏
  • 举报
回复
全加索引那就是全文了,一个个去加你没有那么大的索引空间
我的意思是,你的某些字段是否经常用到,且用它做为条件或分组等等等等操作,如果是,那有索引肯定会快的
表很多,若你left join 那不用问,数据肯定很大.
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 deknight 的回复:]
引用 25 楼 llddyy123wq 的回复:
引用 22 楼 deknight 的回复:
外键N多,需要合理的索引

合理的索引,不知怎么弄才算合理?

当然是看你的设计了,主键不用提了,其他字段难道你一个都不索引?
[/Quote]
没有弄。 像这种表本身数量是不大,组合起来才导致量大的情况,也需要对每个字段加索引吗?
而且我所查询出来的数据仅仅是我提到的那些字段,你看我到对哪个字段加索引呢?
deknight 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 llddyy123wq 的回复:]
引用 22 楼 deknight 的回复:
外键N多,需要合理的索引

合理的索引,不知怎么弄才算合理?
[/Quote]
当然是看你的设计了,主键不用提了,其他字段难道你一个都不索引?
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
希望更多的人有更多的见解,我尽快结贴。
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 deknight 的回复:]
外键N多,需要合理的索引
[/Quote]
合理的索引,不知怎么弄才算合理?
llddyy123wq 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 o15013245o 的回复:]
回楼主,只要不在循环里访问数据库,基本就能解决效率的问题
[/Quote]
嗯。好的。我试试吧。
谢谢大家如此热心。
zekelove 2010-06-04
  • 打赏
  • 举报
回复
可以使用左连接 或者视图
deknight 2010-06-04
  • 打赏
  • 举报
回复
外键N多,需要合理的索引
llddyy123wq 2010-06-03
  • 打赏
  • 举报
回复
To楼上所有说建索引的朋友:
实际情况下,我这几个表中,并不是所有的数据量都特别大,主要是这么多表的层级结构,导致了多种组合,然后才产生的大量数据。
顺便我想问一句,我先建一个视图,然后视图里面可以建索引么??
llddyy123wq 2010-06-03
  • 打赏
  • 举报
回复
15楼意思,我看了下大体明白是什么意思。
之前你没写代码时我也知道你的意思,可是我用的是05,没有linq的。
我在想用你说的方法,还不是一样的要很多个循环的么?
跟我之前做的唯一的区别就是你说的那种方式是一次取出所有数据,然后在后台处理。
速度肯定是有一定的提升,但是提升的也不是太多。
难道就没有更好的方法了么?
noway8881 2010-06-03
  • 打赏
  • 举报
回复
建立合理的索引
xk1126 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 o15013245o 的回复:]
根据我上面提的思路,用Linq To xml写了一个,直接上代码

C# code

void Test()
{
List<Subject> Subjects = new List<Subject>() {
new Subject(){SubID="1",SubName="小学语文"},
new Subject(){SubID="2",Su……
[/Quote]

up
O15013245O 2010-06-03
  • 打赏
  • 举报
回复

根据我上面提的思路,用Linq To xml写了一个,直接上代码

void Test()
{
List<Subject> Subjects = new List<Subject>() {
new Subject(){SubID="1",SubName="小学语文"},
new Subject(){SubID="2",SubName="小学数学"},
new Subject(){SubID="3",SubName="中学语文"},
new Subject(){SubID="4",SubName="中学物理"},
};//怎么取数据略
List<Edition> Editions = new List<Edition>() {
new Edition(){EdiID="1",EdiName="苏教国标版"},
new Edition(){EdiID="2",EdiName="苏教版"},
new Edition(){EdiID="3",EdiName="人教版"},
};//怎么取数据略
List<SubEdition> SubEditons = new List<SubEdition>() {
new SubEdition(){SEID="101",SubID="1",EdiID="1"}
};//怎么取数据略
List<Chapter> Chapters = new List<Chapter>() {
new Chapter(){ChapterID="10101",SEID="101",ChapterName="第七册"},
new Chapter(){ChapterID="10102",SEID="101",ChapterName="第八册"},
new Chapter(){ChapterID="10901",SEID="109",ChapterName="第N册"}//一条无关的数据
};//怎么取数据略
List<Section> Sections = new List<Section>() {
new Section(){SectionID="1010101",ChapterID="10101",SectionName="第一单元:诗歌"},
new Section(){SectionID="1010102",ChapterID="10101",SectionName="第二单元:爱国主义教育"},
};//怎么取数据略
XElement root = new XElement("Data", Subjects.Select(
iSubject => new XElement("Subject", new object[]
{
new XAttribute("id",iSubject.SubID),
new XAttribute("value", iSubject.SubName),
SubEditons.Where(oSubEdtion => oSubEdtion.SubID == iSubject.SubID).Select(
iSubEditon => new XElement("SubEdion",new object[]
{
new XAttribute("id",iSubEditon.SEID),
new XAttribute("value",Editions.Find(
oEdition=>oEdition.EdiID==iSubEditon.EdiID).EdiName),
Chapters.Where(oChapter=>oChapter.SEID==iSubEditon.SEID).Select(
iChapter=>new XElement("Chapter",new object[]
{
new XAttribute("id",iChapter.ChapterID),
new XAttribute("value",iChapter.ChapterName),
Sections.Where(oSection=>oSection.ChapterID==iChapter.ChapterID).Select(
iSection=>new XElement("Section",new object[]
{
new XAttribute("id",iSection.SectionID),
new XAttribute("value",iSection.SectionName)
}))
}))
}))
}))
);
root.Save("C:\\Data.xml");
}


public class Subject
{
public string SubID { set; get; }
public string SubName { set; get; }
}
public class Edition
{
public string EdiID { set; get; }
public string EdiName { set; get; }
}
public class SubEdition
{
public string SEID { set; get; }
public string SubID { set; get; }
public string EdiID { set; get; }
}
public class Chapter
{
public string ChapterID { set; get; }
public string SEID { set; get; }
public string ChapterName { set; get; }
}
public class Section
{
public string SectionID { set; get; }
public string ChapterID { set; get; }
public string SectionName { set; get; }
}
lijunfeng 2010-06-03
  • 打赏
  • 举报
回复
或者查6次把所有表查出来且按照 父ID,子ID 排序
这样就直接从父到子往树上加就可以了,在加的时候判断当父变化时就回到上一级添加新父,然后继续添加子级,这样是不需要多余的数据访问的。
加载更多回复(13)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧