我有一个包含用户输入的表,需要进行优化。 我有一些关于如何解决这个问题的想法,但我非常感谢您对此的意见。需要优化的表在下面的结构中称为Value。 下面提到的所有表都有称为Id的整数主键 规范:Sql Server 2008,Linq2Sql,asp.net网站,C#。
目前的结构如下:
页面 - >字段 - > FieldControl - > ValueGroup - >值
页面是一个或多个字段的容器。
字段是一个或多个FieldControl的容器,例如文本框或下拉选项。
关系:PageId
如果Field的类型为“TextBox”,则会为Field创建一个FieldControl。
如果Field的类型为“DropDown”,则为包含选项文本的Field创建一个FieldControl每个下拉选项。
关系:FieldId
每次用户填写页面中的字段并保存时,都会创建一个新的ValueGroup(Id)来跟踪与该保存相关的用户输入。当用户想要时
查看以前填写的表单,valuegroup用于将Values加载到先前填充的实例中的FieldControls中。
关系:无
FieldControl的实际输入。如果用户在TextBox中键入“Hello”,那么“Hello”将存储在此表中的一行中,后跟一个引用,返回FieldControl“Hello”的输入。 ValueGroup链接到值,以便将它们分组以跟踪它们属于哪个保存/实例,如ValueGroup中所述。
Relationships:ValueGroupId,FieldControlId
如果完全填充了100.000页,每个页面包含10个TextBox,那么我们在Values表中得到100.000 * 10条记录,这意味着我们很快就会达到100万条记录,因为它现在非常慢。用户可以创建尽可能多的具有他/她喜欢的不同字段的不同页面,并且所有这些值都存储在Values表中。我使用此数据的方式是显示带有分页的gridview,该分页显示单个Pagetype的所有记录,或者查看特定的Page实例(按ValueGroupId分组的值)。
我有一些想法:
在优化Values表时,良好的索引应该非常重要
我是否应该直接将一个外键添加回Page from Value,最后通过(Id,PageId,ValueGroup)索引,允许gridview检索仅与一个页面相关的值?
我应该考虑分区表,如果是这样,你会怎么建议我这样做?我正在考虑按页面进行分区,因此在这种情况下获取仅与某个页面相关的值块是明智的吗?脚本/模式将如何寻找用户随时可以创建/删除页面的内容。
PS。这个论坛上应该有一个徽章,供所有阅读完这篇长篇文章的人使用,我希望自己明确表示:)
答案 0 :(得分:1)
关闭这篇文章。正确的索引解决了所有性能问题。
答案 1 :(得分:0)
这可能稍微偏离主题,但为什么呢?您需要实时访问这些数据,还是稍后进行处理?您可以将数据打包成一行,然后再解压缩吗?
答案 2 :(得分:0)
你说它现在很慢,除了数据库之外,这可能是很多原因 如低内存,高CPU,磁盘碎片,网络负载,插座问题等。 这应该出现在系统监视器上
尝试使用Sysinternals(现为MS)工具:http://live.sysinternals.com/procexp.exe
但如果这一切都在控制之下,那么就回到数据库。
一百万条记录不是“那么多”,应该不是问题。 如果您现在没有任何索引,索引应该可以解决问题。 您可能应该在所有表上设置索引,如果还没有这样做的话。
我试图做一个数据库模型,这是对的: http://www.freeimagehosting.net/image.php?a39cf99ae5.png
页面 - >字段 - > FieldControl - > ValueGroup - >值
表结构看起来可能不是最佳表结构,但是当我不知道应用程序如何工作时很难确切地说。
所有表都有外键 上面的表格?
伪码:
1. Get page info. Gives key "page-id"
2. Get all "Field":s marked with that "page-id".
Gives keys "field-id" & "fieldcontrol-id"
3. Loop trough all fields-id:s and get the FieldControl for each one
4. Loop trough all fields-id:s and get all ValueGroup:s.
Gives a list of "valuegroup-id":s keys
5. Loop trough all ValueGroup:s and get all fields