这个问题是关于 SQL Server 索引性能,a varchar(2000)
as an INCLUDE
in a coverage index。
我正在尝试提高缓慢且不稳定的数据库应用程序的性能。在某些情况下,数据是通过大VARCHAR字符串来访问的,与查询包括像multple字符串操作SUBSTRING()
,SPACE()
和DATALENGTH()
。这是访问的简化示例;
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
Run Code Online (Sandbox Code Playgroud)
架构如下所示:
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
Run Code Online (Sandbox Code Playgroud)
定义了以下索引,在大文本列上有一个覆盖字段。
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
Run Code Online (Sandbox Code Playgroud)
从我读过的内容来看,将大数据字段放在索引中是很糟糕的。我一直在阅读几篇文章,包括http://msdn.microsoft.com/en-us/library/ms190806.aspx,其中讨论了分页和磁盘大小对索引性能的影响。话虽如此,查询计划肯定会使用覆盖索引。我没有足够的信息来确定这在系统负载方面实际上给我带来了多少成本。我确实知道总体而言,系统性能不佳,我担心这是问题之一。问题:
将此varchar(2000) …
我的行中有一个tinyint
布尔值,0
默认情况下以及1
每当发生特定事情时。在它之后1
,它总是会留下来1
。现在每一行都可能发生多次特定的事情,但我只需要将值更新为1
一次。
是否值得做一个SELECT
,检查值,只有当值是0
,才触发UPDATE
?
也可能这个
UPDATE table SET lock='1' WHERE id='100' AND lock='0'
Run Code Online (Sandbox Code Playgroud)
比
UPDATE table SET lock='1' WHERE id='100'
Run Code Online (Sandbox Code Playgroud)
对于我的情况?
我已经注意到,当 TSQL JSON 字符串中的数字时,键值值可能不加引号,但似乎必须始终引用关键组件。
select 1, isjson(''), 'empty string' union
select 2, isjson('{}'), 'empty braces' union
select 3, isjson('{1:2}'), 'unquoted both, numerals both' union
select 4, isjson('{1:"2"}'), 'unquoted key, numerals both' union
select 5, isjson('{"1":2}'), 'unquoted value, numerals both' union
select 6, isjson('{"1":"2"}'), 'quoted both, numerals both' union
select 7, isjson('{a:b}'), 'unquoted both, alpha both' union
select 8, isjson('{a:"b"}'), 'unquoted key, alpha both' union
select 9, isjson('{"a":b}'), 'unquoted value, alpha both' union
select 10, isjson('{"a":"b"}'), 'quoted both, alpha …
Run Code Online (Sandbox Code Playgroud) 我正在尝试微调我的查询和存储过程。我面临的问题是无法清除 Azure 中的数据库缓冲区。这意味着我不能DBCC DROPCLEANBUFFERS
在 Azure 上使用。
是否有一些解决方法可以清理缓冲区,以便我可以测试存储过程的实际时间?我正在考虑减少页面的预期寿命(尽管我不确定我是否真的能做到)。
我尝试更改数据库的层,因为在一篇文章中提到它可能会清除缓冲区,但它没有任何效果。
我需要这个,因为本地机器(带有 8 GB ram 的 I5)太快了,并且在本地机器上执行需要一秒钟的查询在 Azure S2(20 DTU)SQL DB 上需要大约 30 - 40 秒。
sp_msreplcheck_publish
是一个 sp,用于检查您是否有足够的权限运行语句来更改已发布的表(事务复制)。
尝试在没有提升权限的情况下更改已发布的表会触发tr_MStran_altertable
调用sp_MStran_ddlrepl
执行的触发器sp_msreplcheck_publish
。它正确返回:
只有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员才能执行此操作。
对我来说,神秘的是我在发布的数据库或主数据库中找不到这个 sp。是按需生成的吗?