小编Aar*_*and的帖子

列存储索引中的列顺序重要吗?

我有一个包含约 2 亿行和约 15 列的表。我打算COLUMNSTORE在我的表上创建一个索引。

根据我在列存储索引中使用的列顺序,性能是否会有任何变化?如果是,其背后的逻辑是什么?

index database-design sql-server sql-server-2012 columnstore

14
推荐指数
1
解决办法
3441
查看次数

对多个查询列使用相同的 CASE WHEN 条件

是否有“更好”的方法来重写SELECT多个列使用相同CASE WHEN条件的子句,以便条件只检查一次?

请参阅下面的示例。

SELECT
    CASE testStatus 
        WHEN 'A' THEN 'Authorized'
        WHEN 'C' THEN 'Completed'
        WHEN 'P' THEN 'In Progress'
        WHEN 'X' THEN 'Cancelled'
    END AS Status,

    CASE testStatus 
        WHEN 'A' THEN authTime
        WHEN 'C' THEN cmplTime
        WHEN 'P' THEN strtTime
        WHEN 'X' THEN cancTime
    END AS lastEventTime,

    CASE testStatus 
        WHEN 'A' THEN authBy
        WHEN 'C' THEN cmplBy
        WHEN 'P' THEN strtBy
        WHEN 'X' THEN cancBy
    END AS lastEventUser
FROM test
Run Code Online (Sandbox Code Playgroud)

在非 sql 伪代码中,代码可能如下所示:

CASE testStatus
    WHEN …
Run Code Online (Sandbox Code Playgroud)

oracle database-design best-practices oracle-10g

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

我可以创建用户定义的表类型并在同一个事务中使用它吗?

当我执行以下命令时(在管理工作室中,GO 会将命令分成批处理)

use tempdb

begin tran
go

CREATE TYPE dbo.IntIntSet AS TABLE(
    Value0 Int NOT NULL,
    Value1 Int NOT NULL
)
go

declare @myPK dbo.IntIntSet;
go

rollback
Run Code Online (Sandbox Code Playgroud)

我收到一条死锁错误消息。我的过程已经陷入僵局。我在 2008、2008R2 和 2012 中看到过这种行为。

有没有办法在它创建的同一个事务中使用我新创建的类型?

sql-server-2008 sql-server deadlock sql-server-2012

14
推荐指数
1
解决办法
1万
查看次数

如何使用 TSQL 动态更改数据库

我在尝试将 SSMS 的上下文动态更改为动态 SQL 中指定的数据库时遇到问题:

EXEC sys.sp_executesql N'USE db1 ' ;
Run Code Online (Sandbox Code Playgroud)

它成功执行,但 SSMS 的数据库上下文不会改变。

我试过对上面的稍作修改

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

同样,它成功执行,但数据库没有改变。

sql-server dynamic-sql t-sql sql-server-2014

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

登录不会跨可用性组同步

我们在 AlwaysOn 组中有 2 台服务器。

虽然每个同步数据库中的用户帐户都存在于两台服务器上,但数据库实例级登录仅存在于其中一台服务器上。即 DBINSTANCE->Security->Logins 在一台服务器上丢失。

因此,当发生故障转移时,我会在第二台服务器(没有相应的实例级别登录)上登录失败。

我如何克服这个问题?我应该以特殊方式设置用户帐户吗?

sql-server sql-server-2012 availability-groups logins

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

如何从 Azure SQL 数据库中删除错误的执行计划?

DBCC FREEPROCCACHE在 Azure SQL DB 中不起作用。我还能如何强制计划以一种不会伤害生产系统的方式将自己踢出缓存(即我不能随意更改表)?这是专门为 Entity Framework 创建的 SQL,所以这些不是自我管理的存储过程 - 它是有效的动态 SQL。

(来源是糟糕的索引 -> 糟糕的统计数据等。这一切都已解决,但糟糕的计划不会消失。)

