关于查询性能的提示和技巧

[原文发表地址]  LightSwitch Tips & Tricks on Query Performance

[原文发表时间] 2012-05-29 15:31

LightSwitch 允许您连接到多个数据源, 并将它们相关联,以及创建屏幕来编辑数据。这些数据源可以是各种数据库,如 SQL Server 和 SQL Azure、 SharePoint 和自定义的 RIA 服务。在Visual Studio 11 Beta版本中,下一个版本LightSwitch还允许您通过 OData 连接到数据服务,Odata通常都是远程承载的。当这些数据源中的数据大小过大时,或者它们之间的距离增加 (即基于互联网的数据服务) 时,性能就会降低。原因是通过线路的数据集太大、在表中需要搜索的字段的数量过多,或表中的数据已变得非常多。

随着数据的增长和/或"线路"长度的增加,了解影响查询性能的因素变得非常重要。在这篇文章中,我想讨论在 LightSwitch中设计您的实体和针对大型或远程数据集进行查询时,你需要做的一些重要的决定。

默认搜索行为

当您在 LightSwitch 中设计您的实体时,默认情况下所有的字符串属性都是可搜索的。这意味着当在网格或列表中显示数据时,搜索框将执行一个查询,它会比较表中的所有字符串字段来寻找可能的匹配。例如,假如说我有一个来自AdventureWorksLT数据库的customers表。如果搜索”Adam ",然后它会显示在任何字符串字段中任意提及到了单词"adam"的所有记录。

image

在此表中有 10 个字符串字段,所以针对数据库查询的WHERE 子句是:

WHERE ([LastName] LIKE N'%Adam%') OR ([FirstName] LIKE N'%Adam%') OR ([MiddleName] LIKE N'%Adam%') OR ([Title] LIKE N'%Adam%') OR ([Suffix] LIKE N'%Adam%') OR ([CompanyName] LIKE N'%Adam%') OR ([SalesPerson] LIKE N'%Adam%') OR ([EmailAddress] LIKE N'%Adam%') OR ([Phone] LIKE N'%Adam%') OR ([PasswordHash] LIKE '%Adam%') OR ([PasswordSalt] LIKE '%Adam%')

同样,在 Visual Studio 11 LightSwitch中连接到 OData 源时,您可以通过 HTTP在远程数据服务中查询。例如,在下面的示例中有一个来自Netflix OData 服务、针对电影和音乐标题的搜索屏幕,它是按名称排序的。请注意,如果我搜索" Star Wars ",那么它会显示在任何字符串字段中任意提及到了短语" Star Wars "的所有记录。

image

这里是发送到 OData 服务的请求。(有关查询语法的详细信息,请参见OData 查询中支持的URI 公约 .)

GET https://odata.netflix.com/v2/Catalog/Titles()?$orderby=Name&$filter=substringof('Star%20Wars',Id)%20or%20substringof('Star%20Wars',Name)%20or%20(substringof('Star%20Wars',ShortName)%20or%20substringof('Star%20Wars',Synopsis))%20or%20(substringof('Star%20Wars',ShortSynopsis)%20or%20substringof('Star%20Wars',Url)%20or%20(substringof('Star%20Wars',Rating)%20or%20substringof('Star%20Wars',Type)))%20or%20(substringof('Star%20Wars',WebsiteUrl)%20or%20substringof('Star%20Wars',NetflixApiId)%20or%20substringof('Star%20Wars',TinyUrl))&$skip=0&$top=45&$expand=Movie,Series,Season,Disc&$select=*,Movie/*,Series/*,Season/*,Disc/*

在此情况下,根据我对此公共OData 服务的连接速度,它可以花费15 秒时间来显示结果。我们可以通过限制必须搜索的属性数目来加快查询的速度。你可以通过在数据设计器中打开实体,然后在属性窗口中将字段标记为"可搜索"来做到这一点。

image

您也可以为整个实体取消选中它。如果你这样做了,那么当你将实体添加到屏幕中时,屏幕查询就会取消选中"支持搜索",而从用户界面中移除搜索框。

image

请记住实体上的"可搜索"属性控制着行为,无论您在 UI 中做些什么。所以如果您打开屏幕设计器中的"支持搜索",但未在设计器中选中此属性,然后该实体将是不可搜索的,如果用户尝试在用户界面中执行搜索,那么将会显示一条消息。

在上面的customer的例子中,我们通过属性搜索就不需要浪费我们的时间,我们永远不会向用户显示像密码之类的信息。在OData 服务数据源的情况下,如果我决定只允许搜索标题名称及简介,然后现在查询会快许多。

GET https://odata.netflix.com/v2/Catalog/Titles()?$orderby=Name&$filter=substringof('Star%20Wars',Name)%20or%20substringof('Star%20Wars',Synopsis)&$skip=0&$top=45&$expand=Movie,Series,Season,Disc&$select=*,Movie/*,Series/*,Season/*,Disc/*

: 在 Visual Studio 11 Beta中,OData源的默认行为与数据库数据源是相同的。但是我们正在在最终版本中改变这一点,那样的话,默认情况下并不是所有的属性都会选中"可搜索",从而查询 OData源会快许多。

数据集 / 页面大小

在屏幕设计器中,你也可以设置页面大小来控制返回的结果集的大小。选择屏幕查询,然后在属性窗口中设置每页显示的项目数量,那样您可以微调每页显示多少行数据。默认情况下每页会显示45行。这样的话,当将结果从服务器带入到客户端时,这有助于控制您正在使用的带宽。

image

自动执行查询

默认情况下 LightSwitch 也会为你自动执行查询。这意味着您不需要做任何事情来将数据加载到屏幕中。但是有时,您可以通过自己控制它来获得相当大的性能改进。例如,如果您正在创建一个自定义搜索屏幕,其中包括多个可选参数,你可能想要取消选中"自动执行查询"来允许用户首先指定搜索条件,然后立即执行搜索。

image

例如,假设我们想要为标题创建一个我们自己的搜索屏幕,并只允许搜索名称和简介。我们首先创建一个查询,并将这些参数设为可选的。(详细信息请参阅:在 Visual Studio LightSwitch中创建自定义搜索屏幕)

image

当我们在屏幕上使用查询时,请取消选中"自动执行查询",然后添加一个命令按钮,用户可以单击它来执行搜索,一旦他们输入了所有他们想要搜索的可选参数。然后,我们只需编写此代码来加载结果:

Private Sub Search_Execute()

      Me.TitleSearch.Load()

End Sub

静态跨度

静态跨度自 LightSwitch V1 以来已经存在了。如果你想要在查询中确保包含 (或排除) 相关的实体,你可能会用到它。通常,只有当您在屏幕代码中使用相关的数据时,你才需要使用它,因为 LightSwitch 可以识别是否您正在屏幕中使用树形目录中相关的数据,并且将自动为您包括此数据。为了控制这种情况,请首先单击屏幕查询中的"编辑查询"链接。

image

然后在属性窗口中,选择"管理包括的数据"来选择要包括的数据。

image

更多的提示和技巧

这些都只是你可以在 LightSwitch 做的与查询相关的事情,以此来帮助提高性能。当然有很多LightSwitch之外的因素会影响性能,像您的数据源和您正在使用的服务的速度。有关更多的提示和技巧,请参阅:

希望大家喜欢 !