数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答


1
什么是SQLServer中的BMK运算符
我试图回答这个问题,说明from子句是可选的..但是我在计划中停留在运算符上。.下面是执行计划的屏幕截图.. 如您所见,查询计划中有BMK运算符,但没有任何指示显示其计算方式。 到目前为止,我已经尝试过的步骤: 我开始使用BMK1000进行搜索,但是它显示了使用同一运算符的一系列问题。最后,我找到了一个线程,其中显示“您要引用的BMK是保留在堆中的存储位置使用非集群索引而不是集群键。”。但是由于我没有任何索引,所以不确定与我的关系如何。 问: 什么是BMK运算符以及如何计算它。任何指针也将有帮助 这是SQLFiddle来再现问题

4
如何处理500M +项目的查询
我的数据结构如下: date: <timestamp> filter_a: <integer> -> range [0, 1000] filter_b: <integer> -> range [0, 1000] filter_c: <integer> -> range [0, 86400] filter_d: <integer> -> range [0, 6] group: <string> second_group: <integer> variable_a: <float> variable_b: <float> variable_c: <float> a couple more no very important 我需要执行以下查询: 第一: 通过筛选数据date,filter_a,filter_b,filter_c和其他人 其次,用过滤后的数据: 计算所有记录 得到平均的variable_a,variable_b并variable_c 得到标准差的variable_a,variable_b并variable_c …

2
搜索谓词中的标量运算符
在SQL Server 2012中,我使用了实际查询的简化版本。从“容器”表中选择数据时,它在查找谓词中具有标量运算符。 标称运算符在此查找谓词中的用途是什么? CREATE TABLE #EligibleOrders (OrderID INT PRIMARY KEY, StatusCD CHAR(3), CreatedOnDate DATETIME ) --insert logic into #EligibleOrders --Final Query SELECT T2.OrderID ,olic.LineItemID, SUM(c.quantity) AS ShippedQty, COUNT(DISTINCT c.ContainerID) AS ShippedCases FROM #EligibleOrders T2 INNER JOIN dbo.OrderLineItemContainers (NOLOCK) AS olic ON olic.OrderID = T2.OrderID INNER JOIN dbo.Containers (NOLOCK) AS …

1
SQL Server更新了只读文件组上的记录?
我的数据仓库中有一个非常大的数据库,我们在其中实施了分区以管理维护和备份。一定期限的记录最终每月一次迁移到一个只读文件组。 有时,我们的ETL流程会尝试更新已迁移到存档的较旧记录,我们希望这些记录会失败。但是,我至少有两个最近的示例,其中即使测试记录似乎位于测试环境中的只读文件组的分区中(查询sys.partition_functions和sys.partition_range_values),该记录也会被更新。 当尝试更新记录时,生产中的相同记录会导致预期的失败。到目前为止,我们已经两次捕获到该更新,但在生产中失败了,但是在测试中成功了(反之亦然)。 相关环境事实: SQL Server 2012 SP3 CU3(内部版本11.0.6537.0) 测试是开发人员版,生产是企业 可以根据要求提供其他人:现在已严重困扰... 更新2016-08-19 新记录在一夜之间以某种方式更新了。确认它在只读文件组中。发现我可以更新同时插入的记录(即也位于只读文件组的同一分区上)。我在同一分区上确定了一条记录,并且能够多次更新该记录。尝试更新过夜更新的记录会导致预期的失败。 更新2016-08-11 在每晚的测试过程中,只读分区上的更新继续发生。尝试从该过程中更新相同的记录失败。尝试以以前更新记录的用户身份登录时更新相同的记录失败。我也无法通过更新夜间程序尚未触及的类似记录来重复该问题。 更新2016-08-04 今天发现它不限于该单个表,因为我发现了使用相同分区方案在不同表上再次出现相同行为的情况。 更新2016-08-03 运行该脚本这个MSDN脚本证实了我使用肯德拉小的分区助手的意见时得到ph.FilegroupDetail和ph.ObjectDetail从该演示。有问题的记录位于分区2中(有问题的记录的分区列值为2015年3月18日) Filegroup Low Boundary UpperBoundary Archive (RO) NULL 1900-01-01 Archive (RO) 1900-01-01 2015-04-01 ActiveFG (RW) 2015-04-01 2015-07-01 ActiveFG (RW) 2015-07-01 2015-10-01 ActiveFG (RW) 2015-10-01 2015-01-01 ActiveFG (RW) 2016-01-01 2016-04-01 ActiveFG (RW) 2016-04-01 …

