标签: sql-server

提高多个日期范围谓词的性能

比方说

\n

您有一个接受日期时间数组的存储过程,这些数组被加载到临时表中,并用于过滤表中的日期时间列。

\n
    \n
  • 可以插入任意数量的值作为开始日期和结束日期。
  • \n
  • 日期范围有时可能会重叠,但这不是我经常依赖的情况。
  • \n
  • 也可以提供带有时间的日期。
  • \n
\n

编写查询来执行过滤的最有效方法是什么?

\n

设置

\n
USE StackOverflow2013;\n\nCREATE TABLE\n    #d\n(\n    dfrom datetime,\n    dto datetime,\n    PRIMARY KEY (dfrom, dto)\n)\nINSERT\n    #d\n(\n    dfrom,\n    dto\n)\nSELECT\n    dfrom = \'2013-11-20\',\n    dto =   \'2013-12-05\'\nUNION ALL\nSELECT\n    dfrom = \'2013-11-27\',\n    dto =   \'2013-12-12\'; \n\nCREATE INDEX\n    p\nON dbo.Posts\n    (CreationDate)\nWITH\n    (SORT_IN_TEMPDB = ON, DATA_COMPRESSION = PAGE);\n
Run Code Online (Sandbox Code Playgroud)\n

询问

\n

我能得到的最好的就是EXISTS像这样使用:

