我是一名软件开发人员,最近DBA找到我优化我的应用程序正在使用的查询。DBA报告说,当查询运行时,它占用了大约50%的CPU和高I/O操作。查询非常直接,我不确定如何进行优化。
问题1:我该如何优化这个查询?
问题2:这甚至是我的工作吗?难道DBA不应该更加知识渊博吗?请注意,我们没有DB开发人员,只有DBA和软件开发人员。
数据库中大约有3,000-5,000万条记录,由DBA不断维护/监视,但我不确定具体情况。服务器在专用机器上,并且是Microsoft SQL Server 2005 - 9.00.5057.00 (X64)
附言:请勿提供通过结构性更改来改进数据库的方法。我知道将货币存储为varchar是一个糟糕的设计,但事实就是如此,我们不能改变数据库结构,只能改变访问它的查询。
感谢您的帮助。
查询:
SELECT
COALESCE(CAST([PH].[PAmount] AS decimal(15, 2)) + CAST([PH].[Fee] AS decimal(15, 2)), 0.0) AS [PayAmount],
[PH].[PDate] AS [PayDate]
FROM [History] AS [PH] WITH (NOLOCK)
WHERE [PH].[PMode] IN ('C', 'P')
AND [PH].[INNO] = 'XYZ'
AND [PH].[PStatus] IN ('CONSERVED', 'EXPECTING', 'REFRIGERATED', 'POSTPONED', 'FILED')
AND [PH].[Locked] = 1
AND [PH].[PDate] >= 'Jan 1, 2015'
ORDER BY [PH].[PDate] ASC
字段:
PAmount
- 非聚集索引,varchar(50)
Fee
- 未索引,decimal(6,2)
PDate
- 聚集索引,datetime
PMode
- 非聚集索引,varchar(5)
INNO
- 非聚集索引,varchar(50)
PStatus
- 非聚集索引,varchar(50)
Locked
- 未索引,bit
执行计划:
SELECT---计算标量---筛选---嵌套循环-|--索引搜索
(内连接) |
cost 0% Cost 0% Cost 0% Cost 0% | cost 4%
|---键查找
Cost 96%