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 / 问题 / 243667
Accepted
IronicMuffin
IronicMuffin
Asked: 2019-07-25 05:36:04 +0800 CST2019-07-25 05:36:04 +0800 CST 2019-07-25 05:36:04 +0800 CST

SQL Server 日期相关优化是否仅适用于 DateTime 字段,还是 Date 也适用?

  • 772

我问是因为这是我最近才发现的一个较旧的功能。该文档多次提到 DateTime,但没有明确说明其他日期类型是否兼容。

我有一个我相信可以从中受益的数据仓库,但 90% 的重要日期是日期类型,而不是日期时间。我使用的是 SQL 2014,但任何版本的信息都会有所帮助。

sql-server sql-server-2014
  • 1 1 个回答
  • 217 Views

1 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2019-07-25T06:25:23+08:002019-07-25T06:25:23+08:00

    是的,它适用于date和datetime列。实验相当简单 - 创建一个带有选项的数据库,创建具有两种类型的表,插入满足相关模式的数据(就像一个表中的所有日期都在另一个表中的日期之后),运行一些利用它的查询模式,然后观察自动创建的统计数据对于两组表是相同的。

    创建数据库并打开选项:

    USE master;
    GO
    CREATE DATABASE splut;
    GO
    ALTER DATABASE splut SET DATE_CORRELATION_OPTIMIZATION ON;
    GO
    USE splut;
    GO
    

    创建两个具有相关date列的表,以及两个具有相关datetime列的表:

    CREATE TABLE dbo.d1(id int primary key, d date);
    CREATE TABLE dbo.d2(id int not null foreign key references dbo.d1(id), d date);
    CREATE TABLE dbo.d3(id int primary key, d datetime);
    CREATE TABLE dbo.d4(id int not null foreign key references dbo.d3(id), d datetime);
    GO
    

    插入一些相关数据:

    INSERT dbo.d1(id, d) SELECT DISTINCT ABS(object_id),'20190101' FROM sys.all_objects;
    INSERT dbo.d2(id, d) SELECT id,DATEADD(DAY, ABS(id)%20, '20190101') FROM dbo.d1;
    INSERT dbo.d3(id, d) SELECT DISTINCT ABS(object_id),'20190101' FROM sys.all_objects;
    INSERT dbo.d4(id, d) SELECT id,DATEADD(DAY, ABS(id)%20, '20190101') FROM dbo.d3;
    

    现在运行一个可能从相关统计中受益的查询(虽然,实际上,任何连接都可以):

    SELECT TOP (10) * FROM dbo.d1 INNER JOIN dbo.d2 ON d1.d = d2.d;
    SELECT TOP (10) * FROM dbo.d3 INNER JOIN dbo.d4 ON d3.d = d4.d;
    

    现在,检查统计数据:

    SELECT OBJECT_NAME(s.object_id), s.name, s.stats_id, 
       sc.stats_column_id, c.name, c.system_type_id, t.name
    FROM sys.stats AS s 
    INNER JOIN sys.stats_columns AS sc
    ON s.object_id = sc.object_id
    INNER JOIN sys.columns AS c
    ON sc.object_id = c.object_id AND sc.column_id = c.column_id
    INNER JOIN sys.types AS t
    ON c.system_type_id = t.system_type_id
    CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS p
    WHERE s.auto_created = 1 AND OBJECT_NAME(s.object_id) IN (N'd1',N'd2',N'd3',N'd4');
    

    我机器上的结果(您的统计信息名称会有所不同)显示统计信息是在(id, date/datetime column of parent)和上创建的(date/datetime column of child):

    在此处输入图像描述

    如果这适用于 , 和 ,或者如果一列是 ,另一列是 ,我将把它time作为datetime2练习datetimeoffset留给date读者datetime。

    • 1

相关问题

  • 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