我有一个我无法理解的情况。我的 SQL Server 执行计划告诉我,我缺少表上的统计信息,但统计信息已经创建:
但是如果我们查看表格,我们会看到有一个自动创建的统计信息:
有人可以帮助理解它是怎么回事吗?
Auto_Update 和 Auto_Create 统计信息在当前数据库上打开。
我正在使用 SQL Server 2014。
我知道隐式类型转换不是一个好习惯。但当较低的值突然变得较高时,这确实是意想不到的行为。
declare @LastSelectedDate DATETIME = '2021-11-09 13:52:29.187'
declare @LastSelectedDate_1 DATETIME2(7) = '2021-11-09 13:52:29.1866667'
SELECT IIF(@LastSelectedDate_1 > CAST(@LastSelectedDate AS DATETIME2), 1, 0)
SELECT IIF(@LastSelectedDate_1 > @LastSelectedDate, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我遗漏了什么?我正在使用 SQL Server 2016。
我有一张桌子和一个索引视图,就像
Create table mytable1 (ID int identity(1,1), Name nvarchar(100))
Create table mytable2 (ID int identity(1,1), Name nvarchar(100))
Create view myview
with schemabinding
as
select a.name, b.name
from mytable1 a
join mytable2 b on a.Id = b.Id
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行以下查询
select a.name, b.name
from mytable1 a
join mytable2 b on a.Id = b.Id
Run Code Online (Sandbox Code Playgroud)
它不使用我的索引视图。是否有任何提示(或其他方式)可以强制 SQL Server 改用索引视图?
我有一个很大的系统,需要优化它。我无法更改所有 SQL 脚本以从视图而不是表中进行选择。我想创建索引视图并强制 SQL Server 从它们而不是表中获取数据。
我使用的是 SQL Server 2014 企业版。
我有一个具有以下结构的测试表。
CREATE TABLE [dbo].[DW_test](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[CourtCaseID] [int] NOT NULL,
[ActionID] [int] NOT NULL,
PRIMARY KEY CLUSTERED([ID] ASC)
Run Code Online (Sandbox Code Playgroud)
接下来,我使用以下脚本在我的表中填充了大约 4.7 亿条记录。
insert into DW_test
--select count(*)
--from (
select top 1000000 abs(checksum(newid())) % 100000 + 1 a, abs(checksum(newid())) % 10 + 1 b
from sys.all_objects
cross join sys.all_objects a
cross join sys.all_objects b
cross join sys.all_objects c
cross join sys.all_objects d
cross join sys.all_objects e
cross join sys.all_objects f
cross join sys.all_objects g
--) t
GO
Run Code Online (Sandbox Code Playgroud)
该脚本执行了大约 …
我有 2 个名称列的表:
CREATE TABLE Test
(
TestID int identity primary key clustered
, Name_Eng nvarchar(50)
, Name_Nat nvarchar(50)
)
Run Code Online (Sandbox Code Playgroud)
现在我需要一个查询来让这个Name
列用 分隔,
,像这样:
DECLARE @NameColumns NVARCHAR(1024)
SET @NameColumns = STUFF(
(SELECT ',' + 'Test.' + name AS [text()]
FROM ( SELECT c.name
FROM sys.columns c
INNER JOIN sys.tables t ON t.object_id = c.object_id
WHERE t.name = 'Test'
AND c.name LIKE 'Name_%'
) AS D
FOR XML PATH('') ,
TYPE).value('.[1]', 'VARCHAR(MAX)'), 1, 1,
N'')
select @NameColumns
Run Code Online (Sandbox Code Playgroud)
但是这个查询在执行计划中有一个警告:
有什么办法可以消除这个警告吗?
performance sql-server cardinality-estimates query-performance
我有一张像
CREATE TABLE Mytable (ID int identity, Name nvarchar(10));
GO
INSERT INTO MyTable (Name) VALUES ('test1');
INSERT INTO MyTable (Name) VALUES ('test2');
GO
ALTER TABLE MyTable ADD CONSTRAINT DF_Name DEFAULT('test') FOR Name;
Run Code Online (Sandbox Code Playgroud)
现在我想像这样更新我的 Name 列:
Update MyTable
set name = case ID when 1 then DEFAULT END;
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
关键字“DEFAULT”附近的语法不正确
如何在子句中使用UPDATE
withDEFAULT
语句CASE
?
我正在测试 SQL Server 索引并发现非常奇怪的行为。这是我的代码:
DROP TABLE IF EXISTS dbo._Test
DROP TABLE IF EXISTS dbo._Newtest
GO
CREATE TABLE _Test(
ID INT NOT NULL,
UserSystemID INT NOT NULL,
Age INT
)
GO
INSERT INTO dbo._Test
( ID, UserSystemID, Age )
SELECT TOP 10000000 ABS(CHECKSUM(NEWID())) % 5000000, ABS(CHECKSUM(NEWID())) % 2, ABS(CHECKSUM(NEWID())) % 100
FROM sys.all_columns
CROSS JOIN sys.all_objects a
CROSS JOIN sys.all_objects b
CROSS JOIN sys.all_objects c
; WITH cte AS (
SELECT ID, UserSystemID, age, ROW_NUMBER() OVER(PARTITION BY ID, UserSystemID ORDER BY …
Run Code Online (Sandbox Code Playgroud) 我正在尝试加载测试一个简单的插入存储过程:
CREATE TABLE _test(ID BIGINT)
GO
CREATE OR ALTER PROCEDURE dbo.test_sp
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO _test
SELECT CAST(RAND() * 10000 AS BIGINT)
END
END
Run Code Online (Sandbox Code Playgroud)
当我使用 SQL Stress 工具执行此存储过程时,我得到的SQL Compilations/sec等于Batch Requests/sec。有趣的是,SQL 重新编译/秒为零。
两者都针对临时工作负载进行优化,并启用强制参数化。即使我将程序更改为简单的,图片也是一样的SELECT 1
。
我正在使用 Microsoft SQL Server 2016 (SP3) (KB5003279)。
探查器跟踪显示该工具发送了一个简单的EXEC dbo.test_sp
sql-server stored-procedures sql-server-2016 performance-counters performance-testing
我有一个关于触发器性能的问题。
CREATE TABLE [dbo].[_test](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Date] [DATETIME] NULL,
[DateYearID] [INT] NULL,
[DateQuarterID] [INT] NULL,
[Date1] [DATETIME] NULL,
[Date1YearID] [INT] NULL,
[Date1QuarterID] [INT] NULL)
Run Code Online (Sandbox Code Playgroud)
现在我想要触发器,如果我更新 Date 列(或插入新行),必须更新 DateYearID 和 DateQuarterID 列,如果我更新 Date1 列(或插入新行),则必须更新 Date1YearID 和 Date1QuarterID 列。有什么更好的,有一个触发器,比如
IF UPDATE(DATE)
UPDATE _test SET DateYearID = ... , DateQuarterID = ...
IF UPDATE (DATE1)
UPDATE _test SET Date1YearID = ... , Date1QuarterID = ...
Run Code Online (Sandbox Code Playgroud)
或者有两个不同的触发器,第一个更新 DateYearID,DateQuarterID 列,第二个更新 DateYear1ID,DateQuarter1ID 列。
我正在使用 SQL Server 2014。
非常感谢您的帮助。
上一个版本发布后,我们开始面临一些不寻常的等待。XE_SERVICES_RWLOCK
等待开始出现在我们的顶级等待中。调查显示这种等待发生在插入我们的主 OLTP 表期间。我们在这部分中唯一改变的是我们通过插入序列来改变插入到标识列中。实际上我们还没有从列中删除身份选项。相反,我们只是在做
SET IDENTITY_INSERT ON
INSERT STATEMENT HERE
SET IDENTITY INSERT OFF
Run Code Online (Sandbox Code Playgroud)
我们没有删除身份属性的原因是它需要重建表,但我们的表很大,需要几个小时的停机时间。问题是什么是XE_SERVICES_RWLOCK
等待,它们是否会出现在大量语句的情况下SET IDENTITY_INSERT ON|OFF
,或者根情况是否可以使用sequence
而不是identity
?
我们sp_WhoIsActive
每 30 秒运行一次并将结果保存到表中以便以后调查问题。您可以从所附表格中看到结果。
我们使用的是 SQL Server 2016 SP2。
我有一个具有以下结构的 SQL Server 数据库
CREATE TABLE users (
userid INT IDENTITY PRIMARY KEY CLUSTERED,
age INT
)
GO
CREATE TABLE userstatus(
userstatusID INT IDENTITY PRIMARY KEY CLUSTERED,
statusid INT,
userid INT FOREIGN KEY REFERENCES dbo.users(userid)
)
GO
Run Code Online (Sandbox Code Playgroud)
一些示例数据:
INSERT INTO dbo.users
( age )
VALUES ( 15 -- age - int
),
( 20 ),
( 25 );
INSERT INTO dbo.userstatus
( statusid, userid )
VALUES ( 1, 1 ),
( 1, 2 ),
( 1, 3 ),
( 2, …
Run Code Online (Sandbox Code Playgroud) sql-server ×10
columnstore ×1
datetime ×1
datetime2 ×1
identity ×1
index ×1
optimization ×1
performance ×1
sequence ×1
statistics ×1
trigger ×1
waits ×1