Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
SQL Server如何确定选择表时锁定的顺序?
当系统处于负载状态时,我有两个存储过程处于死锁状态。当Proc B插入同一张表时,Proc A从表中选择。锁定图显示Proc A具有Proc B希望为其IX模式锁定的S模式页面锁定,但是Proc A正在等待针对Proc B已经具有IX模式页面锁定的另一页面的S模式页面锁定。 。 显然,可以通过确保两个查询以相同的顺序锁定表中的页面来解决此问题,但是我不知道该怎么做。 我的问题是:SQL Server如何确定在执行INSERT和SELECT时锁定页面的顺序,以及如何修改此行为?

2
在IsolationLevel.ReadUncommitted上发布的共享锁
我读到,如果我使用IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,看到了以下锁: 资源类型:HOBT 请求模式:S(共享) 什么是HOBT锁?与HBT(堆或二叉树锁)有关的东西吗? 为什么我还会得到S锁? 如何在不打开隔离级别快照选项的情况下进行查询时避免共享锁定? 我正在SQLServer 2008上对此进行测试,并且快照选项已设置为off。该查询仅执行选择。 我可以看到Sch-S是必需的,尽管SQL Server似乎没有在锁查询中显示它。它怎么仍然发出共享锁?根据: 设置事务隔离级别(Transact-SQL) 在该READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。 所以我有点困惑。

4
SQL Server分区-分区密钥使用什么?
我从来没有使用过SQL Server分区,但是目前我面临着设计数据库的问题,而这些数据库可能需要它的支持。该系统用于优惠券。优惠券应定期发行,通常每六周发行一次,尽管也会临时发行(例如特殊活动)。有1500万客户,每次发行活动,每个客户将获得6种不同的优惠券类型,总共提供9000万个优惠券实例。我们需要跟踪优惠券实例的兑换数据并保持6个月,尽管通常优惠券仅有效6周。任何兑换无效优惠券的请求都不会到达数据库,因为直到POS都将对其进行验证。 在六个月的时间内,我们需要在Coupon Instance表中存储3.6亿行,在Redemption表中存储多达7200万行(假设最大20%的赎回率)。我感觉这些数字对于单个分区来说太大了吗? 我的问题是-用作分区键是什么?一个明显的候选者将是通过发行事件,给出大约6个分区。但是然后我认为,即使那样也会使分区大小太大而无法实现最佳性能?是否可以通过两个密钥进行划分,例如按发布事件+客户ID的最后一位数字?因此逻辑将是: If issuance event = 1 and last digit of customer id < 5 then Store in partition 1 Else if issuance event = 1 and last digit of customer id >4 then Store in partition 2 Else if issuance event =2 and last digit of …

