繁体   English   中英

慢查询-使用视图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM