AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 299345
Accepted
Racer SQL
Racer SQL
Asked: 2021-09-10 09:32:50 +0800 CST2021-09-10 09:32:50 +0800 CST 2021-09-10 09:32:50 +0800 CST

调 WHERE datediff

  • 772

我的查询运行有点慢,我认为这是因为该where datediff功能。

WHERE DateDiff(minute, TB1.stDate, getdate()) > 50

(使用这种方法至少是使用我创建的索引)

在此之前是这样的:

datediff(minute, TB1.stDate), '2017-01-01') <= 0)

我想了解是否有更好的方法来过滤 datediff。

我的问题是,我的查询是如何使用索引的,即使在DATEDIFF函数内部也是如此。

sql-server sql-server-2016
  • 2 2 个回答
  • 147 Views

2 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2021-09-10T09:55:06+08:002021-09-10T09:55:06+08:00

    永远不要将函数应用于列,这意味着没有索引可以用于查找并且使得基数估计非常困难。说“使用索引”并不能很好地说明这样做是否值得或是否值得。

    首先,为了避免将函数应用于列...

    WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
    

    ...可以改写为...

    WHERE TB1.stDate < DATEADD(MINUTE, -50, GETDATE());
    

    您的原始查询说“查找表中日期与现在之间的差异大于 50 分钟的任何行”,这意味着“查找表中日期早于 50 分钟前的任何行”。所以,我从现在减去 50 分钟,并查询比这更早的日期值。另一个更详细的答案在这里。

    我怀疑您的索引正在被扫描,因为它涵盖了查询(如果您包含索引定义、查询的其余部分和执行计划,您可能会比猜测更好)。

    • 10
  2. CPM
    2021-09-10T12:54:43+08:002021-09-10T12:54:43+08:00

    我想知道如果那样的话会不会更快

    DATEADD(MINUTE, -50, GETDATE()) 
    

    子句是预先计算的 SQL 变量?

    DECLARE @threshold DATETIME = DATEADD(MINUTE, -50, GETDATE());
    
    ...
    WHERE TB1.stDate < @threshold
    

    从那以后,我受到 Erik Darling 和 Aaron Bertrand 的教育,使用变量通常比使用表达式更糟糕!感谢他们俩!我会在此处留下此回复,以防将来对其他人有帮助。一定要阅读他们的回复!

    • -4

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve