【问题标题】:SQL : Data retrieval is slow for large number of recordsSQL:大量记录的数据检索很慢
【发布时间】:2017-06-15 10:23:06
【问题描述】:

数据库管理系统:Microsoft SQL Server 已更新 -- 表中记录总数:972848614 已更新 -- 查询返回的 Rectors

更新 查询获取 Count : select count(*) from MemberBetDetail where memberCode='test' and betstatusId = 1 and winlossAmount != 0

耗时 9:46 分钟,结果:4741350

查询获取结果:从 MemberBetDetail 中选择 memberCode,betstatusId,winlossAmount where memberCode='test' and betstatusId = 1 and winlossAmount != 0

耗时 7:26 分钟,结果:4741350

表架构和索引

我想检索总共 4753780 条记录,但花了将近 8 分钟。有人能指出它的实际问题是什么

我正在使用基于 MemberCode、CurrencyCode 和 StatusId 的简单查询

更新:

执行计划

【问题讨论】:

  • 您使用的是哪个DBMS?后格雷斯?甲骨文?
  • 向我们展示您正在使用的查询和执行计划。
  • 这可能不是答案而是提示,您是否考虑过使用索引来加快查询速度?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”或“为什么我的查询很慢”)必须包括所需的行为、特定的问题或错误以及重现所需的最短代码它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 数据库管理系统:SQL。查询:select * from table where membercode='test' and currencyCode='RM' and statusId in (1,2)

标签: sql sql-server


【解决方案1】:

尝试为表设置非聚集索引...

create NONCLUSTERED  index myIndex on Table1(Column2) include (col1,col2,clo3)

【讨论】:

  • 第一个:[MemberCode] ASC,[BetStatusID] ASC 第二个:[ProviderCode] ASC,[BetID] ASC 第三个:[UpdatedDate] ASC,[BetStatusID] ASC
  • 尝试使用列名而不是 select *
  • select * from table (nolock) where membercode='test' and currencyCode='RM' and statusId in (1,2) try using nolock
  • 你在输出中有多少记录?
【解决方案2】:

正如 Nithin 所说,尝试将查询中的 * 替换为您需要的列,并根据 WHERE 子句中使用的 3 列将这些列包含在新索引中。 这应该避免密钥查找的需要。

CREATE NONCLUSTERED INDEX OPTIM_1 ON MemberBetDetail(MemberCode ASC, CurrencyCode ASC, BetStatusId ASC) 
       INCLUDE (colYouNeed1, colYouNeed2, ColYouNeed3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2019-06-14
    相关资源
    最近更新 更多