使用SQL Server Express 2008 R2在云上进行后端处理 Access 2013的前端
我有一个查询,我最近不得不添加一个子查询来限制结果。查询大约需要1秒才能运行,但现在大约需要70秒。我认为问题可能是我在查询中使用未编制索引的视图。我对此很陌生并且没有多少使用Access / SQL,所以如果我遗漏了一些明显的东西,请道歉。
这是我的查询代码:
SELECT DISTINCT vuSearch.PAID ,vuSearch.PDID ,ConcatAddress(Nz([Building_Name]), Nz([Building_No]), Nz([Street]), Nz([IndEst]), Nz([District]), Nz([Town]), Nz([Postcode])) AS Address ,vuSearch.Deal_Date ,vuSearch.Lease_End ,vuSearch.Break_Date ,vuSearch.Review_Date ,vuSearch.PropertyType ,vuSearch.Acting_For ,vuSearch.Landlord_Seller ,vuSearch.Tenant_Purchaser ,IIf(IsNull([vuSearch.GIA]), [vuSearch.NIA], [vuSearch.GIA]) AS MainArea ,vuDesc.Comments_Incentives ,tldDealSearch.Include ,vuSearch.Incomplete FROM ( vuSearch RIGHT JOIN tldDealSearch ON vuSearch.PDID = tldDealSearch.PDID ) LEFT JOIN vuDesc ON tldDealSearch.PDID = vuDesc.PDID WHERE ( ( (vuSearch.PDID) IN ( ( SELECT Max(v2.PDID) FROM vuSearch AS v2 GROUP BY v2.PAID ) ) ) AND ((vuSearch.Incomplete) = False) );
我在tldDealSearch表中为PDID和Include字段添加了索引(我想我已经做到了这一点)。当我查看后端的视图时,我无法添加索引,因为视图没有架构绑定。
有什么我可以做或应该考虑加快这一点吗?我现在非常担心,数据库上只有300条记录 - 70多秒?
我已经检查了“分析性能”的所有内容。工具,但不知道下一步该做什么。
编辑: 感谢快速响应的人。
NZ - 这是我相信的Access NullToZero功能,或者取代它的功能。 http://www.techonthenet.com/access/functions/advanced/nz.php
ConcatAddress - 这是一个我用来将地址的所有元素以可读格式放在一起以包含在报告中的函数。
Public Function ConcatAddress(strBuildingName As String, strBuildingNo As String, strStreet As String, _ strIndEstate As String, strDistrict As String, strTown As String, strPostcode As String) As String On Error GoTo ErrRoutine Dim strSQL As String If Len(strBuildingName) > 0 Then strSQL = strBuildingName End If If Len(strBuildingNo) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strBuildingNo Else strSQL = strBuildingNo End If End If If Len(strStreet) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strStreet & "," Else strSQL = strStreet End If End If If Len(strIndEstate) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strIndEstate & "," Else strSQL = strIndEstate End If End If If Len(strDistrict) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strDistrict & "," Else strSQL = strDistrict End If End If If Len(strTown) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strTown Else strSQL = strTown End If End If If Len(strPostcode) > 0 Then If Len(strSQL) > 0 Then strSQL = strSQL & " " & strPostcode Else strSQL = strPostcode End If End If If Len(strSQL) > 0 Then ConcatAddress = strSQL Else ConcatAddress = "" End If ErrExit: Exit Function ErrRoutine: ConcatAddress = Empty Select Case Err Case 94 'MsgBox "Postcode not found." Resume ErrExit Case Else MsgBox "The following error has occurred " & Err & " " & Err.Description Resume ErrExit End Select End Function
修改
我被要求发布查询的执行计划,但这在访问中不可用。我得到了一个黑客工作,我认为它与执行计划很接近(但是不能让它与Access 2013一起工作)。
[有关信息]
将一个键和字符串添加到注册表 - HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines
添加密钥' Debug'并添加字符串' JETSHOWPLAN' - 将值设置为ON以进行记录
(结果应该在我的文件或数据库的位置)
- Inputs to Query - ODBC table 'vuSearch' ODBC table 'vuSearch' Table 'tldDealSearch' ODBC table 'vuDesc' - End inputs to Query - 01) Sort table 'vuDesc' 02) Outer Join table 'tldDealSearch' to result of '01)' using temporary index join expression "tldDealSearch.PDID=vuDesc.PDID" 1614631268) Remote SQL 03) Sort result of '02)' 04) Inner Join result of '02)' to result of '03)' using temporary index join expression "tldDealSearch.PDID=vuSearch.PDID" store result in temporary table
似乎有很多排序正在进行,所以必须减慢一些。希望这是你想要的。
修改
Access JETSHOWPLAN没有提供太多细节,因此我将tldSearchData表传输到后端并在那里运行查询。我删除了concatAdderss(因为它使用Access函数)以及IIF公式来确定使用哪个区域。由此产生的执行计划如下。
实际:https://drive.google.com/file/d/0B5o8fYhuyQ0ZODZCWHNIaS1KZ1k/view?usp=sharing
估计:https://drive.google.com/file/d/0B5o8fYhuyQ0ZU0lnRUhvaXVkc1k/view?usp=sharing
查询花了19秒直接从SQL(来自云服务器)
答案 0 :(得分:0)
将sql作为视图/ proc放在服务器上,然后调用它而不是尝试解决Access中的性能问题。考虑使用" passthrough"查询,与链接表相比,执行速度要快得多。