标签: sql-server

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

在 RAISERROR 中使用 FLOAT

我正在使用RAISERROR()提供一些基本的单元测试功能(如这里),但我对无法FLOATs在错误消息中使用感到沮丧。我知道我可以将浮点数转换为字符串,但我RAISERROR在每个单元测试中都使用,我不想为每个测试添加另一行代码。(我的单元测试已经够啰嗦了!)有没有办法在参数列表中执行内联强制转换/转换RAISERROR?或者有其他方法可以解决这个缺陷吗?

更新: 所以最终我希望我能做的是:

RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Run Code Online (Sandbox Code Playgroud)

不幸的是,RAISERROR一般不处理 %f 或浮点数。所以我必须这样做:

DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
Run Code Online (Sandbox Code Playgroud)

...当它分散在数十个单元测试中时,它看起来就像一团糟。所以我想把它归结为这样的:

RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Run Code Online (Sandbox Code Playgroud)

但这给了我一个Incorrect syntax near 'CAST'信息。我不明白为什么这是非法的,但确实如此。我可以在这里使用另一个“一个班轮”吗?

sql-server t-sql

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

为什么我的 ORDER BY 在 EXCEPT 之前(慢)而不是之后(快)对两个表进行排序?

SQL Server 2008 R2 查询优化器拼图

我们有两个表,都包含 900 万行。70.000 行不同,其他相同。

这很快,13秒,

select * from bigtable1
except select * from similar_bigtable2
Run Code Online (Sandbox Code Playgroud)

这对输出进行排序并且也很快,13 秒,

select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Run Code Online (Sandbox Code Playgroud)

虽然这非常缓慢:

;with q as (
    select * from bigtable1
    except select * from similar_bigtable2
)
select * from q order by sort_column
Run Code Online (Sandbox Code Playgroud)

甚至我有时用来提示 SQL Server 需要预先计算查询的某个部分才能继续执行的“技巧”也不起作用并导致查询速度变慢:

