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
    • 最新
    • 标签
主页 / user-164773

Geezer's questions

Martin Hope
Geezer
Asked: 2024-06-21 18:04:22 +0800 CST

当现有列被删除并替换为同名但经过计算的列时,视图无法识别对基础表的更改

  • 13

我的理解是,当创建一个视图时,其定义存储在元数据 sys.tables 中。即sys.views。

此外,如果您使用SELECT * FROM它将存储精确的列名,例如SELECT a, b FROM。

即使您使用“CHECK OPTION” - 它仍然不会根据底层表进行验证。

另一方面,“SCHEMABINDING”将根据底层表进行验证。

我的问题是,当表中的某一列dropped被替换为同名列时,但是computed当您查询基于该表的视图时会发生一些奇怪的事情。

这是一个例子。

DROP TABLE IF EXISTS dbo.Test1;
DROP TABLE IF EXISTS dbo.Test2;
GO
CREATE TABLE dbo.Test1
(
    Id          INT IDENTITY(1,1) PRIMARY KEY ,
    Test1Col1   VARCHAR(80) NULL ,
    Test1Col2   VARCHAR(80) NULL ,
    Test1Col3   VARCHAR(80) NULL 
);
CREATE TABLE dbo.Test2
(
    Id          INT IDENTITY(1,1) PRIMARY KEY ,
    Test2Col1   VARCHAR(80) NULL ,
    Test2Col2   VARCHAR(80) NULL ,
    Test2Col3   VARCHAR(80) NULL ,
    Test1Id     INT 
);
GO
INSERT INTO dbo.Test1
    (Test1Col1, Test1Col2, Test1Col3)
VALUES 
    ('Test1Col1Data1', 'Test1Col2Data1', 'Test1Col3Data1') ,
    ('Test1Col1Data2', 'Test1Col2Data2', 'Test1Col3Data2') ,
    ('Test1Col1Data3', 'Test1Col2Data3', 'Test1Col3Data3') ;
GO
INSERT INTO dbo.Test2
    (Test2Col1, Test2Col2, Test2Col3, Test1Id)
VALUES 
    ('Test2Col1Data1', 'Test2Col2Data1', 'Test2Col3Data1', 1) ,
    ('Test2Col1Data2', 'Test2Col2Data2', 'Test2Col3Data2', 2) ,
    ('Test2Col1Data3', 'Test2Col2Data3', 'Test2Col3Data3', 3) ;
GO

创建基于表的视图。

CREATE OR ALTER 
    VIEW    dbo.View1 
AS

    SELECT T1.*, T2.*
    FROM    (
            SELECT  TestId = T.Id
            FROM    dbo.Test1   T
        )   T1
    INNER JOIN  dbo.Test2   T2  ON  T2.Test1Id = T1.TestId ;
GO
SELECT  * FROM dbo.View1 ;
GO

您将获得以下结果集,

在此处输入图片描述

现在我ALTER表dbo.Test2。

DROP列Test2Col3 并将其替换为computed同名的列。

ALTER TABLE dbo.Test2
    DROP COLUMN Test2Col3 ;
ALTER TABLE dbo.Test2
    ADD Test2Col3 AS Test2Col1;
GO

现在,当我查询视图时,我得到以下结果集。

SELECT  * FROM dbo.View1 ;
GO

在此处输入图片描述

列中的数据Test2Col3看起来Test1Id已左移 1。

我期望看到的Test2Col3正在被展示Test1Id,反之亦然。

在此处输入图片描述

这是为什么?
我知道刷新视图或更改视图会更正此问题,但列名并未更改。我已在 SQL-2022 和 Azure SQL 数据库中复制了此问题。

sql-server
  • 3 个回答
  • 829 Views
Martin Hope
Geezer
Asked: 2023-09-11 16:26:59 +0800 CST

当我有索引时获取 SORT 运算符

  • 8

在 Azure SQL 数据库(SQL2019 兼容)上,我有一个 ETL 进程,它以 DeltaTrack 模式填充 HISTORY 表。

在 Proc 中,有一个对 HISTORY 表的更新,查询引擎正在使用 SORT,但我有一个应该覆盖它的索引。

