慢查询 - 使用视图

时间:2015-05-15 11:39:46

标签: sql sql-server ms-access sql-view

使用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(来自云服务器)

运行

1 个答案:

答案 0 :(得分:0)

将sql作为视图/ proc放在服务器上,然后调用它而不是尝试解决Access中的性能问题。考虑使用" passthrough"查询,与链接表相比,执行速度要快得多。