SQL Server 和实体框架性能改进

Posted

技术标签:

【中文标题】SQL Server 和实体框架性能改进【英文标题】:SQL Server and Entity Framework Performance Improvement 【发布时间】:2017-12-20 22:08:06 【问题描述】:

我使用 SQL Server 和实体框架作为 ORM。

目前我有 5 个包含静态数据的大型表。实际上这些表只用于数据检索过程。

我会用我的项目举一个很好的例子。

这是与旅行相关的项目,我必须明智地存储我的酒店静态数据 API(实际上有酒店预订 api。他们为我们提供酒店静态数据)

我必须处理全球酒店数据。这意味着超过 100,000

如果我们得到 1 家酒店,它包括所有酒店详细信息,例如设施、历史.....图片网址明智。

这些数据我正在获取城市方面的数据

假设是 Paris XML 或 Json - 我在单个文件中有 1000 多个酒店详细信息。这意味着 10MB 或 20MB 文件大小。

在城市方面,一个 API 有超过 40000 行。有些api超过70000。

始终最终用户搜索城市明智,所以现在我将这些数据城市明智地存储在我的 SQL Server 中。因为酒店明智地保存这些数据实际上会减慢我们的速度。

现在我将提供我的技术方面的详细信息。

我正在使用 Azure SQL Server 和 ASP.Net MVC 4 项目 网站托管在 Azure 应用服务中 我在 EF 中使用数据库优先方法

我将向您展示我的数据库结构。很简单。

CREATE TABLE [dbo].[SD_HotelsMNS]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DestinationCode] [varchar](20) NOT NULL,
    [DestinationXML] [xml] NULL,
 CONSTRAINT [PK_SD_HotelsMNS] PRIMARY KEY NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

我的主键是 ID(身份和非集群),我的索引是 DestinationCode,因为我总是在代码中按目的地(城市)搜索酒店。

这些静态数据更新应每年进行 10 次或更少。

在我的项目方面,如果我想要一些目标静态数据,我应该怎么做?正在写一个 linq 查询

  string citycode = "paris";
  ExampleEntities entities = new ExampleEntities ();
  var cityData = entities.SD_HotelsMNS.FirstOrDefault(i => i.DestinationCode.Equals(citycode));

  string xml = cityData.DestinationXML;

现在我的问题是这个静态数据检索部分很慢。

当用户键入Paris 并开始搜索时,我的网站在 Azure 应用服务上发布后,此过程会变慢。

(现在我正在为一个静态数据集执行此操作 - 一个包含 50000 行城市酒店数据的 API,每行包含 500 多家酒店。 ex paris city row - 15mb)

我的问题是:

这是一个糟糕的设计吗? 还有其他方法吗? 我是否需要在实体框架方面进行性能改进?

【问题讨论】:

查看this excellent article on Simple Talk关于这个话题 是的,这篇文章非常好。谢谢@marc_s 【参考方案1】:

是的,这是非常糟糕的设计。您基本上使用 SQL Server 作为 XML 文档的文件存储。您无法对 Entity Framework 进行任何优化来加快速度。

我建议您将 XML 中的数据标准化为常规列,以便您可以根据需要创建索引和关系。然后,您可以只选择您需要的列,而不是 500 行的 15mbs 数据,您可能会看到几千字节。

【讨论】:

感谢您的回复。实际上,当我们请求可用的酒店城市明智时-从 api 方面他们会给我们超过 200 家酒店 Api 明智。实际上我的设计在那个设计中很糟糕,我只使用一个请求。那么实际上我必须通过执行您的方案来明智地通过 200 列来检索数据?。 您需要设计一个数据库架构(具有关系的多个表)来保存您的数据。您只是存储非常慢的 XML。你也可以使用 NoSQL 实际上后来我做了修改,我将这些大小减小到 800kb(15mb 文件),我只在那个 scema 中取了我需要的东西。并创建简单的 jason 文件并存储它。我可以在 microsft azure 中不使用 sql ?

以上是关于SQL Server 和实体框架性能改进的主要内容,如果未能解决你的问题,请参考以下文章

实体框架和 SQL Server 视图

实体框架和 SQL Server 表属性

DataTable 到带有实体框架的 SQL Server 表

实体框架、ASP.NET 和 SQL Server CE

同时将实体框架与 SQL Server 和 SQLite 数据库一起使用

我无法使用 SQL Server Express 和实体框架创建数据库文件