[英]Slow Query - uses views
在Access 2013上使用SQL Server Express 2008 R2前端在云上进行后端
我有一个查询,最近我不得不添加一个子查询来限制结果。 该查询之前花费了大约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(从云服务器)运行
将您的sql作为视图/ proc放在服务器上,然后调用它而不是尝试对Access中的性能进行故障排除。 考虑使用“直通”查询,与链接表相比,该查询的执行速度快得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.