标签: sql-server

从 nvarchar 列查找并显示特殊字符代码

我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符。

例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'

但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。

sql-server string-manipulation sql-server-2019

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

区分大小写不起作用

我遇到一个问题,我不断从下面的查询中获取值“CtP_PETER_Fact”。它应该是区分大小写的 where 子句。我尝试了几种不同的方法:在选择中的“Where ObjectName”之后、正则表达式之后设置 COLLATE 语句,并使用排序规则创建列。我不断得到我意想不到的输出。也许是我的正则表达式有问题?我也对正则表达式进行了很多实验,但似乎无法让它发挥作用。

IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;


CREATE TABLE #nameFacts (


    objectname varchar(200) COLLATE SQL_Latin1_General_CP1_CS_AS,
    ObjectType varchar(40)

)


insert into #nameFacts (objectname, ObjectType)
values
 ('BPD_Inslap_Fact','Fact')
,('CTP_HENK_FACT','Fact')
,('CTP_PETER_Fact','Fact')
,('CTP_PETER_FACT','Fact')
,('CtP_PETER_Fact','Fact')
,('C0P_PETER_Fact','Fact')
,('C0P_PETER_FACT','FACT')


SELECT *
FROM #nameFacts
WHERE
ObjectName --COLLATE SQL_Latin1_General_CP1_CS_AS 
            LIKE '[A-Z0-9][A-Z][A-Z][_][A-Z][A-Z][A-Z][A-Z][A-Z][_][F][a][c][t]' --COLLATE SQL_Latin1_General_CP1_CS_AS


IF OBJECT_ID('tempdb..#nameFacts') IS NOT NULL
DROP TABLE #nameFacts;
Run Code Online (Sandbox Code Playgroud)

我不断收到下面的输出,我不希望得到值“CtP_PETER_Fact”。我使用的是 SQL Server 2016 SP2 CU 17。

输出

sql-server collation sql-server-2016 string-searching

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

添加“前 20 个”会大大减慢查询速度!

我有一个疑问:

select * from Aview where field=20
order by id desc
Run Code Online (Sandbox Code Playgroud)

这将在大约 1 秒内从视图中返回 2700 行。

在查询中添加“top 20”使 MSSQL 在 43 秒内返回!

这是一个很难重现的问题,重建统计数据可以修复该问题几天,但随后又回来了。

我使用 SQL 已经有几十年了,我从未见过添加“top”导致时间增加的情况。

查看执行计划,如果执行前 20 条,它似乎正在执行 9.6 亿行的惰性假脱机操作,但如果不执行,则不会执行。

sql-server execution-plan sql-server-2016 top table-spool

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

如何知道我是否在 azure 中?

我这里说的是sql server。

我可以连接到天蓝色。我还可以管理权限。

但是在进行一些自动化操作时,我需要知道我是在天蓝色还是普通sql中。我怎样才能做到这一点?

我一直在使用@@版本。不过,据说并不准确。

sql-server azure-sql-database environment-variables sql-server-2016 azure

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

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

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

以下查询需要一些 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 ;
Run Code Online (Sandbox Code Playgroud)

我有这个索引。

CREATE NONCLUSTERED INDEX [IX__table1] ON dbo.table1
        ( Col1 ) 
INCLUDE (ValidFrom, ValidTo, RecordId)
GO
Run Code Online (Sandbox Code Playgroud)

这是查询的 io 统计信息。逻辑阅读能力非常出色。

在此输入图像描述

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

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

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

sql-server index-tuning azure-sql-database query-performance

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

SQL COUNT LEFT JOIN 上列值的出现次数

我在这里似乎有类似的问题,但似乎没有一个答案符合我正在寻找的-

假设我有一张这样的桌子:

分配给 部门ID 类型
玛丽 5001 初级
鲍勃 5002 中间
鲍勃 5003 初级
吉尔 5004 高的
鲍勃 5005 高的
鲍勃 5006 高的

另一个像这样:

用户 电话 地址
玛丽 111-222-3333 南巷111号
鲍勃 222-111-3333 北大道222号
吉尔 333-222-1111 555公路

我想在第一个表上输出带有左连接的第二个表,其中包含每个指定用户的“类型”总数(基本、中、高),因此它需要类似的内容:

用户 电话 小学总计 总中 总高
玛丽 111-222-3333 1 0 0
鲍勃 222-111-3333 1 1 2
吉尔 333-222-1111 0 0 1

我已经尝试过--Count(case when <table>.[type] = 'Elementary' then 1 else 0 end) AS ElementaryCount,,但这只是让我获得整个表,而不是左连接的用户。

有人知道我该怎么做吗?

join sql-server t-sql count

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

重组索引导致死锁

我在 SQL Server 2016 中运行alter index reorganize一些列存储索引并收到死锁消息。

永远是reorganize受害者吗?因为我不想导致其他工作失败,并且我正在考虑添加一个set deadlock_priority. 或者这是内置的alter index声明?

