您有一个接受日期时间数组的存储过程,这些数组被加载到临时表中,并用于过滤表中的日期时间列。
\n编写查询来执行过滤的最有效方法是什么?
\nUSE 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);\nRun Code Online (Sandbox Code Playgroud)\n我能得到的最好的就是EXISTS像这样使用:
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 优化器如何处理 #temp 表的文档。
如果我有 4 个连接到一个 #temp 表,其中该 #temp 表是在存储过程执行期间创建的,并且 #temp 表可能包含零到多个记录,如何估计?
估计和join中的一些表一样大,因为在CREATE/ALTER的时候没有统计?估计很小?估计和其他#temporary表一样吗?
请注意,这是假设在执行时没有重新编译并且使用原始的。
我正在努力诊断 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 对此非常满意,并且查询得以执行。
谢谢。
我有一个包含以下内容的示例数据文件,并使用 UTF8 编码保存。
\noab~opqr\n\xc3\xb6ab~\xc3\xb6pqr\n\xc3\xb6ab~\xc3\xb6pqr\nRun 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 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 时间序列表:
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) 问题陈述我刚刚在示例 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 中使用大对象 (LOB) 数据类型的变量时,整个变量是否始终保存在内存中?即使是2GB大小?
我对 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) 我有一个繁忙的数据库,它已经繁忙多年,并且我看到事务日志大小每天约为几 GB。
在过去几周内,事务日志大小已增加到每 6 小时 40-50 GB。这对我的备份产生了很大的影响,并且磁盘的大小也令人担忧。
我每隔一天进行一次完整备份,每 6 小时进行一次日志备份。
日志备份按预期减少了事务日志使用量的大小,但它又开始迅速增加。
如何发现导致交易量相对突然增加的原因?
我该如何进一步调查?
sql-server ×10
backup ×1
blob ×1
case ×1
dbcc-checkdb ×1
encoding ×1
index-tuning ×1
memory ×1
openrowset ×1
t-sql ×1
update ×1