3
通常如何存储数据库中行的每次更改的记录?
在我正在从事的项目中,必须跟踪对数据库某些表中行的每次更改,以进行进一步的审核或回滚。必须很容易找到谁修改了该行,从哪个IP地址以及何时修改了该行,并且能够还原以前的版本。 例如,Stack Exchange使用了类似的方法。当我更改其他人的问题时,可能会发现我已更改了该问题,并回滚了所做的更改。 假设我当前的架构具有与普通业务应用程序大致相同的属性(下),那么用于将每个更改存储到数据库中的对象的通用技术是什么? 对象的大小相对较小:nvarchar(1000)例如,可能会有一些,但不是很大的二进制数据斑点,该斑点直接存储在磁盘上,并且可以直接访问,而不是通过Microsoft SQL访问filestream, 数据库负载非常低,整个数据库由服务器上的一个虚拟机处理, 对先前版本的访问不必与对最新版本的访问一样快,但仍必须是最新版本¹,而又不能太慢²。 <tl-dr> 我考虑过以下情况,但是我对这种情况没有真正的经验,所以我会听到其他人的意见: 将所有内容存储在同一张表中,按ID和版本区分行。国际海事组织,这是非常愚蠢的,并且迟早会影响性能。使用这种方法,也不可能为最新项目和版本跟踪设置不同的安全级别。最后,每个查询的编写都会更加复杂。实际上,要访问最新数据,我将被迫按ID将所有内容分组并在每个组中检索最新版本。 将最新版本存储在一个表中,并在每次更改时将过时的版本复制到另一个架构中的另一个表中。缺陷在于,即使价值不变,我们每次也会存储每个价值。将不变的值设置null为并不是解决方案,因为我还必须跟踪何时将值更改为null或更改为null。 将最新版本存储在一个表中,将已更改属性及其先前值的列表存储在另一表中。这似乎有两个缺陷:最重要的是,在同一列中对异构类型的先前值进行排序的唯一方法是使用binary(max)。第二个是,我认为,在向用户显示以前的版本时,使用这种结构会更加困难。 执行与前两点相同的操作,但是将版本存储在单独的数据库中。从性能角度来看,为了避免通过在同一数据库中保留以前的版本来减慢对最新版本的访问,可能会很有趣。仍然,我认为这是一个过早的优化,只有在有证据证明在同一数据库中拥有较旧和最新版本是瓶颈时,才必须进行此优化。 </ tl-dr> ¹例如,将更改存储到日志文件中(就像处理HTTP日志一样),并在服务器负载最低的晚上将数据从日志刷新到数据库中是不可接受的。有关不同版本的信息必须立即可用或几乎立即可用;几秒钟的延迟是可以接受的。 ²信息访问频率不是很高,只有特定的用户组才能访问,但是仍然不能强迫他们等待30秒才能显示版本列表。同样,延迟几秒钟是可以接受的。

3
数据仓库设计:组合的日期时间维度与单独的日期和时间维度和时区
我们刚刚开始为新的数据仓库设计,我们正在尝试设计日期和时间维度的工作方式。我们需要能够支持多个时区(可能至少是GMT,IST,PST和EST)。最初,我们以为我们可以将日期时间维度的组合范围缩小到15分钟左右,这样一来,事实表中就有一个键,而所有受支持时区的所有不同日期时间数据都在一个维度表中。(即日期键,GMT日期,GMT时间,IST日期,IST时间等) Kimball建议将日期维度与日期时间维度分开,以防止表格过大(数据仓库工具包第240页),听起来不错,但这意味着我们在每个时区的事实表中都有两个键我们需要支持(一个代表日期,另一个代表一天中的时间)。 由于我在这方面经验不足,所以我希望有人知道两种方法之间的权衡,即性能与所有不同时区密钥的管理。也许还有其他方法,我已经看到有人谈论每个时区在事实表中有单独的行,但是如果您的事实表有数百万行,那么您需要将其四倍以添加时区,这似乎是一个问题。 如果我们进行15分钟的粒化,那么我们的日期时间维度表中每年将有131,400(24 * 15 * 365)行,这听起来听起来并不可怕,但是直到我们测试了一些之后,我们才能确定原型查询。在事实表中具有单独的时区键的另一个问题是查询必须根据所需的时区将维度表连接到其他列,也许这是SSAS为您解决的事情,我不确定。 感谢您的任何想法,-Matt


3
如何对SQL Server进行压力测试?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 3年前关闭。 我的任务是对我们的MSSQL Server和MySQL Server进行压力测试。我想知道是否可以在当前系统和新系统上使用任何工具或脚本来比较性能? 我想衡量对磁盘和处理器性能的读/写。其他可能有用的东西也将很好。 谢谢!

3
如何对两个或更多列进行条件排序
在MS SQL Server 2005中,我正在编写一个带有条件排序的查询,而我的问题是我不知道如何使用两列对条件进行排序? 如果我这样编写代码,则正常运行 select * from table order by case @pkr when 'kol' then kol when 'nci' then nci end 我不知道如何对两个或更多列进行条件排序 select * from table order by case @pkr when 'KOL-NCI' then kol,nci when 'kol-MPCI' then kol,mpci end 有一个制作动态TSQL并使用它的想法,sp_executesql但我仍在寻找更好的想法?

