我只是不明白。请参阅此 SQL 查询:
select nchar(65217) -- ?
select nchar(65218) -- ?
select nchar(65219) -- ?
select nchar(65220) -- ?
if nchar(65217) = nchar(65218)
print 'equal'
if nchar(65217) = nchar(65219)
print 'equal'
if nchar(65217) = nchar(65220)
print 'equal'
Run Code Online (Sandbox Code Playgroud)
基于传递关系,这意味着 SQL Server 认为它们都是同一个字符。
但是,在其他环境中,例如 C#,它们并不相同。
我感到困惑的是:
这当然会导致巨大的问题,因为我正在开发一个文本处理应用程序,数据几乎来自任何地方,我需要在处理之前对文本进行规范化。
如果我知道差异的原因,我可能会找到处理它的解决方案。谢谢你。
您可以看到许多关于多级联路径的问题。例如:
但是,从我所看到和理解的情况来看,您可以在许多情况下删除子记录,而不仅仅是删除相关主记录的一种情况。
虽然在一个问题中说 SQL Server 试图通过防止这种情况发生来确保安全,但我真的不明白如果我们有多个级联路径可能会出现什么问题,以及它可以防止哪些问题使其安全?
我希望有人能用通俗易懂的语言向我解释这一点,最好使用多个级联路径可能出现问题的示例。
这个问题被问了几十次,令我惊讶的是,这样一个简单的要求变得如此困难。然而我无法解决这个问题。
我使用 SQL Server 2014 Express 版,数据库大小限制为 10GB(不是文件组大小,数据库大小)。
我抓取了新闻,并将 HTML 插入到表格中。表的架构是:
Id bigint identity(1, 1) primary key,
Url varchar(250) not null,
OriginalHtml nvarchar(max),
...
Run Code Online (Sandbox Code Playgroud)
数据库容量不足,我收到了 insufficient disk space
当然缩小数据库和文件组没有帮助。DBCC SHRINKDATABASE
没有帮助。所以我写了一个简单的应用程序来读取每条记录,去掉一些不需要的部分,OriginalHtml
比如 head section 和 aside 和 footer 以只保留主体,现在我在获取顶级表的磁盘使用情况报告时看到这个图像:
据我了解这张图片,未使用的空间现在占总大小的 50%。也就是说,现在我有 5GB 未使用的空间。但我无法收回它。重建索引没有帮助。该truncateonly
选项无济于事,因为据我所知,没有记录被删除,只有每条记录的大小减少。
我被困在这一点上。请帮忙,我该怎么办?
聚集索引在列上Id
。
这是结果 EXECUTE sys.sp_spaceused @objname = N'dbo.Articles', @updateusage = 'true';
name rows reserved data index_size unused
----------- -------- ------------ ----------- ------------ -----------
Articles 112258 8079784 KB 5199840 KB 13360 KB …
Run Code Online (Sandbox Code Playgroud) 我有一张有十亿条记录的表。它有这些列:
Id bigint,
MobileNumber varchar(100),
Date datetime,
Message nvarchar(400)
Run Code Online (Sandbox Code Playgroud)
它在MobileNumber
和Date
字段上具有非聚集索引。
我想找到 aMobileNumber
在指定时期内发送给我们的内容。因此我运行这个查询:
select Message
from ReceivedMessages
where [Date] > 'from-time'
and [Date] < 'to-time'
and MobileNumber = 'number-to-filter'
Run Code Online (Sandbox Code Playgroud)
并且此查询在过去 2 年中以闪电般的速度运行。但是当我将from-time
零件更改为更近的日期时,它会冻结并需要 2 分钟以上才能完成。换句话说,基于不同的输入,它的行为也不同,有时甚至会闲逛超过 10 分钟不回来。
我期待一致的行为。我想念索引什么?什么会导致这种不一致的性能?
更新:我更改了列和表的名称,因此无法将执行计划附加为图片。但问题就在这里。谢谢你指导我。
当我更改日期参数的值时,SQL 将索引查找从 更改IX_MobileNumber
为IX_Date
。没想到SQL是根据参数的值来创建执行计划的。那怎么可能?
我正在尝试备份由我无权访问的人创建的数据库。我收到此错误消息:
不允许备份文件或文件组“fileStream”,因为它不在线。
然后它建议通过T-SQL备份数据库只备份在线文件组。然而,这不是我的要求。
我想使脱机文件组再次联机。我看到了这个答案,它建议使用alter database
命令使 fielgroup 脱机。
alter database dn_name
modify file (name='filegroup_name', offline)
go
Run Code Online (Sandbox Code Playgroud)
但是,正如我看到的上述命令的文档,没有选项可以让 fielgroup 重新联机。我该怎么办?如何在 SQL Server 2012 中使文件组(或文件)重新联机?
我需要获取SQL Server 数据库中对象的创建脚本。我需要用于创建它的完全相同的脚本。就像当您使用 SSMS 更改已定义的视图时,脚本就在那里,就像您之前定义的那样。
我需要在 T-SQL 中执行此操作。SQL Server 在哪里存储与数据库对象相关的脚本?我在系统目录视图中找不到相关视图。
我试图找到的是这样的:
select creation_script -- I know this column doesn't exist
from sys.objects
where name = 'CustomersView'
Run Code Online (Sandbox Code Playgroud) 这是一个遗留系统,每天处理 1000 万笔交易的表中有超过 10 亿条记录。
现在应用程序抱怨:
将 IDENTITY 转换为数据类型 int 时出现算术溢出错误
我们想将该id
列的数据类型更改为bigint
,但它无法执行并且超时。
我们应该做什么?我一点头绪也没有。我们无法停止系统,因为它是一个单一的应用程序和数据库,可以做很多事情。因此,我们不希望停止整个系统。
我们正在使用 SQL Server 10.50.6000.34
,即 SQL Server 2008 R2 SP3(2014 年 9 月)
我有Messages
一个包含字段的表和另一个名为 的表SentMessages
,它与该表具有一对一的关系Messages
。
Messages
存储有关消息的信息,包括其文本、主题和收件人等。
create table Messages
(
Id bigint not null identity(1, 1) primary key,
Text nvarchar(max),
Subject nvarchar(400)
-- other fields
)
Run Code Online (Sandbox Code Playgroud)
SentMessages
存储与将消息传输到客户端相关的信息。
create table SentMessages
(
Id bigint not null primary key,
SentOn datetime not null,
DeliveredOn datetime null,
-- other fields
)
go
alter table SentMessages with check add constrait [FK_SentMessages_Messages]
foreign key([Id])
references Messages ([Id])
Run Code Online (Sandbox Code Playgroud)
它们被设计为独立的,所以请不要对合并它们提出建议。
现在的逻辑是找到所有尚未发送的消息,然后发送它们。基本上not in
,单线程场景中的一个简单子句就可以解决问题:
select *
from Messages
where Id not in …
Run Code Online (Sandbox Code Playgroud) 考虑这个表:
create table Books
(
Id bigint not null primary key identity(1, 1),
UniqueToken varchar(100) not null,
[Text] nvarchar(max) not null
)
Run Code Online (Sandbox Code Playgroud)
假设这张表中有超过 100,000 本书。
现在我们有 10,000 本书数据要插入到这个表中,其中一些是重复的。所以我们需要先过滤重复,然后再插入新书。
检查重复项的一种方法是这样的:
select UniqueToken
from Books
where UniqueToken in
(
'first unique token',
'second unique token'
-- 10,000 items here
)
Run Code Online (Sandbox Code Playgroud)
Text
列的存在是否会影响此查询的性能?如果是这样,我们如何优化它?
PS 我有相同的结构,对于其他一些数据。而且它的表现并不好。一个朋友告诉我,我应该把我的桌子分成两张桌子,如下所示:
create table BookUniqueTokens
(
Id bigint not null primary key identity(1, 1),
UniqueToken varchar(100)
)
create table Books
(
Id bigint not null primary key,
[Text] nvarchar(max)
) …
Run Code Online (Sandbox Code Playgroud) 我有一张桌子,Id
作为主键。
create table Anything
(
Id bigint not null primary key identity(1, 1)
)
Run Code Online (Sandbox Code Playgroud)
当我查看 中的这张表时Object Explorer
,我当然会看到这张图片:
正如你所看到的,列Id
是不为空。
然后我在这个虚拟表上创建一个虚拟视图:
create view IdIsTwoView
as
select
Id,
(
case
when Id = 2
then cast(1 as bit)
else cast(0 as bit)
end
) as IdIsTwo
from Anything
Run Code Online (Sandbox Code Playgroud)
但这一次,在对象资源管理器中,我看到了这个结果:
如您所见,尽管我的case
子句包罗万象,涵盖了所有记录的 100%,并且对所有记录都有答案,但它可以为空。
为什么 SQL Server 有这种奇怪的行为?我如何强制它不为 null?
PS我们有一个动态生成代码的基础设施,这种行为给我们带来了麻烦,我们必须手动将bool?
C# 中的所有类型更改为bool
.
sql-server ×10
alter-table ×1
cascade ×1
datatypes ×1
dbcc ×1
filegroups ×1
identity ×1
index ×1
null ×1
performance ×1
scripting ×1
shrink ×1
t-sql ×1
unicode ×1
view ×1