我最近继承了一个使用BINARY(16)而不是UNIQUEIDENTIFIER存储 Guid的 SQL Server 数据库。它对包括主键在内的所有内容都执行此操作。
我应该担心吗?
我有一个相当大的表,其中一列是 XML 数据,XML 条目的平均大小约为 15 KB。所有其他列都是常规整数、大整数、GUID 等。为了获得一些具体数字,假设该表有一百万行,大小约为 15 GB。
我注意到的是,如果我想选择所有列,这个表选择数据的速度真的很慢。当我做
SELECT TOP 1000 * FROM TABLE
Run Code Online (Sandbox Code Playgroud)
从磁盘读取数据大约需要 20-25 秒 - 即使我没有对结果强加任何排序。我使用冷缓存(即 after DBCC DROPCLEANBUFFERS)运行查询。IO统计结果如下:
扫描计数 1,逻辑读 364,物理读 24,预读 7191,lob 逻辑读 7924,lob 物理读 1690,lob 预读 3968。
它抓取了大约 15 MB 的数据。执行计划如我所料显示聚集索引扫描。
除了我的查询外,磁盘上没有任何 IO;我还检查了聚集索引碎片是否接近 0%。这是一个消费级 SATA 驱动器,但我仍然认为 SQL Server 能够以比 ~100-150 MB/min 更快的速度扫描表。
XML 字段的存在导致大部分表数据位于 LOB_DATA 页上(实际上约 90% 的表页是 LOB_DATA)。
我想我的问题是 - 我认为 LOB_DATA 页面会导致扫描缓慢不仅是因为它们的大小,还因为当表中有很多 LOB_DATA 页面时,SQL Server 无法有效扫描聚集索引,我是否正确?
更广泛地说 - 拥有这样的表结构/数据模式是否合理?使用 Filestream 的建议通常说明更大的字段大小,所以我真的不想走那条路。我还没有真正找到关于这个特定场景的任何好的信息。
我一直在考虑 XML 压缩,但它需要在客户端或使用 SQLCLR 完成,并且需要在系统中实现相当多的工作。
我尝试了压缩,因为 XML 是高度冗余的,所以我可以(在 …
为什么这两个SELECT语句会导致不同的排序顺序?
USE tempdb;
CREATE TABLE dbo.OddSort
(
id INT IDENTITY(1,1) PRIMARY KEY
, col1 NVARCHAR(2)
, col2 NVARCHAR(2)
);
GO
INSERT dbo.OddSort (col1, col2)
VALUES (N'e', N'eA')
, (N'é', N'éB')
, (N'ë', N'ëC')
, (N'è', N'èD')
, (N'ê', N'êE')
, (N'?', N'?F');
GO
SELECT *
FROM dbo.OddSort
ORDER BY col1 COLLATE Latin1_General_100_CS_AS;
Run Code Online (Sandbox Code Playgroud)
???????????????????????? ? ID ?列 1 ? 列 2 ? ???????????????????????? ? 1 ? ? ? ? 2 ? é ? 乙 ? ? 4 ? ? …
我在 SQL Server 2005/2008 中找不到直接设置UTF-8相关的选项Collations/Charsets,与可以在其他 SQL 引擎中设置的选项相同,但在 SQL Server 2005/2008 中只有拉丁语和 SQL 排序规则。
是否有一些选项可以在 Win2008 操作系统上的 SQL Server 引擎(两个版本)2005/2008 中强制/安装这些排序规则/字符集
sql-server-2005 sql-server-2008 sql-server collation encoding
我想使用我在 C# CLR 中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库都设置为可信赖的并打开 CLR 并在每个数据库中保留一堆相同的代码.
从管理和安全的角度来看,有没有最好的方法来做到这一点?CLR 函数非常基础,如字符串断路器、电子邮件验证、url 编码/解码、base64 等。我希望每个数据库中只有 dbo 模式能够访问这些函数。
谢谢
我做了以下存储过程:
ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100))
AS
SELECT ActorDOB, ActorName FROM tblActor
WHERE ActorName LIKE '%' + @nameString + '%'
AND ActorGender = @actorgender
Run Code Online (Sandbox Code Playgroud)
现在,我尝试做这样的事情。也许我做错了,但我想确保这样的过程可以防止任何 SQL 注入:
EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor'
Run Code Online (Sandbox Code Playgroud)
下图显示了在 SSMS 中执行的上述 SQL 并且结果显示正确而不是错误:
顺便说一句,我在查询完成后在分号后面添加了那部分。然后我再次执行它,但是当我检查表 tblActor 是否存在时,它仍然存在。难道我做错了什么?或者这真的是防注射的吗?我想我在这里也想问的是,这是一个像这样安全的存储过程吗?谢谢你。
sql-server-2008 security sql-server sql-injection dynamic-sql
我的一位同事给我发了一个有趣的问题,我无法完全解释。
他运行了一些代码(包括在下面)并从中得到了一些意想不到的结果。
本质上,当将 a UniqueIdentifier(Guid从这里开始我将称之为)转换为 a binary(or varbinary) 类型时,结果的前半部分的顺序是倒序的,但后半部分不是。
我的第一个想法是系统的字节序是原因,并且Guid保留了显示,但binary不能保证形式。
显然这是一个实现细节,但我想知道是否有一个很好的解释。
代码:
declare @guid uniqueidentifier = '8A737954-CBEC-40CE-A534-2AFFB5A0E207';
declare @binary binary(16) = (select convert(binary(16), @guid));
select @guid as [GUID], @binary as [Binary];
Run Code Online (Sandbox Code Playgroud)
结果:
GUID Binary
8A737954-CBEC-40CE-A534-2AFFB5A0E207 0x5479738AECCBCE40A5342AFFB5A0E207
Run Code Online (Sandbox Code Playgroud)
如您所见,每个部分的前半部分Guid(一直到40CE)是向后存储的。也就是说,the的第一部分是向后的,然后是第二部分,然后是第三部分,但是这些部分的顺序是保留的。之后,最后两个部分按照它们在.GuidGuid
谁能解释一下?(下面包含一个更大的测试集。)
代码:
declare @guid_to_binary table
(
[id] int identity(1,1),
[guid] uniqueidentifier,
[binary_conversion] binary(16)
);
declare @i int = 1;
while @i <= 100
begin
insert into …Run Code Online (Sandbox Code Playgroud) 请注意,此问题与供应商/版本无关
在我看来,作为英语演讲者(打字员、作家),期望单词的大小写正确但不一定具有正确方向的正确口音是合理的:
当我在香榭丽舍大街餐厅的酒店领班克洛伊 (Chloe the maitre d'hotel) 的茶会上沉思时,一边等着 garcon 拿来我炒过的墨西哥胡椒酱……
你明白了。
所以今天我想我想要一个搜索条件来使用区分大小写但不区分重音的排序规则,但找不到。这是否有充分的理由,或者我的只是一个罕见的用例?
这是我正在查看的一些文档的示例(尽管认为供应商/版本不可知):
我有一个带有 varchar 列的表。它允许使用商标 (™)、版权 (©) 和其他 Unicode 字符,如下所示。
Create table VarcharUnicodeCheck
(
col1 varchar(100)
)
insert into VarcharUnicodeCheck (col1) values ('MyCompany')
insert into VarcharUnicodeCheck (col1) values ('MyCompany™')
insert into VarcharUnicodeCheck (col1) values ('MyCompany?')
insert into VarcharUnicodeCheck (col1) values ('MyCompanyï')
insert into VarcharUnicodeCheck (col1) values ('MyCompany')
select * from VarcharUnicodeCheck
Run Code Online (Sandbox Code Playgroud)
但是varchar的定义说,它允许非 unicode 字符串数据。但 Trademark(™) 和 Registered(®) 符号是Unicode字符。定义是否与 varchar 数据类型的属性相矛盾?我阅读了几个链接,例如第一个和第二个。但是我仍然不明白为什么当定义说它只允许非 unicode 字符串值时它允许 unicode 字符串。
我需要一个字符编码技巧来去除希伯来语重音标记。
之前的样品
???????????? ??????? ????????? ??????????????? ???????????????
样品后
?????????????? ?? ????? ??????
sql-server ×9
collation ×4
encoding ×3
unicode ×3
uuid ×2
blob ×1
c# ×1
datatypes ×1
dynamic-sql ×1
migration ×1
performance ×1
security ×1
sql-clr ×1
xml ×1