【问题标题】:How to optimize SQL query如何优化 SQL 查询
【发布时间】:2017-01-10 09:14:08
【问题描述】:

我有这个在 MS SQL Server 上运行的查询:

SELECT o.phone AS Number, o.code AS Code, o.name AS Name,
o.expireDate AS ExpireDate, o.disabled AS cardStatus, a.disabled AS AccountStatus, 
MAX(j.cDate) AS LastUse 
FROM [DATAB].[dbo].[Card] AS o
LEFT OUTER JOIN [DATAB].[dbo].[journal] AS j 
ON j.phone = o.phone,
[DATAB].[dbo].[CardType] AS ct, [DATAB].[dbo].[Account] AS a, 
[DATAB].[dbo].[CardProduct] AS cp
WHERE o.accountProductId = ct.id
AND ct.accountId = a .id
AND a.number = 'XXXXXXXXXX' 
AND ct.partnerProductId = cp.id
AND cp.code = 'XXXX'
GROUP BY o.phone, o.code, o.disabled, o.name, o.expireDate, a.disabled
ORDER BY o.name ASC;

我想优化它以使其运行得更快,但不知道如何开始。

仅供参考,我检查了估计的执行计划,DATAB].[dbo].[journal] 的索引分析说它花费了查询的 70%,但没有索引问题消息。

【问题讨论】:

  • 首先,将您的代码更改为正确的连接语句。为外键添加索引。尝试将索引添加到 a.number 和 cp.code 也。
  • 您需要左连接还是只想要出现在 dbo.Journal 中的电话?
  • Giorgi:我已经用你告诉我要添加的索引进行了测试,但结果是一样的,我在 5 秒内得到了 1400 行。 TJB:我想要 dbo.Journal 的最后一个 MAX(cDate)
  • 您可以查看嵌套选择,它们有时会产生更快的结果(检查执行计划,并非总是如此)。为不经常更改的字段设置索引。对数据库进行碎片整理。我会查看查询分析器和执行计划,它们是在此处获得所需性能的关键。另一方面,例如,如果您从网站调用它,那么首先查看缓存结果以防止数据库调用。制定维护计划以确保保持性能。
  • 为什么在同一个查询中使用legacy join和ansi join?

标签: sql-server


【解决方案1】:

这是使用Outer Apply的一种方式

SELECT o.phone      AS Number,
       o.code       AS Code,
       o.name       AS Name,
       o.expireDate AS ExpireDate,
       o.disabled   AS cardStatus,
       a.disabled   AS AccountStatus,
       LastUse
FROM   [DATAB].[dbo].[Card] AS o
       INNER JOIN [DATAB].[dbo].[CardType] AS ct
               ON o.accountProductId = ct.id
       INNER JOIN [DATAB].[dbo].[Account] AS a
               ON ct.accountId = a .id
       INNER JOIN [DATAB].[dbo].[CardProduct] AS cp
               ON ct.partnerProductId = cp.id
       OUTER apply (SELECT Max(cDate)
                    FROM   [DATAB].[dbo].[journal] AS j
                    WHERE  j.phone = o.phone) ou (LastUse)
WHERE  a.number = 'XXXXXXXXXX'
       AND cp.code = 'XXXX'
ORDER  BY o.name ASC; 

在journal 表中的phone,cDate 列上创建非聚集索引应该有助于查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多