【问题标题】:Is the following SQL good or bad practice from a performance perspective?从性能的角度来看,以下 SQL 的做法是好是坏?
【发布时间】:2016-08-25 08:27:06
【问题描述】:

如果我有一个包含数百万条目的庞大数据库并且我需要的只是与特定年份(例如 2015 年)相关的信息,我希望你们中的任何人都可以提供帮助,如果我使用以下查询,在性能方面,这将是最佳实践还是有另一种更好的查询方式,

CREATE INDEX table1_idx ON table1 (date_column);
SELECT text, date_column
FROM table1
WHERE datepart(yyyy, date_column) = 2015;

我们将不胜感激任何与此相关的帮助。

【问题讨论】:

标签: mysql sql sql-server


【解决方案1】:

如果这是关于 SQL Server 的,那不是这样做的方法。在字段上使用任何函数都会导致非 SARGable。

始终使用正确的搜索条件,如下所示:

SELECT text, date_column
FROM table1
WHERE date_column >= '20150101' and date_column < '20160101'

您可能还需要考虑将text 添加为包含列以防止键查找:

CREATE INDEX table1_idx ON table1 (date_column) include (text)

【讨论】:

    【解决方案2】:

    MySQL 不能使用索引范围扫描操作,因为函数包裹在列周围。该函数必须针对表中的每一行进行评估。

    要获得索引范围扫描操作,请在 bare 列上进行比较。

    例如:

     SELECT t.text
          , t.date_column
       FROM table1 t
      WHERE t.date_column >= '2015-01-01'
        AND t.date_column  < '2015-01-01' + INTERVAL 1 YEAR
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2014-09-01
      • 2015-12-13
      • 2016-11-10
      • 2021-01-06
      相关资源
      最近更新 更多