此 UPDATE 的用例是针对现有行,自从该行首次添加到 HISTORY 表以来,我们已向摄取添加了额外的列。

这种排序会导致我们更大/更宽的表上的更新速度极其缓慢。

如何调整索引或查询以删除查询 3中的排序?

这是根据京东要求更新的 执行计划

这是 DDL。

DROP TABLE IF EXISTS dbo.STAGE;
GO
CREATE TABLE dbo.STAGE
(
    Id varchar(18) NULL,
    CreatedDate varchar(4000) NULL,
    LastModifiedDate varchar(4000) NULL,
    LastReferencedDate varchar(4000) NULL,
    [Name] varchar(4000) NULL,
    OwnerId varchar(4000) NULL,
    SystemTimestamp datetime2(7) NULL
)
GO

DROP TABLE IF EXISTS dbo.HISTORY;
GO
CREATE TABLE dbo.HISTORY
(
    HistoryRecordId int IDENTITY(1,1) NOT NULL,
    [Hash] binary(64) NOT NULL,
    [IsActive]  BIT NOT NULL ,
    ActiveFromDateTime datetime2(7) NOT NULL,
    ActiveToDateTime datetime2(7) NOT NULL,
    Id varchar(18) NOT NULL,
    CreatedDate datetime2(7) NULL,
    LastModifiedDate datetime2(7) NULL,
    LastReferencedDate datetime2(7) NULL,
    [Name] varchar(80) NULL,
    OwnerId varchar(18) NULL,
    SystemTimestamp datetime2(7) NULL
) 
GO
CREATE UNIQUE CLUSTERED INDEX [CL__HISTORY] ON dbo.HISTORY
(
    Id , 
    [ActiveToDateTime] ASC,
    [IsActive] ASC
)
GO
CREATE NONCLUSTERED INDEX [IX__HISTORY_IsActive] ON dbo.HISTORY
(
    [Id] ASC
)
INCLUDE([IsActive],[ActiveToDateTime]) 
GO

DROP TABLE IF EXISTS #updates;
GO


WITH src AS (
  SELECT 
    CONVERT(VARCHAR(18), t.[Id]) AS [Id]
  , CONVERT(DATETIME2, t.[CreatedDate]) AS [CreatedDate]
  , CONVERT(DATETIME2, t.[LastModifiedDate]) AS [LastModifiedDate]
  , CONVERT(DATETIME2, t.[LastReferencedDate]) AS [LastReferencedDate]
  , CONVERT(VARCHAR(80), t.[Name]) AS [Name]
  , CONVERT(VARCHAR(18), t.[OwnerId]) AS [OwnerId]
  , CONVERT(DATETIME2, t.SystemTimestamp) AS SystemTimestamp
  , dgst.[Hash]
  , CONVERT(DATETIME2, SystemTimestamp) AS [ActiveFromDateTime]
  , RN = ROW_NUMBER() OVER ( 
            PARTITION BY 
                t.[Id] 
                ORDER BY CONVERT(DATETIME2, SystemTimestamp) DESC
        ) 
  FROM dbo.STAGE t
    OUTER APPLY (
      SELECT 
        CAST(HASHBYTES('SHA2_256',
          COALESCE(CAST([CreatedDate] AS NVARCHAR(4000)), N'')
            + N'||' + COALESCE(CAST([LastModifiedDate] AS NVARCHAR(4000)), N'')
            + N'||' + COALESCE(CAST([LastReferencedDate] AS NVARCHAR(4000)), N'')
            + N'||' + COALESCE(CAST([Name] AS NVARCHAR(4000)), N'')
            + N'||' + COALESCE(CAST([OwnerId] AS NVARCHAR(4000)), N'')
            + N'||' + COALESCE(CAST(SystemTimestamp AS NVARCHAR(4000)), N'')
        ) AS BINARY(64)) AS [Hash]
      ) dgst
), tgt AS (
  SELECT *
  FROM dbo.HISTORY t
  WHERE t.[ActiveToDateTime] > GETUTCDATE()
  AND 1 = 1  
)
SELECT 
  tgt.HistoryRecordId