1
从2014年升级到2016年的AlwaysOn AG的推荐方法
建议Availability Groups使用一个同步副本从SQL 2014 升级到2016 的建议过程是什么? 我的理解是,in-place升级并不是数据库专业人员真正喜欢的。有没有办法避免in-place升级Availability Groups?是否有可能将2016年服务器加入现有的2014年可用性组并在其中进行故障转移,然后“杀死”其他实例之一并对其进行升级?(例如,通过在同一主机上并排删除/重新安装SQL) 还有其他应考虑的升级方案吗? 理想的解决方案是我们始终有2个online副本,并且不需要进行任何in-place升级。

1
CLUSTER对性能的影响
我正在尝试优化我的Postgres 9.2数据库以加快具有日期限制的查询。 我有一timestamp列,但大多数情况下我都想找一天,所以我创建了一个timestamp要date解析的索引: CREATE INDEX foo_my_timestamp_idx ON foo USING btree ((my_timestamp::date) DESC); 现在,为了提高性能,我CLUSTER foo使用上面的索引表: CLUSTER foo USING foo_my_timestamp_idx; 根据SQL-CLUSTER上的手册,该表 根据索引信息进行物理重新排序 我想知道使用表PK(请说id_foo)对其他查询的性能是否有影响。有没有缺点?

2
为单个数据库启用查询日志
我在mysql 5.6服务器中有许多数据库架构,现在这里的问题是我只想捕获对一个架构的查询。 我无法为整个服务器启用查询日志,因为我的架构之一负载很高,它将影响服务器。 无论采用哪种方式,任何工具,我都只能通过单个模式记录查询。 我发现了基准测试图,该图显示了启用查询日志后每秒对事务的影响。

3
为什么时态表记录事务的开始时间?
更新临时表中的行时,该行的旧值存储在历史记录表中,事务开始时间为SysEndTime。当前表中的新值将使事务开始时间为SysStartTime。 SysStartTime并SysEndTime在datetime2使用时态表来记录当行是当前版本列。事务开始时间是包含更新的事务开始的时间。 BOL说: 系统datetime2列中记录的时间基于事务本身的开始时间。例如,在单个事务中插入的所有行将在与SYSTEM_TIME周期开始相对应的列中记录相同的UTC时间。 示例:我开始从以下位置更新“订单”表中的所有行,20160707 11:00:00并且该事务需要5分钟才能运行。这将在历史记录表中为每行创建一行,并用SysEndTimeas 20160707 11:00:00。在当前表中的所有行会产生SysStartTime的20160707 11:00:00。 如果有人要20160707 11:01:00在更新运行时执行查询,他们将看到旧值(假设默认读取已提交隔离级别)。 但是,如果有人随后使用AS OF语法查询时态表,那么20160707 11:01:00他们将看到新值,因为它们SysStartTime将是20160707 11:00:00。 对我来说,这意味着它不会显示当时的行。如果它使用事务结束时间,则该问题将不存在。 问题:这是设计使然吗?我想念什么吗? 我可以认为它正在使用事务开始时间的唯一原因是,它是事务开始时唯一的“已知”时间。它不知道事务在开始时将在何时结束,并且在结束时应用结束时间将花费一些时间,这将使正在应用的结束时间无效。这有意义吗? 这应该允许您重新创建问题。

2
为每个更改的行增加一个计数器
我正在使用没有SEQUENCE功能的SQL Server 2008 Standard 。 外部系统从主数据库的几个专用表中读取数据。外部系统保留数据副本,并定期检查数据更改并刷新其副本。 为了使同步高效,我只想传输自上次同步以来已更新或插入的行。(行永远不会删除)。要知道自上次同步以来已更新或插入了哪些行,每个表中都有一bigint列RowUpdateCounter。 这个想法是,每当插入或更新一行时,其RowUpdateCounter列中的数字就会改变。列中的值RowUpdateCounter应取自不断增加的数字序列。RowUpdateCounter列中的值应唯一,并且表中存储的每个新值都应大于任何先前值。 请查看显示所需行为的脚本。 架构图 CREATE TABLE [dbo].[Test]( [ID] [int] NOT NULL, [Value] [varchar](50) NOT NULL, [RowUpdateCounter] [bigint] NOT NULL, CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ( [ID] ASC )) GO CREATE UNIQUE NONCLUSTERED INDEX [IX_RowUpdateCounter] ON [dbo].[Test] ( [RowUpdateCounter] ASC ) GO 插入一些行 INSERT INTO …