\n
SELECT\n    c = COUNT_BIG(*)\nFROM dbo.Posts AS p\nWHERE EXISTS\n(\n    SELECT\n        1/0\n    FROM #d AS d\n    WHERE p.CreationDate …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2019 query-performance

10
推荐指数
1
解决办法
1862
查看次数

估计基数时,优化器如何处理尚未填充的 #temp 表?

我一直在构建存储过程,但找不到任何关于 SQL Server 优化器如何处理 #temp 表的文档。

如果我有 4 个连接到一个 #temp 表,其中该 #temp 表是在存储过程执行期间创建的,并且 #temp 表可能包含零到多个记录,如何估计?

估计和join中的一些表一样大,因为在CREATE/ALTER的时候没有统计?估计很小?估计和其他#temporary表一样吗?

请注意,这是假设在执行时没有重新编译并且使用原始的。

sql-server temporary-tables cardinality-estimates

9
推荐指数
2
解决办法
425
查看次数

TSQL 查询中奇怪的条件语法:“<=+” 它有什么作用?

我正在努力诊断 TSQL 中遗留查询的问题。查询中返回的列之一是:

CASE WHEN PaidDate >= '2021-01-01' AND PaidDate <=+'2021-10-31' THEN WO ELSE 0 END AS dYTDWO, 
Run Code Online (Sandbox Code Playgroud)

我以前没有见过“<=+”作为条件,并且在网上找不到任何对此的参考。

谁能对此做出解释?SSMS 对此非常满意,并且查询得以执行。

谢谢。

sql-server t-sql case

9
推荐指数
1
解决办法
1029
查看次数

是否可以使用 OPENROWSET 导入固定宽度的 UTF8 编码文件?

我有一个包含以下内容的示例数据文件,并使用 UTF8 编码保存。

\n
oab~opqr\n\xc3\xb6ab~\xc3\xb6pqr\n\xc3\xb6ab~\xc3\xb6pqr\n
Run Code Online (Sandbox Code Playgroud)\n

该文件的格式是固定宽度,第 1 至第 3 列各分配 1 个字符,第 4 列保留 5 个字符。

\n

我创建了一个 XML 格式文件,如下所示

\n
<?xml version = "1.0"?>  \n<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  \n   <RECORD>  \n      <FIELD xsi:type="CharFixed" ID="Col1" LENGTH="1"/>       \n      <FIELD xsi:type="CharFixed" ID="Col2" LENGTH="1"/> \n      <FIELD xsi:type="CharFixed" ID="Col3" LENGTH="1"/> \n      <FIELD xsi:type="CharFixed" ID="Col4" LENGTH="5"/> \n      <FIELD xsi:type="CharTerm" ID="LINE_BREAK" TERMINATOR="\\n"/> \n   </RECORD>  \n   <ROW>  \n      <COLUMN SOURCE="Col1" NAME="Col1" xsi:type="SQLNVARCHAR"/>  \n      <COLUMN SOURCE="Col2" NAME="Col2" xsi:type="SQLNVARCHAR"/> \n      <COLUMN SOURCE="Col3" NAME="Col3" xsi:type="SQLNVARCHAR"/>  \n      <COLUMN SOURCE="Col4" NAME="Col4" xsi:type="SQLNVARCHAR"/> …
Run Code Online (Sandbox Code Playgroud)

sql-server azure-sql-database encoding openrowset

9
推荐指数
2
解决办法
3030
查看次数

为什么此 TVF 使用 GETDATE() 作为输入参数时会抛出错误 9820?

我正在 SQL Server 2019 CU14 上进行测试。考虑针对兼容级别为 130 或 140 的 SQL Server 数据库创建的以下表值函数:

-- requires database compat 130 or 140 to see the issue
CREATE OR ALTER FUNCTION [dbo].[TVF_BUG_REPRO_2] (@O DateTime, @Z varchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT
CAST(
       CASE
              WHEN SZ.Zone1 > '' THEN (@O at time zone SZ.Zone1) at time zone 'Pacific Standard Time' 
              WHEN LEN(@Z) > 3 THEN (@O at time zone @Z) at time zone 'Pacific Standard Time'
              ELSE @O
       END AS DATETIME
) …
Run Code Online (Sandbox Code Playgroud)

sql-server table-valued-parameters sql-server-2019

9
推荐指数
1
解决办法
245
查看次数

如何使我的查询使用可用索引

我有以下 SQL 时间序列表:

CREATE TABLE [dbo].[SensorData](
 [DateTimeUtc] [datetime2](2) NOT NULL,
 [SensorId] [int] NOT NULL,
 [Key] [varchar](20) NOT NULL,
 [Value] [decimal](19, 4) NULL,
CONSTRAINT [PK_SensorData] PRIMARY KEY CLUSTERED 
(
  [SensorId] ASC,
  [Key] ASC,
  [DateTimeUtc] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = 
ON, Data_Compression=PAGE) ON PS_Daily(DateTimeUtc))
Run Code Online (Sandbox Code Playgroud)

现在基于这个索引,每个单独的查询都需要在查询where过滤器中包含以下参数:

CREATE TABLE [dbo].[SensorData](
 [DateTimeUtc] [datetime2](2) NOT NULL,
 [SensorId] [int] NOT NULL,
 [Key] [varchar](20) NOT NULL,
 [Value] [decimal](19, 4) NULL,
CONSTRAINT [PK_SensorData] PRIMARY KEY CLUSTERED 
(
  [SensorId] ASC,
  [Key] ASC,
  [DateTimeUtc] ASC
)WITH …
Run Code Online (Sandbox Code Playgroud)

sql-server index-tuning time-series-database

9
推荐指数
2
解决办法
788
查看次数

SQL Server 示例数据库 WideWorldImporters 失败 dbcc checkdb

问题陈述我刚刚在示例 WideWorldImporters 数据库上
运行。dbcc checkdb当我运行此命令时,我收到了 (4) 个有关统计数据损坏的错误,我不记得过去曾见过这些错误。虽然这只是一个示例数据库,但我很好奇,因为我不想在真实的数据库中看到类似的错误。

SSMS 和 Windows 版本
SSMS:18.10 (15.0.18390.0) / Windows 10:版本 21H1(操作系统内部版本 19043.1526)

SQL Server 开发人员版本
Microsoft SQL Server 2019 (RTM-CU13) (KB5005679) - 15.0.4178.1 (X64) 2021 年 9 月 23 日 16:47:49 版权所有 (C) 2019 Microsoft Corporation Developer Edition(64 位),适用于 Windows 10 Pro 10.0 (内部版本 19043:)

SSMS 中发出的命令:

dbcc checkdb ([WideWorldImporters]) with all_errormsgs, data_purity, extended_logical_checks , no_infomsgs;  
go
Run Code Online (Sandbox Code Playgroud)

错误信息

消息 9122,级别 16,状态 201,第 10 行
统计信息“sys.TT_OrderIDList_22AA2996.PK__TT_Order__C3905BAE80B57D6F”已损坏。
消息 9122,级别 16,状态 201,第 10 行 …

sql-server dbcc-checkdb sql-server-2019

9
推荐指数
2
解决办法
489
查看次数

SQL Server LOB 变量和内存使用情况

当我在 SQL Server 中使用大对象 (LOB) 数据类型的变量时,整个变量是否始终保存在内存中?即使是2GB大小?

sql-server memory database-internals blob

9
推荐指数
1
解决办法
707
查看次数

为什么 SQL Server 在更新位列时扫描所有行,即使是通过链接服务器进行主键

我对 SQL 链接服务器的特定主键使用简单的更新语句,如下所示

UPDATE t
SET
    processed = 1,
    processed_on = GETDATE()
FROM [LINKED\SERVER].DATABASE.dbo.FileQueue t
WHERE t.FileId = '3b33eff6-fde1-4e8c-9c23-2dbd45f50222'
Run Code Online (Sandbox Code Playgroud)

两台服务器都是SQL Server 2019。表定义是

CREATE TABLE dbo.FileQueue
(
    FileId UNIQUEIDENTIFIER NOT NULL,
    Processed BIT NOT NULL,
    Processed_on DATETIME NULL
 CONSTRAINT PK_FileQueue PRIMARY KEY CLUSTERED 
 (
    FileId ASC
 )
)
Run Code Online (Sandbox Code Playgroud)

已处理列具有位类型。由于全表扫描,查询速度很慢。

查询计划

为什么会发生这种情况?当我从语句中删除位列时,读取和更新单个远程行一切正常。

Id列是聚集主键。我有很多带有相似键的表。

我尝试使用CONVERTorCAST函数,结果是相同的。

对于没有位列的查询,执行计划非常好。

UPDATE t
SET
    --processed = 1,
    -- any other columns can be added to be updated except bit
    processed_on = GETDATE()
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan linked-server update

9
推荐指数
1
解决办法
884
查看次数

MS SQL Server 数据库事务日志增长率

我有一个繁忙的数据库,它已经繁忙多年,并且我看到事务日志大小每天约为几 GB。

在过去几周内,事务日志大小已增加到每 6 小时 40-50 GB。这对我的备份产生了很大的影响,并且磁盘的大小也令人担忧。

我每隔一天进行一次完整备份,每 6 小时进行一次日志备份。

日志备份按预期减少了事务日志使用量的大小,但它又开始迅速增加。

如何发现导致交易量相对突然增加的原因?

  • 我的开发人员正在对可能影响过去几周的变化进行空白
  • 没有长时间运行的进程
  • 没有计划的作业来执行索引操作
  • Redgate 监控未显示任何过度写入

我该如何进一步调查?

sql-server backup transaction-log sql-server-2017

9
推荐指数
1
解决办法
1020
查看次数