;with q as (
    select top 100 percent * from bigtable1
    except select * from …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

SQL Server 相当于 Oracle RAC 的功能吗?

我做了一些谷歌搜索,但在几年前找不到这个问题的答案,所以我想我会问。Oracle 的 RAC 特性为读取和写入事务提供负载平衡,以及无需停机的横向扩展和高可用性(至少,据我所知 - 我们即将部署我们的第一个使用 RAC 的数据库,所以我们会看看情况如何)。

是否有提供等效功能的任何 SQL Server 功能集(或您可以安装在顶部的第三方组件)?我们一直使用 Windows 集群,其中故障转移事件会导致大约 20-30 秒的 SQL 停机时间 - 总是可以容忍的,但并不理想。现在,使用 SQL 2012 中的 AlwaysOn,SQL Server 将其缩短到大约 15 秒,并添加了只读辅助数据库的概念,但它们仍然要求通过单个连接点阻塞写入事务(大大改进,因为许多事务是只是阅读,但仍然不是真正的负载平衡),并且在节点故障或需要修补的情况下,仍然存在停机时间。

我想这只是更多的好奇心 - 我觉得这是 SQL Server 落后于 Oracle 的唯一领域(至少在我个人看到使用的功能中)。我想看看是否有任何选项可以缩小这一差距,并在我们等待添加 Microsoft 的等效功能的同时改进我们自己的 SQL Server 部署 - 也许在 SQL 2014/2015 中?

sql-server feature-comparison rac oracle-rac high-availability

12
推荐指数
3
解决办法
2万
查看次数

PostgreSQL 初始数据库大小

我的问题有两个部分。

  1. 有没有办法在 PostgreSQL 中指定数据库的初始大小?
  2. 如果没有,当数据库随着时间的推移而增长时,您如何处理碎片?

我最近从 MSSQL 迁移到 Postgres,我们在 MSSQL 世界中创建数据库时所做的一件事是指定数据库和事务日志的初始大小。这减少了碎片并提高了性能,特别是如果事先知道数据库的“正常”大小。

我的数据库的性能随着大小的增长而下降。例如,我处理的工作负载通常需要 10 分钟。随着数据库的增长,这个时间会增加。执行 VACUUM、VACUUM FULL 和 VACUUM FULL ANALYZE 似乎不能解决问题。解决性能问题的是停止数据库,对驱动器进行碎片整理,然后进行 VACUUM FULL ANALYZE 使我的测试性能恢复到原来的 10 分钟。这让我怀疑是碎片化是导致我痛苦的原因。

我在 Postgres 中找不到任何关于保留表空间/数据库空间的参考。要么我使用了错误的术语,因此一无所获,要么在 Postgres 中有一种不同的方法来减轻文件系统碎片。

任何指针?

解决方案

提供的答案有助于确认我开始怀疑的内容。PostgreSQL 将数据库存储在多个文件中,这使得数据库可以增长而不必担心碎片化。默认行为是将这些文件与表数据一起打包,这对很少更改的表有好处,但对经常更新的表不利。

PostgreSQL 利用MVCC提供对表数据的并发访问。在此方案下,每次更新都会创建已更新行的新版本(这可能是通过时间戳或版本号,谁知道?)。旧数据不会立即删除,而是标记为删除。执行 VACUUM 操作时会发生实际删除。

这与填充因子有什么关系?表默认填充因子 100 完全填充表页,这反过来意味着表页内没有空间来保存更新的行,即更新的行将放置在与原始行不同的表页中。正如我的经验所示,这对性能不利。由于我的汇总表更新非常频繁(高达 1500 行/秒),我选择将填充因子设置为 20,即表的 20% 用于插入行数据,80% 用于更新数据。虽然这可能看起来过多,但为更新行保留的大量空间意味着更新行与原始行保持在同一页内,并且在 autovacuum 守护程序运行以删除过时行时表页未满。

为了“修复”我的数据库,我执行了以下操作。

  1. 将我的汇总表的填充因子设置为 20。您可以在创建时通过将参数传递给CREATE TABLE或事后通过 ALTER TABLE 来执行此操作。我发出了以下 plpgsql 命令:ALTER TABLE "my_summary_table" SET (fillfactor = 20);
  2. 发出 VACUUM FULL,因为这会写入一个全新版本的表文件,因此暗示会写入一个具有新填充因子的新表文件

重新运行我的测试,即使数据库达到我需要的数百万行,我也没有发现性能下降。

TL;DR …

postgresql sql-server database-size fragmentation

12
推荐指数
2
解决办法
6935
查看次数

SQL Server 如何将信息存储在作业计划属性中?

我知道有SELECT * FROM msdb..sysjobschedules,但这只是显示下一次计划运行的作业。

我想知道这是如何确定和存储的。那么它在哪里存储 Recurs every Monday 复选框的值呢?

sql-server t-sql jobs

12
推荐指数
2
解决办法
3484
查看次数

架构更改会“破坏”可用性组还是透明处理?

我的组织正计划采用 SQL Server 2012 可用性组,我正在尝试了解它将对我们的应用程序升级过程产生什么影响(如果有)。

我们每 8 周发布一次应用程序更新,任何发布都可能包括架构更改和/或数据迁移。

我想了解的是 HA/DR 解决方案是否透明地处理架构更改(新列、索引被添加到辅助节点),或者是否需要手动干预在每个实例上创建架构然后重新打开 Always On。

我假设的数据迁移部分是透明处理的,但也想确认一下。

我想我也做了一个笼统的假设,即基于可用性组配置的这些行为没有区别,这也可能是错误的。请告诉我。

简而言之; 在我的应用程序的任何给定版本中,我可能会通过向其中添加列来更改非常大的表(数百万条记录的数十到数百条记录)。某些列可能是“全新的”,因此它们可以使用 Enterprise Online 架构更改功能。其他列可能是现有列的重构(全名被拆分为名字和姓氏),并且将为表中的每一行运行迁移以填充这些字段。这些行为中的任何一个是否需要 DBA 更改 AlwaysOn 配置,或者这是默认处理的,并且所有辅助节点都“免费”获得 DDL 和 DML 语句?

感谢您提供的任何清晰度。

schema sql-server sql-server-2012 high-availability availability-groups

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

使用带有覆盖列的唯一非聚集索引而不是主键的含义

我们有一个大表[MyTable]目前既有Primary Key一个Unique Non Clustered Index在同一列([KeyColumn])。UNC 索引还有额外的覆盖栏。

在同一列上同时拥有 PK 和唯一 NC 索引似乎是多余的,所以我考虑删除主键,而是使用唯一非聚集索引来实现引用完整性。

请注意,该表完全由另一列聚集在一起。

即所以我们有:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
Run Code Online (Sandbox Code Playgroud)

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO
Run Code Online (Sandbox Code Playgroud)

据我所知,不可能向主键添加覆盖列,所以我打算这样做:

  • 删除依赖的外键约束 MyTable.KeyColumn
  • MyTable.KeyColumn完全删除主键
  • 将外键重新添加到表中(即 RI 将通过 强制执行MyTable.KeyColumn

我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。

我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。

我的问题是:这种方法有缺陷吗?

编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。

为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。

sql-server-2008 sql-server

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

允许用户在他自己的架构内做任何事情,但不能创建或删除架构本身

我在 SQL Azure 中创建了一个架构,并向数据库角色授予了以下权限:

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW 
DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
Run Code Online (Sandbox Code Playgroud)

通过上面定义的权限myuser可以创建/删除自己的模式,所以为了克服这个问题我尝试了 ALTER ANY SCHEMA 权限。但此权限也拒绝用户创建/删除表。

需要什么权限才能允许用户在他自己的架构中做任何事情,但不能创建或删除架构本身?

schema sql-server permissions

12
推荐指数
2
解决办法
4万
查看次数

在 MS SQL 数据库中记录大量相互关联的存储过程:什么工具或格式?

我希望这是一个比“阅读一本 1000 页的书”更短答案的问题,但是,如果这是真实情况,那么就用它来打击我。

我不是真正的 DBA,我是一名软件开发人员,我意识到我们需要 DBA,但我工作的商店的 DBA 为零。然而,我们的 MS SQL 数据库设计包括几个核心存储过程,是一个巨大的混乱。存储过程很慢,我们怀疑它们有错误,但我们甚至不知道它们应该如何工作,所以我们不知道如何修复它们。

作为开始,我决定我们将记录它应该如何工作,然后我们将开始单元测试,并构建一组单元测试来帮助证明存储过程确实可以工作。它们执行的逻辑是我们应用程序的关键部分,可以说,它是我们公司主要产品的“皇冠上的明珠”,它的工作方式完全没有记录。

我正在寻找专业 DBA 可能希望现有的特定技术文档,或者他们可能会自己编写(如果必须),以了解相互调用的巨大存储过程网络。

  1. 记录大型存储过程的常用格式是什么?每个输入参数的预期值的描述(即“前置条件”、“后置条件”,即布尔参数在打开或关闭时会发生什么变化等?)

  2. 人们通常如何记录它?仅 SQL 注释?特定于目的的外部工具?外部“文档”?除了 MS SQL Management Studio 之外,我们没有 SQL 工具,但我们想知道是否有一种工具可以更好地理解、记录和测试我们的环境。也许这是问我问题的更好方式;我需要什么工具来解决我们的烂摊子?

我们的目标是能够:

A. 使用我们生成的文档或我们添加到环境中的任何工具来帮助理解过程应该如何工作,然后我们可以继续为存储过程创建单元测试覆盖率。

B. 向客户端应用程序开发人员展示如何正确调用这些复杂的存储过程。

C. 单元测试我们的存储过程。

sql-server stored-procedures documentation sql-server-2008-r2

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