我目前正在开发一个项目,客户端向我发送了一个数据库,其中包含一个包含200多列和300万行数据的表lol。这绝对是设计不佳,目前正在探索一些选择。我用我的2012 mbp开发了这个应用程序,有16GB的内存和512 ssd。我不得不使用mvc4开发应用程序,因此在osx上使用parallels 8设置开发和测试环境。作为设计的一部分,我为客户端开发了一个接口,为这个包含数百行的大型表创建自定义查询,因此我将一个queryString发送到控制器,该控制器使用动态linq传递,结果使用JSON发送到视图(填充kendo ui网格)。在我的mbp上,当使用我创建的界面测试查询时,需要最多10秒(发现太多)才能将结果返回到我的kendo ui网格。同样,当我直接在sql server中测试查询时,它永远不会花费很长时间。
然而,当我将此部署到客户端以测试这些相同的查询时,需要花费超过3分钟+。长话短说,客户端将升级服务器硬件,但同时他们仍然需要测试应用程序。
我的问题是,尽管表格中有200列,但每一行都是唯一的。更具体地说,设计是:
PK-(GUID)OrganizationID(FK)--- 200列(税目)
如果我将其重新设计为:
PK(GUID)OrganizationID(FK)FieldID(FK)输入
字段表: FieldID FieldName
这会将这300万行数据表变成6亿行但只有3列。我会看到性能增强吗?
任何见解都会受到赞赏 - 我理解规范化,但我的大部分经验都是编程。
提前致谢!
答案 0 :(得分:1)
如果不知道你在桌面上运行的查询,就很难做出任何判断。
以下是一些注意事项:
出于测试目的,只需减小表的大小。这应该加快速度。
关于规范化的问题。您的非规范化结构占用的磁盘空间比标准化结构少得多,因为您不需要为每个值重复键。如果您要在一行中查找一个值,则规范化将无法帮助您。您仍然需要扫描索引才能找到该行,然后加载该行。并且,该行将在一个页面上,无论它是标准化还是非规范化。实际上,规范化可能会更糟,因为索引会更大。
有一些查询示例可以帮助规范化数据。但是,通常,如果要按行提取数据,则已经拥有更高效的数据结构。
答案 1 :(得分:0)
您可以采用分页方式。将有2个查询:initial将返回所有行但仅返回具有唯一ID的列。此数组可以拆分为页面,例如每页100个ID。当用户选择特定页面时 - 您将100个ID传递给第二个查询,这次将返回所有200列但仅针对请求的100行。这样,您不必一次性返回所有行中的所有列,这将显着提高性能。