, src.*
INTO #updates
FROM src
  LEFT JOIN tgt 
    ON tgt.[Id] = src.[Id] WHERE src.RN = 1;  
GO

--Create index on temp table (#updates) 
CREATE NONCLUSTERED INDEX NCCI_#updates__Kimble_HISTORY_ForecastStatus 
    ON #updates ( [Id] , ActiveFromDateTime, [Hash] );
GO  


    UPDATE  tgt 
    SET
      tgt.[Hash]        = src.[Hash] 
    , tgt.IsActive      = 1
    , tgt.[CreatedDate] = src.[CreatedDate]
    , tgt.[LastModifiedDate]    = src.[LastModifiedDate]
    , tgt.[LastReferencedDate]  = src.[LastReferencedDate]
    , tgt.[Name]            = src.[Name]
    , tgt.[OwnerId]         = src.[OwnerId]
    , tgt.SystemTimestamp   = src.SystemTimestamp
    FROM dbo.HISTORY tgt
      INNER JOIN #updates src   
            ON tgt.[Id] = src.[Id]
            AND src.[ActiveFromDateTime] = tgt.[ActiveFromDateTime] 
            AND tgt.[Hash]  <> src.[Hash] ; 
GO
sql-server
  • 3 个回答
  • 318 Views
Martin Hope
Geezer
Asked: 2022-12-05 04:28:22 +0800 CST

在 CHANGE TRACKING 中更新行时,SYS_CHANGE_OPERATION 未显示正确的值

  • 8

更新行时,SYS_CHANGE_OPERATION 列在查询CHANGETABLE时仍显示 I(插入)而不是 U(更新) 。

这就是我在做什么。

USE master
GO
CREATE DATABASE TestCT ; 
GO
SELECT compatibility_level , @@VERSION 
FROM sys.databases WHERE name = 'TestCT'; 

compatibility_level = 160
@@Version = Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) Oct 8 2022 05:58:25 版权所有 (C) 2022 Microsoft Corporation Developer Edition (64-bit) o​​n Windows 10 Pro 10.0 (Build 19045:)(管理程序)

ALTER DATABASE TestCT
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) ; 

USE TestCT;
GO
DROP TABLE IF EXISTS dbo.TestCT
CREATE TABLE dbo.TestCT(
    Id      INT IDENTITY (1,1) CONSTRAINT PK__TestCT PRIMARY KEY ,
    Col1    VARCHAR(100)
) ; 
GO

ALTER TABLE dbo.TestCT
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON) ; 
GO

INSERT INTO dbo.TestCT  (Col1)
            VALUES      ('INSERT1') ; 
GO
SELECT * 
FROM CHANGETABLE (CHANGES dbo.TestCT,0) as  CT 
LEFT JOIN dbo.TestCT         EM ON CT.Id = EM.Id
ORDER BY SYS_CHANGE_VERSION ; 
GO

在此处输入图像描述

SYS_CHANGE_OPERATION正如预期的那样,这是我(插入)。

现在,如果我更新行

UPDATE  T 
SET     Col1 = 'UPDATE'
FROM    dbo.TestCT   T 
WHERE   Col1 = 'INSERT1';
GO

在此处输入图像描述

SYS_CHANGE_OPERATION这里仍然是 I(插入)而不是 U(更新)。如您所见SYS_CHANGE_VERSION,已按预期增加了 1。

我在这里做错了什么?

sql-server
  • 1 个回答
  • 160 Views
Martin Hope
Geezer
Asked: 2022-10-10 05:53:11 +0800 CST

为什么当我有索引时会得到排序?

  • 7

Azure SQL 数据库。

我有一个表,我需要从中获取第一行和最近的行,Col1并Col2基于CreateDate.

CREATE TABLE dbo.table1 (
    Id            INT    IDENTITY(1,1) PRIMARY KEY ,
    Col1        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    Col2        VARCHAR(255) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL ,
    CreateDate    DATETIME NOT NULL
) ;

我有一个像这样的索引:

CREATE INDEX IX__table1_ASC
ON dbo.table1 (Col1, Col2, CreateDate );

我获取第一行的查询是(在此处计划):

