我们正在使用 SQL 2008 事务复制将数据从我们的生产数据库复制到我们的报告数据库。
我们最近创建了一个新的“全球”数据库,我们希望将其复制到我们在世界各地的各种生产数据库中。此数据库中的表数量很少(小于 30),并且任何给定表中的最大行数可能是几千。我们不会经常向这个全局数据库添加表和数据。
我们的 DBA 说“复制的固定开销与实际复制的数据量不成比例”。我对事务复制略知一二,但不足以反驳这个论点。复制是否真的存在大量“固定开销”,以至于如果我们不复制大量数据,仍然会占用大量资源?
我刚刚阅读了位于此处的 SQL 2016 列存储索引指南。我们将在 SQL 2016 数据库中有一些相当大的表(数亿到数十亿行),用于 OLTP 和分析。
这些表将主要通过以下两种方式之一进行查询: 1) 用户将根据 Where 子句中的特定离散值检索相当小的结果集(例如,Where SubId = 'ABC');2) 用户将根据日期/时间值范围检索更大的结果集(例如,其中 ReadTime 介于 '2/1/2017' 和 '2/5/2017' 之间)。
由于列存储索引更适合场景 #2(我认为),我正在考虑为场景 #1 制作非列存储(例如,在 SubId 上)并创建非聚集列存储索引(例如,在 ReadTime 上) ) 用于场景 #2。
但是,我不确定这是否真的比在 ReadTime 上创建列存储聚集索引和在 SubId 上创建非列存储索引更好。
我不确定如何做出这个决定。
我需要将一个 SQL Server 2000 数据库还原到 SQL Server 2016。有没有什么可能的方法可以做到这一点,而无需安装 SQL Server 2008 的完整副本,还原到 2008,更改兼容级别,然后将 2008 备份还原到 2016 ? 我知道这行得通,但我真的不想为了这个单一目的而安装 2008 R2,除非我别无选择。
我有以下查询:
Select SubId, Max(ReadTimeLocal)
From dbo.PanelWorkflow
Where ProcessNumber IN (802,1190,1605,1620,1645,1660,1695,1790,1990,2690,2795,2990,3090,3290,3590,3790,4190,4390,4590,5000,5200,5400)
Group By SubId
Run Code Online (Sandbox Code Playgroud)
我在 dbo.PanelWorkflow 表上有以下索引:
CREATE NONCLUSTERED INDEX [IX_PanelWorkflow_ProcessNumber_Lineage] ON [dbo].[PanelWorkflow]
(
[ProcessNumber] ASC,
[Lineage] ASC
)
INCLUDE ( [SubId],[ReadTimeLocal]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
Run Code Online (Sandbox Code Playgroud)
来自 SSMS 的查询计划如下所示:

SSMS 建议我创建以下索引(影响为 54.3)
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[PanelWorkflow] ([ProcessNumber])
INCLUDE ([SubId],[ReadTimeLocal])
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么它建议我创建一个基本上已经存在的索引,而不是使用确实存在的索引?
表中有 8.3 亿行。使用 SQL Server 2012。
我注意到 Azure SQL 数据库上的这个等待统计信息,我以前从未见过。我试过在谷歌上搜索这个等待统计数据,但没有找到关于它是什么的任何好的信息,尽管我看到一些提到它可能与超过为数据库设置的 Azure 性能层有关。
我正在对 SQL Server 2014 执行以下 dmv 查询以查找服务器上的所有活动和任何阻塞活动:
SELECT Distinct
...
FROM sys.dm_exec_requests er
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id
WHERE st.text IS NOT NULL And DB_Name(er.database_id) IN ('Vincent', 'Vincent_Audit')
ORDER BY BlockingSessionId Desc, SessionId
Run Code Online (Sandbox Code Playgroud)
此查询的示例结果如下:
可以看到会话120被112阻塞,112被69阻塞。但是进程69并没有出现,因为它在sys.dm_exec_requests中不存在。
因此,以下查询不返回任何结果:
SELECT *
FROM sys.dm_exec_requests
Where session_id = 69
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?
我有一个 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 如何执行和操作。这不是生产级查询。
我刚刚读完隔离级别的优秀文章在这里。我们公司将很快开始对我们当前产品的重写和扩展开发。我的愿望是拥有一个 OLTP 数据库和一个单独的、更加非规范化的报告数据库。假设我们有一定的纪律性,并且我们的大多数临时和报告类型查询实际上都转到报告数据库,那么我们的 OLTP 数据库具有读取提交的默认隔离级别(我们不需要更严格的隔离级别)听起来合适吗? OLTP 级别)和我们的报告数据库是快照隔离(可能是 RCSI)?
我的想法是,如果我们的 OLTP 数据库实际上是一个真正的 OLTP 数据库并且不作为报告数据库提供双重职责,我们将不需要快照隔离及其相关的开销。但是快照隔离在报告数据库上是可取的,这样读者就不会被不断传入的数据流阻塞,并且读取最后保存的行版本是可以接受的。
我正在尝试在 2016 年执行一个名为 sp_execute_external_script 的新存储过程。我首先需要按如下方式启用外部脚本:
sp_configure 'external scripts enabled', 1;
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我看到此消息:
Configuration option 'external scripts enabled' changed from 1 to 1. Run the RECONFIGURE statement to install.
Run Code Online (Sandbox Code Playgroud)
然后我执行RECONFIGURE并看到一条消息说,"Command(s) completed successfully"。
然后我尝试执行以下操作,以查看 R 是否正常工作:
exec sp_execute_external_script @language =N'R',
@script=N'OutputDataSet<-InputDataSet',
@input_data_1 =N'select 1 as hello'
with result sets (([hello] int not null));
go
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我看到以下错误:
Msg 39023, Level 16, State 1, Procedure sp_execute_external_script, Line 1 [Batch Start Line 3]
'sp_execute_external_script' is disabled on this instance of SQL Server. Use …Run Code Online (Sandbox Code Playgroud) 我有一个数据库 (DB1),它同步到另一台服务器上的 (DB2)(通过 AlwaysOn - SQL Server 2014)。
我想授予用户对 DB2 的读取权限。我在 DB1 中创建了一个 SQL 登录名和数据库用户。新的数据库用户迁移到 DB2,但 SQL 登录名没有迁移(这是有道理的)。
问题是,当我尝试在 DB2 上为用户创建 SQL 登录并授予用户对 DB2 的读取权限(绑定到来自 DB1 的用户帐户)时,我收到一条错误消息,指出 DB2 是只读的且无法修改。
那么,我怎样才能做到这一点?
据我了解,使用 Read Committed Snapshot,读者不会阻止作者,而作者不会阻止读者。唯一可能发生的阻塞是编写器阻塞编写器。默认情况下,我们的数据库设置为 Read Committed Snapshot。但是,我们有很多用户使用 WITH (NOLOCK) 发出查询(出于不良习惯)。如果我理解正确,使用 WITH (NOLOCK) 的查询会更改隔离级别。当在查询中使用它时,读取器现在是否可以阻止尝试更新正在读取的数据的进程?