SQL Server较小的日期范围冻结服务器

SQL Server较小的日期范围冻结服务器,sql,sql-server,Sql,Sql Server,因此,我们有一个SQL Server语句来选择特定商户在给定时间段内的销售额。这适用于任何较大的日期范围、整月、多月,甚至是从2月或更早的几周或几天这样的短期 然后,当我们想要查询一个小的日期范围时,比如示例中给出的5月份的几天,服务器利用率将达到100%,并将所有内容冻结。这种情况发生在3月、4月和5月的任何小日期范围内,但在此之前不会发生 这可能与索引有关,因为这些是较新的条目吗 SELECT CAST(tx.tx_sales_amount AS money) AS tx_sales_

因此,我们有一个SQL Server语句来选择特定商户在给定时间段内的销售额。这适用于任何较大的日期范围、整月、多月,甚至是从2月或更早的几周或几天这样的短期

然后,当我们想要查询一个小的日期范围时,比如示例中给出的5月份的几天,服务器利用率将达到100%,并将所有内容冻结。这种情况发生在3月、4月和5月的任何小日期范围内,但在此之前不会发生

这可能与索引有关,因为这些是较新的条目吗

SELECT 
  CAST(tx.tx_sales_amount AS money) AS tx_sales_amount, 
  tx.LID AS loc_id, 
  tx.tx_date, 
  tx.tx_type, 
  tx.tx_clerk_number, 
  ISNULL(
    LTRIM(
      RTRIM(tx.tx_checknum)
    ), 
    'n/a'
  ) AS tx_checknum, 
  tx.card_number, 
  tx_item, 
  tx.member_id, 
  gp.gift_prg_name, 
  gpl.gift_pid, 
  l.location_name AS location 
FROM 
  tblTransactions tx 
  INNER JOIN tblLocations l ON tx.MID = l.MID 
  AND tx.LID = l.LID 
  INNER JOIN tblTerminals t ON tx.MID = t.MID 
  AND tx.LID = t.LID 
  AND tx.TID = t.TID 
  INNER JOIN tblGift_Program_Lookup gpl ON t.id_pk = gpl.TID_fk 
  INNER JOIN tblPrograms_Gift gp ON gp.gift_pid = gpl.gift_pid 
  INNER JOIN tblCards c ON tx.card_number = c.card_number 
  AND c.card_gift_pid = gp.gift_pid 
WHERE 
  tx.tx_type IN ('10', '50') 
  AND tx.MID = '0199' 
  AND tx.tx_void = 0 
  AND l.location_active = 1 
  AND LEFT(tx.card_number, 4) IN (
    SELECT 
      card_prefix 
    FROM 
      tblCard_Types 
    WHERE 
      card_type IN ('Gift', 'Multi')
  ) 
  AND tx.tx_date BETWEEN '2014-05-01 22:00:00' 
  AND '2014-05-07 20:59:59' 
ORDER BY 
  l.location_name, 
  tx.tx_type, 
  gpl.gift_pid, 
  LEFT(c.card_number, 6), 
  tx.tx_date DESC, 
  tx_clerk_number

为了回答这个问题,我必须对所查询的数据进行一些详细的分析。执行计划是什么样子的?很可能您需要更新统计数据。这被称为提升关键问题,在SQL Server 2014中得到缓解。