--Get the first row
SELECT    TOP (1) WITH TIES
        *
FROM    table1
ORDER BY ROW_NUMBER()
        OVER (PARTITION BY Col1, Col2
              ORDER BY CreateDate );

索引扫描使用的是IX__table1_ASC我创建的索引 (),但为什么我得到一个排序?

在此处输入图像描述

我获取最新行的查询(在此处计划):

--get latest row
SELECT    TOP (1) WITH TIES
        *
FROM    table1
ORDER BY ROW_NUMBER()
        OVER (PARTITION BY Col1, Col2
              ORDER BY CreateDate DESC); --desc here

同样,索引扫描使用的是索引 ( IX__table1_ASC),但这次我得到了两种。索引扫描后的第一个。优化器还不够聪明,无法以相反的顺序读取索引吗?再说一次,第二类是干什么用的?

实际的表非常大,因此您可以想象排序的成本很高。我怎样才能在这里最好地优化?

在此处输入图像描述

sql-server query-performance
  • 1 个回答
  • 1618 Views
Martin Hope
Geezer
Asked: 2022-09-14 02:21:17 +0800 CST

TSQL 慢查询,未按预期使用索引

  • 0

我有一个在 Azure SQL 数据库上运行的宽表,相对较大,有 14,264,775 行。

以下查询需要一些 TLC。

IF EXISTS (
    SELECT  1/0 
    FROM dbo.table1 src
      INNER JOIN dbo.table1 tgt 
        ON tgt.Col1 = src.Col1
    WHERE tgt.ValidFrom <= src.ValidTo
    AND tgt.ValidTo >= src.ValidFrom
    AND tgt.RecordId <> src.RecordId  
)
 BEGIN
    RAISERROR('Overlap detected in dbo.table1', 11, 1); 
 END ;

我有这个索引。

CREATE NONCLUSTERED INDEX [IX__table1] ON dbo.table1
        ( Col1 ) 
INCLUDE (ValidFrom, ValidTo, RecordId)
GO

这是查询中的 io 统计信息。逻辑读取是通过屋顶。

在此处输入图像描述

这是计划 XML。我尝试了 PasteThePlan,但它不会解析计划 XML。(也许它不喜欢 Axure sql 数据库计划 xml)。

如您所见, [src] 上有一个索引扫描;读取 14,264,775 行(与表中的所有行数相同)。并在 [tgt] 上进行索引查找;读取 194,405,307 行。

我需要更改什么来提高查询的性能?

在 1400 万行中,有 210 万个唯一的 Col1 值。

sql-server query-performance
  • 2 个回答
  • 125 Views
Martin Hope
Geezer
Asked: 2022-08-08 07:51:04 +0800 CST

SQL 所有的 Procs 都有 WITH RECOMPLILE 所以如何维护一个臃肿的计划缓存

  • 0

我正在使用在 Azure SQL 数据库中创建的星型模式数据仓库,其中最后一个开发人员包含WITH RECOMPILE在所有 Procs 中。

我认为这是因为 ETL 每天只执行这些 Procs 两次,因此重新编译的开销很小。

但是,是否存在缓存因所有这些计划而变得臃肿的风险,如果是这样,维护计划缓存以使其保持精简和尽可能高效的最佳方法是什么?

azure-sql-database execution-plan
  • 1 个回答
  • 33 Views
Martin Hope
Geezer
Asked: 2022-02-03 10:05:07 +0800 CST

TSQL 查询以相互匹配不同长度的字符串

  • 4

我正在编写一个 TVF 来查询一个大表(数千万行),其中该表中的字符串(邮政编码)与另一个表中的字符串(部分邮政编码(输出代码/扇区部分))匹配。

我遇到了一个我无法解决的边缘情况。

对于那些不熟悉英国邮政编码的人 在此处输入图像描述

这是一些示例数据。

DECLARE @tab1 TABLE (Sk INT, Postcode VARCHAR(8))
DECLARE @tab2 TABLE (Sk INT, Coverage VARCHAR(8)) 

