小编Art*_*yan的帖子

执行计划中缺少统计信息的警告

我有一个我无法理解的情况。我的 SQL Server 执行计划告诉我,我缺少表上的统计信息,但统计信息已经创建:

警告

但是如果我们查看表格,我们会看到有一个自动创建的统计信息:

在此处输入图片说明

有人可以帮助理解它是怎么回事吗?

Auto_Update 和 Auto_Create 统计信息在当前数据库上打开。

我正在使用 SQL Server 2014。

sql-server statistics sql-server-2014

33
推荐指数
3
解决办法
3万
查看次数

datetime 和 datetime2 的比较不正确

我知道隐式类型转换不是一个好习惯。但当较低的值突然变得较高时,这确实是意想不到的行为。

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。

sql-server datetime datetime2 sql-server-2016

15
推荐指数
1
解决办法
2469
查看次数

SQL Server 中的索引视图

我有一张桌子和一个索引视图,就像

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 企业版。

sql-server materialized-view sql-server-2014

11
推荐指数
2
解决办法
1234
查看次数

NCCI 中的 Lob 逻辑读取和 lob 预读

我有一个具有以下结构的测试表。

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)

该脚本执行了大约 …

sql-server columnstore sql-server-2017

8
推荐指数
2
解决办法
524
查看次数

关于隐式转换的警告

我有 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

7
推荐指数
2
解决办法
3390
查看次数

在 case 子句中使用默认值更新

我有一张像

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”附近的语法不正确

如何在子句中使用UPDATEwithDEFAULT语句CASE

sql-server sql-server-2014

5
推荐指数
1
解决办法
5648
查看次数

SQL Server 选择非选择性索引

我正在测试 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)

index sql-server optimization database-internals

4
推荐指数
1
解决办法
251
查看次数

对简单过程进行负载测试时编译/秒高

我正在尝试加载测试一个简单的插入存储过程:

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

4
推荐指数
1
解决办法
548
查看次数

触发器性能 - 1 个或 2 个触发器?

我有一个关于触发器性能的问题。

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。

非常感谢您的帮助。

trigger sql-server sql-server-2014

2
推荐指数
1
解决办法
298
查看次数

顶部等待中的 XE_SERVICES_RWLOCK

上一个版本发布后,我们开始面临一些不寻常的等待。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。

sequence identity sql-server-2016 waits

0
推荐指数
1
解决办法
196
查看次数

以最佳方式生成报告

我有一个具有以下结构的 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

-1
推荐指数
1
解决办法
81
查看次数