小编Pau*_*ite的帖子

区分大小写不起作用

我遇到一个问题,我不断从下面的查询中获取值“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
查看次数

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 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
查看次数

为什么并行会导致锁升级,临界点在哪里?

我使用定制的 Stack Overflow 数据库(180GB)并运行一个简单的更新查询:(Users 表上只有一个聚集索引)

Begin Tran
Update U set U.Reputation=100000 
from StackOverflow.dbo.Users as U 
where U.CreationDate = '2008-10-10 14:26:33.540'
Run Code Online (Sandbox Code Playgroud)

查询计划

在此输入图像描述

此查询会导致锁升级。我无法在另一个窗口中使用同一个表运行查询:

select * from StackOverflow.dbo.Users as U where U.id=11
Run Code Online (Sandbox Code Playgroud)

如果我option (maxdop 1)在查询末尾添加以避免并行,则一切都很好(计划)。

在较小的 Stack Overflow DB (StackOverflow2013 - 52GB) 中不会发生锁升级(计划)。

如何确定导致升级的数据量?

我使用 SQL Server 2019。数据库兼容级别为 150。

表信息:

  • StackOverflow2013.dbo.Users -- 2 465 713 行;45 184 页
  • StackOverflow.dbo.Users -- 8 917 507 行;143 667 页

sql-server parallelism lock-escalation

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

删除不同表中的记录

我需要删除所有三个表中 UserIndex = 1 和 ItemNumber = 5202 的记录,所有这些记录都在单个查询中。我正在使用 SQL 2008 R2。

表用户信息1

用户索引 项目编号 项目计数
1 5202 99
1 1600 50
2 155 2
3 125 60

表用户信息2

用户索引 项目编号 项目计数
8 1265 50
4 1899 41
1 5202 99
3 125 60

表用户信息3

用户索引 项目编号 项目计数
6 5205 85
1 6666 41
3 4455 44
1 5202 50

我尝试将此查询与两个表一起使用,但它不起作用:

DELETE ItemInfo1, ItemInfo2 
FROM ItemInfo1 
LEFT JOIN ItemInfo2 
    ON ItemInfo1.UserIndex = ItemInfo2.UserIndex 
WHERE ItemInfo1.UserIndex = 1;
Run Code Online (Sandbox Code Playgroud)

sql-server delete sql-server-2008-r2 php xampp

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

在 6 个月范围内对库存进行分组

我在前 6 个月内一直在拉动总库存。如何在同一查询中提取过去 6 个月内的总库存?

另外我想要查询的结果如下所示:

  Stock Code | the first 6 months   |  the second 6 months   etc.
Run Code Online (Sandbox Code Playgroud)

我的 SQL 查询:

 SELECT TOP (100) PERCENT STOK_KODU, 
    COALESCE (SUM(CASE WHEN kod1 = 'G' THEN kod2 ELSE 0 END), 0) 
   - COALESCE (SUM(CASE WHEN kod1 = 'C' THEN kod2 ELSE 0 END), 0) AS StokToplam1 
FROM s_hareket WHERE (STOK_KODU BETWEEN '01001' AND '75000') 
and (tarih BETWEEN '2011-01-01' and '2011-06-30') 
GROUP BY STOK_KODU 
ORDER BY STOK_KODU
Run Code Online (Sandbox Code Playgroud)

sql-server group-by

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

在 PostgreSQL 的表中插入一个 'NULL' 字符串

我想知道是否可以在具有NOT NULL约束的列中插入“空”字符串。

我正在使用 PostgreSQL,尽管这可能也适用于其他数据库管理系统。

查询如下所示

INSERT INTO originators(originator, id, regexp)
VALUES ('null', 1, -1);
Run Code Online (Sandbox Code Playgroud)

这是表设计:

CREATE TABLE originators
(
      originator    varchar(30)    NOT NULL
    , id            int            NOT NULL
    , regexp        int            NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

这里原始列有一个NOT NULL约束,所以表中不应该有 NULL 值。

但是,当我查询表时,我看到的是:

?????????????????????????????????
? 创始者?ID ?正则表达式?
?????????????????????????????????
? 空值 ?1 ? -1 ?
?????????????????????????????????

这怎么可能?

postgresql null

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

当更新的值相同时,数据库引擎会更新吗?

假设我在一行上运行多列更新。如果某些列包含与数据库中先前存在的值相同的值,则数据库引擎是否将新数据物理写入数据库?如果是,如何避免?

我即将实施一项作业,该作业将在大表上运行更新,并且大多数值将相同,但仍然必须重新计算它们。我想知道即使没有必要,更新是否也会重写每一列,因为存储介质会更快地降级。

oracle sql-server

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

以单元格名称作为列名称透视表

我有一个表结构是:

year | code | name| value | wef        | 
2014 | a001 | abe | 2000  | 2014-04-01 | 
2014 | a001 | def | 3000  | 2014-05-01 |
2014 | a002 | abe | 2000  | 2014-06-01 |
2014 | a003 | def | 2000  | 2014-04-01 |
2014 | a003 | mno | 5000  | 2014-06-01 |
Run Code Online (Sandbox Code Playgroud)

我需要的结果格式为:

year | code | abe | abe__wef | def | def__wef  | mno | mno____wef |   
2014 | a001 …
Run Code Online (Sandbox Code Playgroud)

sql-server pivot

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