Sql 随着记录数的增加,优化数据库查询运行缓慢
是否有更好的方法来优化此查询,随着越来越多的记录添加到数据库中,查询速度会越来越慢 谢谢Sql 随着记录数的增加,优化数据库查询运行缓慢,sql,database,Sql,Database,是否有更好的方法来优化此查询,随着越来越多的记录添加到数据库中,查询速度会越来越慢 谢谢 SELECT VoterID, AnswerID, SectionNumber, AnswerText, SurveyID, CaseID, versionID, voterAnswerStatus, dateupdated, recordstatus, modifiedby FROM Sample.vts_tbVoterAnswers AS
SELECT
VoterID, AnswerID, SectionNumber, AnswerText, SurveyID,
CaseID, versionID, voterAnswerStatus, dateupdated,
recordstatus, modifiedby
FROM
Sample.vts_tbVoterAnswers AS a
WHERE
(dateupdated = (SELECT MAX(dateupdated) AS Expr1
FROM Sample.vts_tbVoterAnswers AS b
WHERE (a.VoterID = VoterID)
AND (a.AnswerID = AnswerID)
AND (a.SectionNumber = SectionNumber)
AND (a.SurveyID = SurveyID)
AND (a.CaseID = CaseID)
AND (a.versionID = versionID)))
AND (recordstatus <> 'D')
希望这有帮助
以下是与查询关联的索引
CREATE UNIQUE NONCLUSTERED INDEX [NonClusteredIndex-20150203-143420] ON [Sample].[vts_tbVoterAnswers]
(
[AnswerID] ASC,
[VoterID] ASC,
[SectionNumber] ASC,
[SurveyID] ASC,
[CaseID] ASC,
[versionID] ASC,
[recordstatus] ASC,
[dateupdated] ASC,
[voterAnswerStatus] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [Sample].[vts_tbVoterAnswers] ADD CONSTRAINT [PK_vts_tbVoterAnswers] PRIMARY KEY CLUSTERED
(
[VoterAnswerID_PK] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [AdjudicateV3]
GO
/****** Object: Index [TBVOTER_DECISION_IDX] Script Date: 7/16/2015 12:27:20 PM ******/
CREATE NONCLUSTERED INDEX [TBVOTER_DECISION_IDX] ON [Sample].[vts_tbVoterAnswers]
(
[recordstatus] ASC
)
INCLUDE ( [VoterID],
[AnswerID],
[SectionNumber],
[SurveyID],
[CaseID],
[versionID],
[dateupdated]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [AdjudicateV3]
GO
/****** Object: Index [TBVOTERANSWERS_CASEID_INX] Script Date: 7/16/2015 12:27:38 PM ******/
CREATE NONCLUSTERED INDEX [TBVOTERANSWERS_CASEID_INX] ON [Sample].[vts_tbVoterAnswers]
(
[AnswerID] ASC,
[recordstatus] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [AdjudicateV3]
GO
/****** Object: Index [TBVOTERSANSWERS_PK] Script Date: 7/16/2015 12:27:51 PM ******/
CREATE NONCLUSTERED INDEX [TBVOTERSANSWERS_PK] ON [Sample].[vts_tbVoterAnswers]
(
[CaseID] ASC,
[recordstatus] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [AdjudicateV3]
GO
/****** Object: Index [vts_tbVoterAnswers_PK] Script Date: 7/16/2015 12:28:10 PM ******/
CREATE UNIQUE NONCLUSTERED INDEX [vts_tbVoterAnswers_PK] ON [Sample].[vts_tbVoterAnswers]
(
[SurveyID] ASC,
[CaseID] ASC,
[versionID] ASC,
[VoterID] ASC,
[AnswerID] ASC,
[dateupdated] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
我没有看到DateUpdated上的索引。没有它,数据库必须遍历整个表,查找与DateUpdated=。。。子查询。。。。在单个DateUpdated列上添加索引。尝试重写为RANK,看看这是否有帮助:
SELECT
VoterID, AnswerID, SectionNumber, AnswerText, SurveyID,
CaseID, versionID, voterAnswerStatus, dateupdated,
recordstatus, modifiedby
FROM
(
SELECT
VoterID, AnswerID, SectionNumber, AnswerText, SurveyID,
CaseID, versionID, voterAnswerStatus, dateupdated,
recordstatus, modifiedby,
RANK() OVER (PARTITION BY VoterID, AnswerID, SectionNumber, SurveyID, CaseID, versionID ORDER BY dateupdated DESC) AS rnk
FROM
Sample.vts_tbVoterAnswers AS a
) AS dt
WHERE (recordstatus <> 'D')
AND rn = 1
在分区上使用First_值,而不是子查询
对于每个未用作分区键的列,它应该类似于以下代码:
FIRST_VALUE(columnname)
OVER (
PARTITION BY VoterID, AnswerID, SectionNumber, SurveyID, CaseID, versionID
ORDER BY dateupdated ASC
) AS columnname
这是什么具体的RDBMS?你的桌子结构是什么?这个表上有哪些索引?您需要向我们显示表和索引定义,以及每个表的行数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们需要行计数,因为这会影响查询规划。如果你知道如何进行解释或获得执行计划,也可以将结果放在问题中。如果没有索引,请访问。您的DBMS是否支持秩/行\号?显示执行计划最好的非聚集索引或非聚集列存储索引。顺便说一句,这个网站很棒!谢谢,我不知道这两种索引之间的区别。对不起,我修改了索引,非常感谢你的帮助!第二次从9秒到2秒!非常感谢!!!
FIRST_VALUE(columnname)
OVER (
PARTITION BY VoterID, AnswerID, SectionNumber, SurveyID, CaseID, versionID
ORDER BY dateupdated ASC
) AS columnname