INSERT INTO @tab1 (Sk, Postcode) VALUES (1, 'E12 5HH'), (6, 'SW1X 6AA')
INSERT INTO @tab2 (Sk, Coverage) VALUES (1, 'E12'), (1, 'E12 5'), 
                                        (2, 'E1'), (2, 'E11'), (2, 'E13'), 
                                        (3, 'E12 6'),
                                        (4, 'E12 5') ,
                                        (5, 'E12') ,
                                        (7, 'SW1') ,
                                        (8, 'SW1X') 

而我目前的查询

SELECT  S.Sk, 
        S.Postcode, 
        CoverageSk = X.Sk, 
        X.Coverage 
FROM        @tab1   S 
OUTER APPLY (
    SELECT  Sk , 
            Coverage , 
            [Length] = LEN(Coverage) 
    FROM    @tab2
)   X 
WHERE   S.Sk <> X.Sk 
AND     LEFT(S.Postcode,X.[Length] ) = X.Coverage 

这些是我的结果。

在此处输入图像描述

第 1 行和第 4 行的数据不应出现在结果中。第 1 行,覆盖范围或外码“E1”与邮政编码“E12 5HH”的外码部分(“E12”)不同。

对于第 4 行,覆盖范围或输出代码“SW1”与邮政编码“SW1X 6AA”的输出代码(“SW1X”)部分不同。

sql-server query-performance
  • 1 个回答
  • 173 Views
Martin Hope
Geezer
Asked: 2019-03-22 05:56:25 +0800 CST

使用 SQL Server 身份验证与 Azure SQL 数据库的连接缓慢

  • 5

在 SSMS 中,当使用服务帐户和 SQL 服务器身份验证连接到我们的任何 Azure SQL 数据库时,连接本身可能需要 10 到 15 秒才能建立。

连接后,右键单击任何表并单击“选择前 1000 行”,这也需要 10 到 15 秒来响应并在 SSMS 中显示行。

使用“Active Directory - Universal with MFA Supprt”身份验证时不会发生这种延迟/延迟 - 但是,这不是使用相同的服务帐户。

如何解决/调查 SQL Server 身份验证滞后?

sql-server ssms
  • 3 个回答
  • 2697 Views
Martin Hope
Geezer
Asked: 2019-03-08 06:36:23 +0800 CST

SSRS Azure SQL 数据库 Active Directory - 通用 MFA

  • 3

有谁知道Reporting Services 何时会包含对Active Directory - Universal with MFA的支持?

它在 SSMS 中可用。

Visual Studio 2017 数据源属性

SSRS 数据源属性

报表服务器数据源属性

报表服务器数据源属性

sql-server ssrs
  • 2 个回答
  • 602 Views
Martin Hope
Geezer
Asked: 2019-03-06 05:05:33 +0800 CST

Azure SQL 数据库和数据库维护

  • 1

如果 SQL 代理不适用于 Azure SQL 数据库,那么是否可以使用 Ola Hallengren 的维护脚本维护(索引、统计等)数据库?

sql-server azure-sql-database
  • 1 个回答
  • 1136 Views
Martin Hope
Geezer
Asked: 2019-02-20 02:11:48 +0800 CST

批处理模式是否仅适用于 ColumnStore 索引上的聚合函数

  • 2

Azure SQL 数据库 - 标准版(S3 服务层级)

为什么批处理模式只有在使用聚合函数时才会生效?

DROP TABLE IF EXISTS dbo.TransCS

CREATE TABLE dbo.TransCS (
     Col1 INT 
    ,Col2 AS Col1*2
)
CREATE CLUSTERED COLUMNSTORE INDEX CS_TransCS on dbo.TransCS;

WITH
    L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
    L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
    L5   AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
    Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    AS n FROM L5)
INSERT INTO dbo.TransCS (Col1)
SELECT TOP (1000000) n FROM Nums ORDER BY n; 

插入 100 万行

行处理

SELECT * FROM dbo.TransCS

执行计划

批量处理

SELECT Col1, Col2, SUM(Col2)OVER ()
FROM dbo.TransCS

执行计划

有没有办法在不使用 Agg 函数的情况下利用性能优势?这方面的文档很薄。

sql-server performance
  • 1 个回答
  • 109 Views

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