4
SQL 2016 SQL Server声明:文件:<pageref.cpp>,行= 951失败声明
我目前正在将数据仓库从SQL 2012升级到SQL2016。新旧DW并行运行。 我的ETL流程(由第三方在SSIS中开发的框架)在2012年成功运行了两年多,但在2016年失败了。到目前为止,数据库和ETL流程是相同的。 这两个服务器都是在VMWare上运行的虚拟机。旧服务器是Win 2008,具有24Gb RAM。SQL 2012标准 最大内存设置为16Gb。新服务器是Win 2012,具有64Gb RAM。SQL 2016开发 最大内存设置为50Gb。新的DW正在运行v13.0.1601.5 RTM Developer Edition(64位)。 在运行我的ETL进程时,将SQL合并到维或事实表中的加载步骤失败,并出现以下错误。 全文: 描述:SQL Server声明:文件:,line = 951失败声明='IS_OFF(BUF_MINLOGGED,m_buf-&gt; bstat)|| pageModifyType!= PageModifyType_Contents || GetPagePtr()-&gt; IsTextPage()'。此错误可能与时序有关。如果重新运行该语句后错误仍然存​​在,请使用DBCC CHECKDB检查数据库的结构完整性,或者重新启动服务器以确保内存中的数据结构没有损坏。 按照建议,我已经运行DBCC,没有发现错误。我还重新启动了SQL。然后,我重新启动了ETL流程,并得到了相同的错误。 我对此错误的搜索显示,这是SQL 2008、2012和2014年的已知错误并已在后续的修补程序和累积更新中修复。因此,我很惊讶看到它在2016年重新出现。 我发现的链接说,如果数据库处于“简单”或“大容量日志记录”恢复模型中,则在尝试执行插入操作时会影响SSIS。(我正在以简单恢复模式运行) 建议的解决方法是将Db恢复模型更改为FULL。我已经尝试过了,并且可以正常工作,但这并不是数据仓库的解决方案。 其他人在2016年遇到过这个吗? 谁能建议替代解决方法? 更新: 2016年7月26日:我应用了重要更新KB3164398(v13.0.1708.0),问题仍然存在。 2016年7月27日:我已应用累积更新CU1 KB3164674(v13.0.2149.0)。 2016/3/8:在我们最小的立方体上,错误在一夜之间发生。CU1无法解决问题。今天,我报告了MS Connect上的错误,并且还与Microsoft记录了支持电话。 2016年12月8日:MS-Support最初做出了回应,但回应是“我们没有针对此问题的解决方案”。支持人员将与他的同事讨论该问题,并尽快与我联系。8天后,我没有收到他的消息。 尽管我没有“解决方案”,但我们确实找到了适合我们的解决方法。查看我发布的答案。 29/9/2016。我上周应用了CU2。在Thursay上,我们意外地运行了旧版本的合并,但由于相同的错误再次失败。所以.. CU2也没有修复它。 23/1/2017:我应用了2016 SP1 CU1,我相信这已经解决了问题。特别是KB3205964

1
谁是“骗子”,为什么他拥有我的架构?
我在Compose.io中具有Postgres DB部署,并且我正在为我的应用程序使用标准的“ compose”数据库。我想清除当前数据库的内容,以便可以使用新的架构重新创建数据库。我已经读到,做到这一点的最佳方法是使用“删除架构公共级联”,但是当我尝试在数据库上执行此操作时,我得到了 ERROR: must be owner of schema public 事实证明,该模式不是由admin(组成用户提供psql访问)所拥有,而是由一个名为的用户所拥有focker。 compose=&gt; \dn List of schemas Name | Owner --------+-------- public | focker (1 row) 我尝试更改架构所有者,但失败,并出现与上述相同的错误。 为什么我的数据库是这样设置的?有什么办法可以更改它,以便管理员用户可以清除数据库?

2
有没有一种方法可以使此选择通过一次查找来检索相同的结果?
通过修改查询或影响优化器的策略,是否可以通过一次查找或扫描检索与以下相同的数据? 与此类似的代码和架构目前在SQL Server 2014中。 复制脚本。设定: USE tempdb; GO IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL DROP TABLE dbo.TestUpload; CREATE TABLE dbo.TestUpload( JobRunId bigint NOT NULL, ThingAName nvarchar(255) NOT NULL, ThingAType nvarchar(255) NOT NULL, ThingAGranularity nvarchar(255) NOT NULL, ThingBName nvarchar(255) NOT NULL, ThingBType nvarchar(255) NOT NULL, ThingBGranularity nvarchar(255) NOT NULL ); CREATE …

1
为什么要进行更多(以及数量不等的)逻辑读取并预读(预取)?
在我的SQL Server中创建tpch数据库后,我尝试了以下查询: set statistics io on DBCC DROPCLEANBUFFERS; select top 100 * from dbo.lineitem order by l_partkey; 表lineitem在l_partkey上具有非聚集索引。我多次发出上述查询,发现每次的逻辑读取都不同: Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. Table 'lineitem'. Scan count 1, logical …

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.