更新: 当他首先到达那里时,我选择了@mrdenny 的解决方案。然而,我成功地使用@Aaron Bertrand 的脚本来执行这项工作。感谢大家的帮助!!

sql-server execution-plan azure-sql-database

13
推荐指数
3
解决办法
8674
查看次数

什么是 SSMS 选项“在没有附加执行选项的情况下执行存储过程快捷方式”?

这是一个冗长的选项;没有文档,网络搜索也无济于事。当我执行查询时,我没有注意到选中或未选中选项的区别。这个设置控制什么?

sql-server stored-procedures ssms

13
推荐指数
1
解决办法
907
查看次数

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

我的组织正计划采用 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
查看次数

为什么不支持删除列上的 Identity 属性

我读过,在 SQL Server 2000 之后,删除了“取消标识”标识列的能力。而且这是“按设计”(不仅仅是缺失的功能)。

这是我在博客上找到的一个例子。它涉及更新系统表。(并且在 SQL Server 2000 之后删除了该功能。)我认为通过系统表执行此操作不是一个好主意。我只是想知道为什么没有以另一种方式执行此操作的功能。

解决这个问题会给我带来大量的工作。(在不容忍停机的环境中将数亿行复制到新表中。)

所以我想我会问“为什么”。

Sql Server 2005 和更高版本中的哪些更改使这成为一件坏事?或者它总是很糟糕,只是没有被锁定?

再次将标识列设为普通列会违反什么“最佳实践”(或类似原则)?

——

更新以回答“我为什么这样做”的请求:
这是一个非常高级的摘要:我将开始向我的表添加分区。(这样我就可以存档/清除旧数据。)这很容易。但我偶尔需要将记录移动到不同的分区,这样它就不会被删除(当一个分区出现进行归档/删除时)。(我的分区列增加了 2,以便始终有空间将行移动到不同的分区。)

但是如果分区列是标识列,那么我必须删除并重新插入值(没有办法更新标识列的值)。这会导致复制问题。

所以我想使用序列而不是标识列。但是这种切换在大型数据库上非常困难。

sql-server identity

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

找不到正在创建备份的进程

我们在客户服务器上安装了一个 SQL Server 2008 实例。客户的 IT 部门负责机器的各种备份。

SQL Server 日志显示每天晚上 7 点都有完整备份,但我们找不到在 SQL Server 中安排任何计划的证据。

我们联系的技术人员无法告诉我们是否有某种自动备份,他们只告诉我们整个机器正在备份。

使用我在这个论坛帖子中找到的脚本,我发现物理设备名称是一个 GUID,这意味着这是一个外部备份过程

USE [msdb]
GO 
SELECT 
    [bs].[database_name], 
    [bs].[backup_start_date], 
    [bs].[backup_finish_date], 
    [bs].Server_name,
    [bs].user_name AS [BackupCreator] ,
    [bmf].physical_device_name
FROM msdb..backupset bs  
INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] 
ORDER BY [bs].[backup_start_date] DESC
Run Code Online (Sandbox Code Playgroud)

这是上述查询中的一行:

db_name 2015-09-16 19:01:23.000 2015-09-16 19:01:28.000
SERVER_NAME NT AUTHORITY\SYSTEM
{424F084A-F35D-4A66-8FC7-0722778A859

此外,备份开始和完成日期仅跨越 5 秒,所以我想很明显这不是 sql server 的工作。

这是日志中的一行:

2015-09-03 19:02:30.71 备份
数据库备份。
数据库:db_name,创建日期(时间):2012/10/12(20:52:11),转储页面:3290021,
第一个 LSN:276028:152755:172,最后一个 LSN:276028:152827:1,转储设备数: 1、
设备信息:
(FILE=1, TYPE=VIRTUAL_DEVICE: {'{95380B0A-D50B-408F-B95F-1AB8975BA7F8}5'})。 …

sql-server-2008 sql-server backup

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