【问题标题】:SQL Query running SlowSQL 查询运行缓慢
【发布时间】:2016-09-22 05:29:43
【问题描述】:

我在 sql server 2005 中有一个包含 6588395 条记录的客户表,我需要根据创建日期从客户表中检索记录。 我在创建日期创建了聚集索引。通过链接服务器,我正在从该表中检索记录。 我使用的查询是

@StartDate=N'01 Jan 2016',@EndDate=N'31 Mar 2016'

select 
   firstname, 
   lastname,
   Address,
   Addrss1,
   city    
from  
   [ABC\SQCENTRE].[Reports].[dbo].[tbl_Customer]  
where      
   creation_date   BETWEEN  @startdate AND  @EndDate

此查询需要 30 分钟来检索记录。你能建议如何优化查询吗?

我也尝试过 openquery,但这也没有任何区别。 Creation_date 是一个日期时间字段

任何帮助表示赞赏。

【问题讨论】:

  • 查询直接在另一台服务器上运行有多快/多慢?你真的将日期保存为 nvarchar 吗?
  • @swe creationdate 是一个日期时间字段
  • 尝试使用With(NOLOCK)
  • 查询在远程服务器本地运行需要多长时间?查询返回多少条记录?需要确定问题是由于带宽还是查询优化造成的。既然你说 OPENQUERY 没有帮助,那么它就是其中之一。如果可以排除带宽,那就看远程服务器上的执行计划。
  • 提供执行计划作为xml,涉及的表的架构和计数

标签: sql sql-server sql-server-2008


【解决方案1】:

因此,如果 createdate 是 datetime,请将您的 vars 设置为 datetime 值而不是 varchar...

declare @Startdate datetime; @Startdate = convert(datetime, 'mydate')

SQLServer 会将表中的值与您的比较值进行比较。所以我不知道他是否会将你的 searchvalue 转换为 datetime 或将 700 万个 datetime 转换为 varchar 进行比较。所以这就是为什么我肯定会明确地将我的搜索表达式转换为 datetime 以确保服务器不会将 700 万个日期值转换为 varchar。

RAM 或 tempdb 中的 700 万次强制转换可以解释为什么 openquery(肯定是 where 子句的本地评估)需要 30 分钟。 如果我们有一个执行计划,这会更容易说。

【讨论】:

  • SQL Server 不应该自动执行此操作吗?
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多