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