我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符。
例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'
但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。
我遇到一个问题,我不断从下面的查询中获取值“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。
我有一个疑问:
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。
但是在进行一些自动化操作时,我需要知道我是在天蓝色还是普通sql中。我怎样才能做到这一点?
sql-server azure-sql-database environment-variables sql-server-2016 azure
我有一个宽表,相对较大,有 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
我在这里似乎有类似的问题,但似乎没有一个答案符合我正在寻找的-
假设我有一张这样的桌子:
| 分配给 | 部门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,,但这只是让我获得整个表,而不是左连接的用户。
有人知道我该怎么做吗?
我在 SQL Server 2016 中运行alter index reorganize一些列存储索引并收到死锁消息。
永远是reorganize受害者吗?因为我不想导致其他工作失败,并且我正在考虑添加一个set deadlock_priority. 或者这是内置的alter index声明?
我继承了一个多年前由软件供应商安装的应用程序(以及相关的 MS SQL 数据库)。目前我们没有任何类型的供应商支持。除了使用应用程序之外,我们还独立于应用程序访问数据库,通常直接更新数据库并查询数据以进行报告。
为了提高性能,我删除了一些不必要的索引并创建了其他索引。当应用程序执行某些任务时,这会导致应用程序出现错误。应用程序不会显示任何类型的错误消息,并且似乎执行正常,但应用程序未按预期更新数据库。我无法访问源代码。
我的理论是,应用程序在其查询之一的 with(index) 语句中显式指定已删除的索引。这将导致服务器返回错误而不是完成查询,并且如果应用程序抑制错误,用户将不会意识到某些表已更新而其他表未更新。还有哪些其他想法可能导致这种行为?
假设我的理论是正确的,我仍然相信索引实际上是不必要的,并且应用程序不应该指定索引。也许解决方法是创建一个具有相同名称的新索引,但列数尽可能少。有没有办法创建没有列的索引?创建与聚集索引具有相同列的非聚集索引是否是最有效的?在这种情况下,优化器会做什么 - 它是否仍然制定计划包含这些仅引用聚集索引的“坏”索引,或者它会知道忽略 with(index) 请求吗?
我确实运行了跟踪来查看应用程序正在运行哪些查询。我收到了一堆 RPC 调用,例如“exec sp_cursorfetch”和“exec sp_cursorexecute”(我不明白),而不是实际的 SQL。也许我会在一个单独的问题中询问这些问题,但如果你知道我如何将这些语句解释或解码为常规 SQL,那么这至少可以让我证实我的理论。
SQL Server在进行备份时,是先将数据读入内存再写入备份文件,还是直接从数据文件中读取数据,直接写入备份文件?我找不到任何有关此的信息,但我想它直接从数据文件读取并写入备份文件。从资源监视器中,我看到了这一点:
正如您所看到的,SQL Server 从 mdf 文件中读取数据并将其写入备份文件。但由于我找不到任何相关信息,所以我只想确认一下。
我正在从使用对象 ID 和属性类型作为聚集索引的属性表迁移一些存储“键值”样式的数据(我也尝试过作为非聚集索引):
\nCREATE 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);\nRun 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\'\nRun Code Online (Sandbox Code Playgroud)\n通过对该临时表进行 14 个联接,查询将在几秒钟内完成。如果有 15 个连接,查询需要一分钟,如果有 16 个以上连接,则半小时后仍在运行。
\n我已经检查了所有联接是否存在意外条件,这会导致返回太多行,当它在 1 分钟内返回时,它只返回正确的行,所以我不认为存在意外的笛卡尔联接。设置 MAXDOP 值不会影响它,并且查询运行一分钟时返回的查询计划不会标记任何问题。
\n对于 SQL,我错过了什么,导致它在聚集索引上进行大量联接,理论上应该很快,而且记录数量如此之少?
\n我无法获得实际执行计划,因为查询未完成,并且因为它使用临时表,所以我无法获得其估计计划。我尝试将临时表捏造为数据库中的真实表并生成估计计划,但 2 分钟后该计划仍未生成,因此看起来延迟是在“创建计划”方面
\n粘贴查询的缩短版本的计划:brentozar.com/pastetheplan/ ?id=Hy76dd92i
\n我已经更新了数据库的统计数据以防万一,但它仍然没有生成计划。
\n我过去处理过越来越多有问题的连接查询,其中计划编译仍然是即时的。我觉得它在“生成计划”步骤失败这一事实一定意味着什么。
\n不幸的是,更新到最新的 CU 没有帮助。 …
sql-server ×10
azure ×1
backup ×1
collation ×1
columnstore ×1
count ×1
deadlock ×1
index ×1
index-tuning ×1
join ×1
optimization ×1
t-sql ×1
table-spool ×1
top ×1