执行 LIKE WHERE 条件的不同方式?

ana*_*123 1 sql-server-2012

我有一个工作正常的查询:

  SELECT  
         month_date= month(SendTime) ,year_date =year(sendtime) ,MessageType
          ,COUNT(MessageType) AS MESSAGE_COUNT
  FROM Message
  WHERE year(SendTime)= 2014
      and messagetype NOT LIKE '%test%' 
      and messagetype NOT LIKE '%ANOTHER THING%' 
      and messagetype NOT LIKE '%STUFF%' 
  GROUP BY month(SendTime),year(sendtime), MessageType
Run Code Online (Sandbox Code Playgroud)

我注意到的是LIKE有条件它使流逝时间变慢。

使用上面的查询,它在经过时间 0.550 运行,没有它们 0.154。

有没有其他方法可以缩短这次时间并使查询更快?

没有消息类型不是索引,我不允许更改它。

ype*_*eᵀᴹ 5

你可以做两件事:

  • 使用SendTime >= '20140101' AND SendTime < '20150101'而不是year(SendTime)= 2014. 这使得条件可以使用并且可以使用索引。

  • 添加复合索引,(SendTime, MessageType)以便查询不必执行全表扫描,而只需执行(部分)索引扫描。

查询重写:

SELECT  
    month_date = month(SendTime),
    year_date = year(SendTime),
    MessageType,
    message_count = COUNT(MessageType) 
FROM Message
WHERE SendTime >= '20140101' AND SendTime < '20150101'
  AND MessageType NOT LIKE '%test%' 
  AND MessageType NOT LIKE '%ANOTHER THING%' 
  AND messagetype NOT LIKE '%STUFF%' 
GROUP BY year(SendTime), month(SendTime), MessageType ;
Run Code Online (Sandbox Code Playgroud)

另一种选择是在year(SendTime)month(SendTime)和索引上添加计算列year(SendTime), month(SendTime), MessageType- 并保留原始查询!