sql-server - SQL 查询调整 - MS SQL Server -2012

标签 sql-server sql-server-2012

我是 SQL 调优新手。我有以下 SQL,大约需要 15 到 20 秒才能生成结果。

SELECT D.DealerName,
       Z.Zone,
       C.Id                             ,
       L.Id                             ,
       A.Id                             ,
       L.LeadDate,
       LT.LeadType                      ,
       EM.FirstName + ' ' + EM.LastName ,
       LS.LeadSource                    ,
       --C.*,
       E.Id                             ,
       E.StartDateTime,
       0                                ,
       Chiefed = CASE A.AppointmentTypeId
                   WHEN 3 THEN 'True'
                   ELSE ''
                 END,
       9                                AS WorkflowPhase
FROM   Customers C( NOLOCK )
       INNER JOIN Dealers D
               ON C.DEALERId = D.Id
       INNER JOIN Leads L( NOLOCK )
               ON L.CustomerId = C.Id
       INNER JOIN Appointments A( NOLOCK )
               ON A.LeadId = L.Id
                  AND ( NOT( A.AppointmentTypeId = 5
                              OR A.AppointmentTypeId = 6 ) )
       JOIN CalendarEvents E( NOLOCK )
         ON E.TableId = 1
            AND E.TableRowId = A.Id
            AND E.IsDeleted = 0

            AND Dateadd(hh, @TZO, Getdate()) >= E.StartDateTime
       LEFT OUTER JOIN AppointmentResults AR( NOLOCK )
                    ON AR.EventId = E.Id
       LEFT OUTER JOIN LeadSources LS( NOLOCK )
                    ON LS.Id = L.LeadSourceId
       LEFT OUTER JOIN LeadTypes LT( NOLOCK )
                    ON LT.Id = L.LeadTypeId
       LEFT OUTER JOIN Users EM( NOLOCK )
                    ON EM.Id = E.EmployeeId
       LEFT OUTER JOIN Zone Z( NOLOCK )
                    ON Z.Id = C.ZoneId
WHERE  EXISTS(SELECT 1
              FROM   WorkflowStatus WS( NOLOCK )
              WHERE  TableId = 1
                     AND TableRowId = A.Id
                     AND WorkflowPhaseId = 9
                     AND IsCompleted = 0
                     AND IsDeleted = 0)
       AND ( EXISTS (SELECT 1
                     FROM   dbo.Uft_userpermissionzonesbyworkflow(@EmployeeId, 9)
                     WHERE  ZoneId = C.zoneid) )
       AND EXISTS (SELECT 1
                   FROM   Uft_userenableddealers(@EmployeeId)
                   WHERE  DealerId = C.DealerId)
ORDER  BY C.LastName,
          C.CompanyName,
          C.CompanyContact 

我已经调整了我的知识,但我仍然可以看到一些索引扫描。我尝试将这些索引扫描转换为索引查找,但由于记录数量而无法实现。

平面图及顶部操作请引用截图 请提供任何建议来临时解决此查询。 enter image description here enter image description here

最佳答案

DECLARE @p TABLE (DealerId INT PRIMARY KEY WITH (IGNORE_DUP_KEY=ON))
INSERT INTO @p
SELECT DealerId
FROM dbo.Uft_userenableddealers(@EmployeeId)

DECLARE @z TABLE (ZoneId INT PRIMARY KEY WITH (IGNORE_DUP_KEY=ON))
INSERT INTO @z
SELECT ZoneId
FROM dbo.Uft_userpermissionzonesbyworkflow(@EmployeeId, 9)

SELECT ...
FROM ...
WHERE  EXISTS(SELECT 1
              FROM   WorkflowStatus WS( NOLOCK )
              WHERE  TableId = 1
                     AND TableRowId = A.Id
                     AND WorkflowPhaseId = 9
                     AND IsCompleted = 0
                     AND IsDeleted = 0)
       AND C.zoneid IN (SELECT * FROM @z)
       AND C.DealerId IN (SELECT * FROM @p)
ORDER  BY C.LastName,
          C.CompanyName,
          C.CompanyContact
OPTION(RECOMPILE)

关于sql-server - SQL 查询调整 - MS SQL Server -2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34291399/

相关文章:

c# - 替换多个字段中的多个特殊字符 SQL

SQL Server : Lookup/Join on variable length string

sql-server - 带有多个子查询的 SELECT 查询计数

asp.net - 将 session 变量传递给 SQLDataSource 时出错

SQL - 聚合函数中的子查询

java - SqlServer遇到异常 "VARCHAR"

SQL如何处理页面上的大量评论/注释

sql-server - 从 Azure 弹性数据库作业读取 Oracle 数据库

sql-server-2012 - 如何在 SQL Server 2012 中设置兼容级别 80?

sql-server-2012 - 何时在 SSIS 的 Lookup 组件中选择缓存