我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。
BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建。
由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。
我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。
可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。
我有几个大桌子。我想通过每周维护计划确保他们的统计数据是最新的。
但是,这样做需要花费太多时间。
如果我指定
WITH SAMPLE 50 PERCENT
Run Code Online (Sandbox Code Playgroud)
SQL Server 然后采样:
BOL对此并不明确。
我正在考虑一种情况,我有两个高密度的列,但这些列不是独立的。
这是我为测试目的而创建的表的定义。
CREATE TABLE [dbo].[StatsTest](
[col1] [int] NOT NULL, --can take values 1 and 2 only
[col2] [int] NOT NULL, --can take integer values from 1 to 4 only
[col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different
[col4] AS ((10)*[col1]+[col2]) --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
实验数据如下
col1 col2 col3 col4
1 …Run Code Online (Sandbox Code Playgroud) 当我们试图弄清楚 Microsoft SQL Server 2012 Internals (2013, 0735658560) 封面上的红色东西是什么时,生产性工作已经停止。我们认为它是某种外科手术或电动工具?

想法?
我有一张如下表
CREATE TABLE dbo.DemoTable
(
Value VARCHAR(12)
)
Run Code Online (Sandbox Code Playgroud)
我想限制它只包含Value匹配以下模式的行
[axyto0-9\s]{0,2}[\s0-9]{0,10}
如何在 SQL Server 中执行此操作?(受 SO 上这个问题的启发)
我怀疑这是一个问题,因为我们达到了 SQL Server 的 50 个实例的最大限制。在极限情况下,它自然不会安装更多实例。但是,它似乎也不会卸载它们。那更糟。
在为实例选择 SQL 引擎后点击下一步时,它会挂在“选择功能”对话框中。
我没有找到很多关于这方面的信息。最有趣的是:http : //social.msdn.microsoft.com/Forums/sqlserver/en-US/24a1e5f3-25f3-48c8-973a-4c6a18578e42/trying-to-uninstall-1-of-50-sql -server-2008-r2-express-hangs-on-please-wait
它还建议使用setup.exe一些参数来卸载实例,但如果不启动 GUI 并进入失败的正常卸载,我就无法这样做。
海拔没有任何作用。重新启动没有帮助。日志只说“被用户取消”,因为我最终必须杀死它。在那之前没有什么明显的。验证都是绿色的。
安装程序说它是 SQL Server 2012 SP1 - 所有实例都在 11.0.2100。
我选择回答/关闭我自己的问题,因为 Microsoft 已关闭状态为“无法修复”的故障单。
希望他们已经为 SQL Server 2014 解决了这个问题,但我没有也不打算自己测试,他们也没有提供关于关闭票证的任何其他评论。
此连接项中的示例代码
显示一个错误
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
Run Code Online (Sandbox Code Playgroud)
返回正确的结果。但以下返回不正确的结果(2014 年使用新的 Cardinality Estimator)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
Run Code Online (Sandbox Code Playgroud)
因为它错误地将 L2 的结果加载到公共子表达式假脱机中,然后重播 L1 结果的结果。
我很好奇为什么两个查询之间的行为不同。Trace Flag 8675 显示工作的进入search(0) - transaction processing,失败的进入search(1) - quick plan。
所以我假设额外转换规则的可用性是行为差异背后的原因(例如,禁用 BuildGbApply 或GenGbApplySimple似乎可以修复它)。
但是为什么对于这些非常相似的查询的两个计划会遇到不同的优化阶段?从我读过的内容来看search (0),至少需要三个表,而第一个示例中肯定不满足该条件。
我注意到在日常数据仓库构建中运行时间相对较长(20 分钟以上)的自动更新统计操作。涉及的表是
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
Run Code Online (Sandbox Code Playgroud)
它在 Microsoft SQL Server 2012 (SP1) - 11.0.3513.0 (X64) 上运行,因此可写列存储索引不可用。
该表包含两个不同市场键的数据。构建将特定 MarketKey 的分区切换到临时表,禁用列存储索引,执行必要的写入,重建列存储,然后将其切换回。
更新统计信息的执行计划显示它从表中取出所有行,对它们进行排序,得到严重错误的估计行数并溢出到tempdb溢出级别 2。
跑步
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER …Run Code Online (Sandbox Code Playgroud) 想象以下场景
CREATE DATABASE test
GO
USE test;
CREATE TABLE dbo.Customer
(
CustomerId INT,
Email VARCHAR(100),
SensitiveData VARCHAR(20)
);
INSERT INTO dbo.Customer
VALUES (1,'abc@foo.com','12346789');
Run Code Online (Sandbox Code Playgroud)
在某些时候,编写了一个 ETL 过程,在test数据库中执行一些活动。
CREATE USER etlUser WITHOUT LOGIN; /*For demo purposes*/
CREATE TABLE dbo.StagingTable
(
StagingTableId INT,
SomeData VARCHAR(100),
)
GRANT UPDATE,INSERT,DELETE,SELECT,ALTER ON dbo.StagingTable TO etlUser;
DENY SELECT ON dbo.Customer TO etlUser;
DENY SELECT ON dbo.Customer (SensitiveData) TO etlUser; /*For good measure*/
Run Code Online (Sandbox Code Playgroud)
etlUser 不应该对Customer表(当然也不是对SensitiveData列)具有权限,因此上面明确拒绝了这些权限。
ETL 过程会截断,dbo.StagingTable因此被授予ALTER表权限。
这在安全审计期间被标记。这个场景有多危险?
最近的一个项目要求报告资源何时被完全消耗。除了用尽日历日期,我还被要求以类似英语的格式显示剩余时间,比如“1 年零 3 个月”。
内置DATEDIFF函数
返回在指定开始日期和结束日期之间跨越的指定日期部分边界的计数 ...。
如果按原样使用,可能会产生误导或混淆的结果。例如,使用 YEAR 间隔将显示 1999-12-31 (YYYY-MM-DD) 和 2000-01-01 相隔一年,而常识会说这些日期仅相隔 1 天。相反,使用 DAY 1999-12-31 和 2010-12-31 间隔 4,018 天,而大多数人会认为“11 年”是更好的描述。
从天数开始计算月和年,很容易出现闰年和月份大小的错误。
我想知道如何在各种 SQL 方言中实现这一点?示例输出包括:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', …Run Code Online (Sandbox Code Playgroud) sql-server ×9
statistics ×3
bcp ×1
date-format ×1
optimization ×1
performance ×1
permissions ×1