我的老板昨天收到一个客户的询问,询问他们如何找出谁删除了他们 SQL Server 数据库中的某些数据(如果重要的话,它是快速版)。
我认为这可以从事务日志中找到(前提是它没有被截断) - 这是正确的吗?如果是这样,您实际上如何查找这些信息?
我有一个字段来存储一些数据,该字段声明为varchar(max). 据我所知,这应该是存储2^31 - 1字符,但是当我输入超过 8000 个字符的内容时,它会切断其余部分。
我已经验证所有数据都包含在我的更新语句中,并且查询在其他地方看起来都很好,但是当我选择数据时,它已被切断。
当我在我的网站上显示数据以及使用 SSMS 到select content from table.
select DATALENGTH (content) from table 返回 8000。
我使用这个设置数据:update table set content = 'my long content' where id = 1。内容确实有很多 HTML,但我看不出这会导致问题。我唯一能看到的是我正在做的事情是替换所有内容",''因为这是用户输入的内容(不记得我现在为什么这样做了)。
我确实通过删除内容中的所有单引号设法使内容正确输入,所以我认为我的数据而不是数据库发生了一些奇怪的事情。
我应该对查询做一些特别的事情来使用一个varchar(max)字段吗?
使用:SQL Server 2008 (10.50) 64 位。
我想从 6 列中获取最小值。
到目前为止,我已经找到了三种方法来实现这一点,但我担心这些方法的性能,并想知道哪种方法对性能更好。
第一种方法是使用大 case 语句。这是一个包含 3 列的示例,基于上面链接中的示例。我的案例陈述会更长,因为我将查看 6 列。
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
Run Code Online (Sandbox Code Playgroud)
第二种选择是将UNION运算符与多个选择语句一起使用。我会把它放在一个接受 Id 参数的 UDF 中。
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
Run Code Online (Sandbox Code Playgroud)
和
select min(col)
from
(
select col1 [col] from MyTable where Id = @id
union all
select col2 from MyTable where Id = @id
union all
select col3 …Run Code Online (Sandbox Code Playgroud) 我知道存储过程通过执行路径更有效(比应用程序中的内联 sql)。然而,当被按下时,我对原因不是很了解。
我想知道对此的技术推理(以稍后我可以向某人解释的方式)。
谁能帮我制定一个好的答案?
我有一个数据库,我将文件加载到临时表中,从这个临时表我有 1-2 个连接来解析一些外键,然后将这些行插入到最终表中(每个月有一个分区)。我有大约 34 亿行数据,用于三个月的数据。
将这些行暂存到最终表中的最快方法是什么?SSIS 数据流任务(使用视图作为源并具有快速加载活动)或插入 INTO SELECT .... 命令?我尝试了数据流任务,可以在大约 5 小时内获得大约 10 亿行(服务器上有 8 个内核/192 GB RAM),这对我来说感觉很慢。
performance sql-server insert sql-server-2012 query-performance
任何人都可以帮我找到下面给出的长时间运行查询的详细信息。ProcessID、进程名称、数据库、主机、用户、进程登录时间、查询开始时间和查询持续时间。
我正在寻找提供此数据的查询或 SP。
我们有一个具有相当大记录数(10-2000 万行)的数据仓库,并且经常运行查询来计算特定日期之间的记录数,或者计算具有特定标志的记录数,例如
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
Run Code Online (Sandbox Code Playgroud)
性能并不差,但可能相对缓慢(在冷缓存上可能 10 秒)。
最近我发现我可以GROUP BY在索引视图中使用,因此尝试了类似于以下内容
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
Run Code Online (Sandbox Code Playgroud)
因此,我的第一个查询的性能现在 < 100 毫秒,结果视图和索引 < 100k(尽管我们的行数很大,但日期和标志 ID 的范围意味着此视图仅包含 1000-2000 行)。
我认为这可能会降低对 Widget 表的写入性能,但没有 - 据我所知,向该表中插入和更新的性能几乎不受影响(另外,作为数据仓库,该表很少更新反正)
对我来说,这似乎好得令人难以置信——是吗?以这种方式使用索引视图时需要注意什么?
performance index sql-server materialized-view query-performance
有没有办法找到两个 SQL Server 数据库(仅限架构)中的差异。一个是本地的,第二个是在客户的站点。我们遇到运行一些报告的水晶报表和一些未执行的代码的问题,看起来模式不匹配。
我可以在两个数据库上运行相同的命令并比较结果以判断差异在哪里吗?
由于我们的数据库变得太大,我们目前遇到了一些性能问题。有过去 10 年存储的数据,我看不出为什么必须将 2 年以上的数据与新数据存储在相同的表中。
现在,由于我在管理数据库方面没有非常丰富的经验,我正在寻找存档旧数据的最佳方法。
数据库中总共有大约 310'000'000 条记录。
数据库需要 250 GB 的硬盘空间。
我想过两种可能:
创建类似于生产服务器上的数据库,并将所有旧数据插入新数据库中。
使用与生产数据库中相同的表创建新模式 fe [hist]。将所有旧数据插入新模式中的这些新表中。
提前致谢
补充问题:
新创建的存档表是否也需要主键/外键?
或者他们应该只有列但没有键/约束?
计算列的值何时确定?
我猜这是一个新手问题,因为我在搜索中没有找到任何东西。
sql-server ×10
performance ×4
aggregate ×1
audit ×1
delete ×1
index ×1
insert ×1
migration ×1
schema ×1
transaction ×1
varchar ×1