1
如何确定SSRS中使用了哪些数据源?
我们将大量SSRS(2008)报告部署到了我们的门户网站。我们已经编辑了一些报告,以使用与最初部署它不同的共享数据源。 我正在寻找一种查询ReportServer数据库的方法,以向我展示哪些报告使用这些共享数据源中的哪些。我发现您可以使用存储在Catalog.Content中的XML数据来显示正在使用的数据源,但是这对于最初部署报表的数据源来说似乎很明显。
10 sql-server  ssrs 

2
SSIS脚本组件-如何修改Output0Buffer
我有一个脚本组件,该组件接受来自SQL Azure数据库表的记录。然后,脚本调用Web服务,该服务返回失败记录和成功记录的数量。 对于所有记录,我想添加“成功”或“失败”的“状态”字段,这将从脚本组件获取输出。 然后,将这些输出记录到文本文件中。 问题:由于Web服务调用仅在执行后发生,因此我无法为每个输入记录添加状态。 我尝试了这个,但仍然行不通: public override void Input0_ProcessInputRow(Input0Buffer Row) { listOfData.Add(new ClockData { TimeClockID=Row.TimeClockID, PersonID=Row.EmployeeCode, LocationCode=Row.ClockInServiceContextID, ClockInDateTime=Row.ClockInDateTime, ClockOutDateTime=Row.ClockOutDateTime }); } public override void CreateNewOutputRows() { MessageBox.Show("Test CreateNewOutputRows"); MessageBox.Show(listOfData.Count.ToString()); foreach (var item in listOfData) { Output0Buffer.AddRow(); Output0Buffer.EmployeeCode = item.PersonID; MessageBox.Show(item.PersonID); } }
10 sql-server  ssis 

2
镜像分发服务器
有人成功镜像了分发数据库吗?我们有专用的服务器作为分发服务器。它处理我们从产品到报告的所有推式复制。我们希望在附近构建一个相同的服务器,以防分发服务器崩溃。有没有人成功建立这样的东西?

2
行级和页级锁定之间的区别和后果
尝试运行维护计划时,出现以下错误: 执行查询“”失败,并出现以下错误:“表”“上的索引”“(分区1)无法重新组织,因为页面级锁定已禁用。” 当前,我们已在此索引上启用行级锁定。我可以启用页面级别锁定,但是不确定会产生什么影响。 我的问题是:这两种锁定方案之间有什么区别,它们在生产中的实际后果是什么?


6
更频繁地备份SQL DB
我目前有一个计划任务,该任务每天晚上2点触发,调用SQLCMD.exe,并将其传递给.sql脚本以运行备份(如下所示)。我们是一家很小的公司,由于业务方面的重大增长,需求不断增长。此时丢失1天的数据将花费数万美元,而去年同期则为数百美元。在我可以将这个数据库平台迁移到另一个解决方案之前,该解决方案通过SQL Azure这样的主要冗余进行数据镜像,那么如何做才能获得更频繁的备份呢?下面的此脚本是否强制数据库脱机?我可以与与数据库交互的用户一起运行此脚本吗? USE CompanyCRM; GO BACKUP DATABASE CompanyCRM TO DISK = 'D:\CRMBackups\CompanyCRMCRM.Bak' WITH FORMAT, MEDIANAME = 'CompanyCRM_Backup', NAME = 'Full Backup of CompanyCRM'; GO 更新资料 哇,显然,这里的DBA社区比SO上的要多得多。感谢到目前为止的反馈。唯一缺少的是“方法”。我已经在上面显示了用于日常备份的SQL命令,但是增量日志备份的示例是MIA。这不是一个很大的数据库,它当前在SQLExpress上运行。当我说HA或SQL Azure时,我是专门指的是我们目前还没有的小型企业架构。该实例当前正在我们的ONLY服务器上运行。如果该服务器崩溃,那么我们的恢复时间将成为关键时刻。这就是为什么SQL Azure变得有吸引力的原因。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.