我有一个 SQL 2016 表,如下所示:
我在表上有一个列存储聚集索引,没有其他索引。我正在执行以下查询:
Select *
From dbo.PanelWorkflow
Where ReadTime Between '4/1/2016' And '4/5/2016' And Lineage = 'PBG11A' And ProcessNumber = 5400
Run Code Online (Sandbox Code Playgroud)
查询计划如下所示:
该表有 1.1B 行。查询计划显示了一次扫描,执行查询大约需要 1 分钟。返回约 21K 行。这是我对列存储聚集索引的期望吗?是否总是进行扫描(假设表上没有其他索引)?这是我可以期待的表现吗(可以接受但不是很好)?
我设置了统计 IO 并得到以下输出:
Table 'PanelWorkflow'. Scan count 2, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 9733431, lob physical reads 195, lob read-ahead reads 13045645.
Table 'PanelWorkflow'. Segment reads 955, segment skipped 336.
Run Code Online (Sandbox Code Playgroud)
最后,上面的查询严格来说是一个测试查询,用于了解 CSI 如何执行和操作。这不是生产级查询。
如何对sp_spaceused所有数据库中的所有表执行?
即如何在sp_spaceused里面执行sp_msforeachdb。
例如:
sp_msforeachdb 'sp_msforeachtable'sp_spaceused"?"''
Run Code Online (Sandbox Code Playgroud) 在新的 SQL Server 环境中,我试图为某些计数器设置性能基线。让我解释一下我在做什么。
我通过性能监视器捕获了性能计数器并获取了大约一个月的数据(以 CSV 格式),并使用它来找到平均值,这将为每月性能提供基准。
收集的计数器:
有人可以解释我为捕获性能基线所做的工作是正确还是错误?
我们有一个奇怪的情况。我们有一个旧数据库和新数据库,两者都采用不同的架构(SQL Server)。我们正在使用 abinitio 将数据从旧数据复制到新数据。
现在如果由于某种原因新结构对我们不起作用,我们需要一个回滚计划来将数据从新的复制到旧的。但这也可能意味着在新的和插入中更新的记录。
此外,如果这必须在客户不停机的情况下完成,我们如何才能做到这一点?
前段时间我使用了查询提示,但后来意识到大多数时候 SQL Server 比我更聪明。 构建额外的索引/重新组织数据或查询并获得比强制服务器使用计划要好得多的结果这通常效率低下,但对于某些数据子集来说速度足够快。但现在我处于一种我不知道如何更好地组织数据的情况。
我有两张桌子。第一个表 T1 是 (Id, CustomerId),第二个表 T2 具有相同的列。我想在 CustomerId 上加入 T1 到 T2。并获得前 N 行。在这种情况下,优化器看到我只需要 N 个 top 并说,“嘿,我将使用循环并很快找到 N 个匹配项,尤其是当我使用索引查找时。” 但它不起作用,因为没有满足条件的数据。因此它使用 aloop join来连接一个 25m 的表和一个非常慢的 100k 表。
当我强制 SQL Server 使用合并联接时,我得到以下计划,该计划在一秒钟内执行:
我不想强迫它有两个原因:
在这种情况下我该怎么办?
背景: SQL Server Version 2014,设计的是发票订单系统。
我有几个问题来确认我对 SQL Server 并发性的看法。作为简要背景,创建此模型的开发人员构建了每个订单库存表(属于订单的一部分的项目)和带有InUse字段的订单表(订单)。会发生的情况是,当销售人员尝试更新订单时,通过更改订购商品的名称(例如需要将一本名为《哈利波特》的书重命名为《哈利波特》),如果其他人正在阅读该数据,他们就不能访问对象。
实际的数据库设计是这样的:该SalesOrder表将具有SalesPersonId与InUse列设置为1,没有人可以访问OrderId。这意味着对于每次读取、更新、插入或删除,都会发生三个事务:首先将更新设置InUse为 1,以便没有人可以访问特定的OrderId,然后是实际事务,然后是将最终更新设置InUse为 0 以允许人们访问那个OrderId。这意味着多次读取和写入而不是更少 - 随着规模的扩大,性能噩梦!
开发人员解释说,如果两个用户尝试写入或更新订单中的项目,这可以解决并发问题。嗯?
根据我对 SQL Server 的了解,如果两个用户尝试写入相同的顺序——比如添加两个新项目,它们都会被添加,因为这些将作为元数据插入日志中,然后添加到磁盘上。另外,如果插入物完全相同,我们应该设计具有唯一约束的表来防止这种情况(公平地说,该开发人员根本不使用约束和外键),因此不会发生第二次插入。这意味着两个用户可以将插入写入同一个表,并且插入通常会很快发生。
此外,如果两个用户正在更新同一个记录——比如说一个OrderItemId名字为“Harry Potter”的 1 来更新为“Harry Potter”(这是一个特定的项目OrderId),即使是两个不同的更新也会发生,但是第二个无关紧要,因为它是相同的更新。 只有当对同一对象发生两次不同的更新时,例如更新一是“哈利波特”,更新二是“哈利波特”,才会出现问题,因为它们不同。但是,不允许用户访问对象并不能解决这个问题(他的设计),因为用户一个的更新可能是错误的更新,从而锁定了用户 2(反之亦然)。
我不明白这个设计;对我来说,它反映了对SQL Server并发的完全误解,以及SQL数据库如何处理事务,而且他创建的大部分内容已经由SQL Server在后端处理(除了没有解决错误更新的问题) . 但是,也许我遗漏了一些东西,其他人可以启发我这是 SQL Server 的标准做法(我以前从未见过这种设计)。
因此,如果我有一个带有值的表:
ID
------
a1b2c3
ac2b31
db13a2
Run Code Online (Sandbox Code Playgroud)
我希望结果看起来像这样
Id
------
abc123
acb231
dba132
Run Code Online (Sandbox Code Playgroud)
换句话说,重新排列字符串,使所有字符首先出现,然后是所有数字。顺序不重要。
(我所说的无循环是指,没有传统的循环。我正在查看一些 CTE 示例,但无法在此处进行调整。)
我正在尝试提取有关重复调度的信息,但似乎无法提出一个简单的解决方案来提取我的报告数据。
我有下表:
tblMaster15
ID | Equipment
----------------
1 | Sink
----------------
2 | Grill
Run Code Online (Sandbox Code Playgroud)
另一个包含位置信息的表,我必须使用 ID 加入:
tblMaster15_ABData
ID | Unit | Region
--------------------
1 | 600 | 6000
--------------------
2 | 601 | 7000
Run Code Online (Sandbox Code Playgroud)
我正在尝试生成 ID、单位和设备的列表,但前提是单位和设备在给定时间段内相同超过 3 次。
我已经尝试了以下但它似乎给了我一切,而不仅仅是计数 > 3 的地方。
select m.mrid, a.unit, a.Region, m.Equipment
from MASTER36 m
join MASTER36_ABDATA a
on m.mrid = a.mrid
, (select a.unit, m.Equipment
from MASTER36 m
join MASTER36_ABDATA a
on m.mrid = a.mrid
group by a.unit, m.Equipment
having count(*) > 3 …Run Code Online (Sandbox Code Playgroud) 在尝试确定最合适的高可用性选项时,我们专注于减少停机时间(计划内或计划外)。我已经能够收集有关故障转移群集实例 (FCI) 的统计信息(通过阅读大量 MSDN 文档和博客)。
我还没有找到有关可用性组的故障转移统计信息/次数的文档。
作为比较 (FCI):
故障转移 2008R2 集群的时间范围从 30 秒到 5 分钟不等(取决于流量以及硬件/网络设置):
进行手动故障转移时,它会完成对 LUN 的写入,将 LUN 切换到新的主动节点,并在新的主动节点上启动 SQL Server 实例。
在进行自动故障转移时,启动节点后,它将对数据库进行一致性检查并回滚任何进行中的事务。
可用性组
我知道,当您比较相同的硬件和流量时,可用性组应该能够更快地进行故障转移。
我无法找到比较两者的任何真实世界的实际指标。
具体来说,是否有人对正在积极使用的可用性组中的主写入节点进行故障转移所需的时间有任何指标?
(故障转移到同步辅助)理想情况下,这将包括对任何 Microsoft 或可信赖来源的引用。请不要基于意见,只有指标。
我在 SQL Server 2008 中使用 jtds 1.2.2 驱动程序。下面是我尝试执行的查询
SELECT * from AM_API FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
无论如何,在执行上述查询后,我得到以下错误
Caused by: java.sql.SQLException: Invalid usage of the option NEXT in the FETCH statement.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:631)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777)
at org.jaggeryjs.hostobjects.db.DatabaseHostObject.executeQuery(DatabaseHostObject.java:510)
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
更新
我读过这篇文章,说 FETCH 仅适用于 SQL Server 2012 以上。那么如何在SQL server 2008 中限制结果。要执行的查询不在我的控制之下。我只是后缀FETCH NEXT 10 ROWS ONLY到查询以限制结果。那么有没有办法通过添加限制查询作为查询的后缀来限制结果。
sql-server ×10
columnstore ×1
concurrency ×1
failover ×1
jdbc ×1
join ×1
metrics ×1
migration ×1
optimization ×1
t-sql ×1