sql-server deadlock columnstore index-maintenance

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

为什么删除冗余索引会导致应用程序意外执行?

我继承了一个多年前由软件供应商安装的应用程序(以及相关的 MS SQL 数据库)。目前我们没有任何类型的供应商支持。除了使用应用程序之外,我们还独立于应用程序访问数据库,通常直接更新数据库并查询数据以进行报告。

为了提高性能,我删除了一些不必要的索引并创建了其他索引。当应用程序执行某些任务时,这会导致应用程序出现错误。应用程序不会显示任何类型的错误消息,并且似乎执行正常,但应用程序未按预期更新数据库。我无法访问源代码。

我的理论是,应用程序在其查询之一的 with(index) 语句中显式指定已删除的索引。这将导致服务器返回错误而不是完成查询,并且如果应用程序抑制错误,用户将不会意识到某些表已更新而其他表未更新。还有哪些其他想法可能导致这种行为?

假设我的理论是正确的,我仍然相信索引实际上是不必要的,并且应用程序不应该指定索引。也许解决方法是创建一个具有相同名称的新索引,但列数尽可能少。有没有办法创建没有列的索引?创建与聚集索引具有相同列的非聚集索引是否是最有效的?在这种情况下,优化器会做什么 - 它是否仍然制定计划包含这些仅引用聚集索引的“坏”索引,或者它会知道忽略 with(index) 请求吗?

我确实运行了跟踪来查看应用程序正在运行哪些查询。我收到了一堆 RPC 调用,例如“exec sp_cursorfetch”和“exec sp_cursorexecute”(我不明白),而不是实际的 SQL。也许我会在一个单独的问题中询问这些问题,但如果你知道我如何将这些语句解释或解码为常规 SQL,那么这至少可以让我证实我的理论。

index sql-server

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

SQL Server 在备份操作期间如何处理数据?

SQL Server在进行备份时,是先将数据读入内存再写入备份文件,还是直接从数据文件中读取数据,直接写入备份文件?我找不到任何有关此的信息,但我想它直接从数据文件读取并写入备份文件。从资源监视器中,我看到了这一点:

在此输入图像描述

正如您所看到的,SQL Server 从 mdf 文件中读取数据并将其写入备份文件。但由于我找不到任何相关信息,所以我只想确认一下。

sql-server backup

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

大量“键值”连接会导致 SQL Server 查询速度呈指数级减慢

我正在从使用对象 ID 和属性类型作为聚集索引的属性表迁移一些存储“键值”样式的数据(我也尝试过作为非聚集索引):

\n
CREATE TABLE [dbo].[#attrs](\n    [DataMigrationEventObjectID] [int] NOT NULL,\n    [AttributeType] [varchar](128) NOT NULL,\n    [AttributeValue] [varchar](255) NULL\n) \nCREATE CLUSTERED INDEX pk ON #attrs ([DataMigrationEventObjectID],AttributeType);\n
Run Code Online (Sandbox Code Playgroud)\n

我添加了属性值来选择值,因为数据库中的属性表有很多其他数据,我可以仅为此迁移事件选择它。使用我的测试数据集来填充此表的查询会插入约 3k 行,并且运行时间不到一秒(我的数据集中总共约有 50 个对象,每个对象都有多个属性)。

\n

查询中表的连接如下所示,连接聚集索引:

\n
        INNER JOIN #attrs obj_gvn\n        ON obj_gvn.DataMigrationEventObjectID = obj.DataMigrationEventObjectID\n        AND obj_gvn.AttributeType = \'GivenName\'\n
Run Code Online (Sandbox Code Playgroud)\n

通过对该临时表进行 14 个联接,查询将在几秒钟内完成。如果有 15 个连接,查询需要一分钟,如果有 16 个以上连接,则半小时后仍在运行。

\n

我已经检查了所有联接是否存在意外条件,这会导致返回太多行,当它在 1 分钟内返回时,它只返回正确的行,所以我不认为存在意外的笛卡尔联接。设置 MAXDOP 值不会影响它,并且查询运行一分钟时返回的查询计划不会标记任何问题。

\n

对于 SQL,我错过了什么,导致它在聚集索引上进行大量联接,理论上应该很快,而且记录数量如此之少?

\n
\n

我无法获得实际执行计划,因为查询未完成,并且因为它使用临时表,所以我无法获得其估计计划。我尝试将临时表捏造为数据库中的真实表并生成估计计划,但 2 分钟后该计划仍未生成,因此看起来延迟是在“创建计划”方面

\n

粘贴查询的缩短版本的计划:brentozar.com/pastetheplan/ ?id=Hy76dd92i

\n

我已经更新了数据库的统计数据以防万一,但它仍然没有生成计划。

\n

我过去处理过越来越多有问题的连接查询,其中计划编译仍然是即时的。我觉得它在“生成计划”步骤失败这一事实一定意味着什么。

\n

不幸的是,更新到最新的 CU 没有帮助。 …

sql-server optimization execution-plan sql-server-2019

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