昨天我们在我的项目中看到了一些生产问题。当许多用户访问 SQL Server 中的报告时,它超时并且 CPU 上升到 100%。当我们检查后端时,大约有 60 个会话处于打开状态。我们刚刚决定删除并创建存储过程。我们删除并重新创建了存储过程,CPU 变为 40%,问题已解决。
你能告诉我可能是什么原因吗?今天在不同的存储过程中发生了这种情况,但我们立即删除并重新创建了存储过程以解决该问题。
我正在尝试创建巨型脚本,通过添加/删除/修改现有数据库的列来更新一堆表。困扰我的一个问题是,每当我在一个语句的表中添加新列并尝试在另一条语句中引用它时,它都会失败并显示关于无效列 xxx 的错误。
以下是我用来重现此问题的伪代码,
--CREATE TABLE testTable (u_id int, u_name varchar(10))
--INSERT INTO testTable VALUES (1,'11')
--INSERT INTO testTable VALUES (2,'12')
--INSERT INTO testTable VALUES (3,'13')
--INSERT INTO testTable VALUES (4,'14')
--INSERT INTO testTable VALUES (5,'15')
BEGIN
ALTER table testTable ADD u_add varchar(10)
END
BEGIN
CREATE TABLE tmp_xx_xx_testTable (u_id int, u_name varchar(10), u_add varchar(10))
INSERT INTO dbo.tmp_xx_xx_testTable VALUES (6,'16','DDD' )
INSERT INTO tmp_xx_xx_testTable (u_id,u_name,u_add)
SELECT u_id,u_name,u_add FROM TestTable
drop TABLE TestTable
EXECUTE sp_rename
N'[dbo].[tmp_xx_xx_testTable]',
N'TestTable';
END
--SELECT * …Run Code Online (Sandbox Code Playgroud) 我正面临奇怪的行为。
以下是重现方法:在具有多个数据库的实例(在我的情况下为 SQL Server 2016)中,创建该存储过程(master在我的情况下):
create procedure dbo.Strange WITH EXECUTE AS owner
as
begin
exec sp_MSforeachdb 'select''?''';
end;
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令调用该存储过程:
Exec master.dbo.Strange
Run Code Online (Sandbox Code Playgroud)
正如您将看到的,它只会返回某些数据库的数据,而不是全部(在我的例子中是 11 个中的 3 个)。
怎么了?
运行以下查询:
SELECT
SERVERPROPERTY('productversion') AS version,
SERVERPROPERTY('ProductMajorVersion') AS major,
SERVERPROPERTY('ProductMinorVersion') AS minor;
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
version major minor
------------ ------- -------
10.0.2531.0 NULL NULL
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我正在开发一种软件解决方案,需要将源自许多 PLC(可编程逻辑控制器,用于控制传送带和机器人等工业机器)的原始数据点存储到 SQL Server 数据库中。我主要关心的是如何正确存储大量原始数字数据。
每个数据点具有以下属性:
我从中收集数据的每个 PLC 可能有多达 500 个数据点,我想计划支持数千个 PLC。这意味着,我每年至少有 15,768,000,000,000 个数据点(每年 31,536,000 个点 * 500 个点 * 1000 个 plcs)。我目前为每种数据类型(bool、int、float、string)都有一个表。为了减少记录和存储的数量,我为每条记录存储了 4 个数据点 [ID、DateTime、DataGroupID、Value1、Value2、Value3、Value4]。
我实现了这个,它运行良好(使用我最大的表进行约 7200 万条记录的快速查询),尽管它不是很灵活(更改数据类型需要在表之间移动数据,重新分组数据需要表/列更改,等等。)
因此,我想提高灵活性的想法是保留数据类型特定的表,而只是将每个数据点存储为自己的记录。bigint 的最大大小(记录 ID 的数据类型)的一些简短数学表明我有很多可用的 ID。尽管存储要求和查询性能仍然是一个问题。我应该担心使用这种方法的任何事情吗?有更好的选择吗?
我担心的根源是我根本没有体验过巨大的数据库/表,所以虽然我知道几百万条记录很小,但我仍然不知道一个过顶的表会是什么样子。此外,数据的存储是我的软件的基础,因此更新需要大量工作才能实现。
我有一些 SQL 脚本,希望每天在我的 SQL Server 上运行。如何多次查询并获得类似于以下内容的输出:
Health check for <server>
Query Title 1:
<query results 1>
Query Title 2:
<query results 2>
Run Code Online (Sandbox Code Playgroud)
我正在检查诸如上次良好备份、正常运行时间等内容,因此它们彼此不相关。我计划在 SQL Server 作业中使用 sp_send_db_mail。这是完成这项任务的最佳方式吗?
理想情况下,我只想要一封电子邮件。
更新
经过多年的战斗!!!到目前为止,我找到的解决方案是将其放入存储过程,然后像这样执行存储过程:
EXEC msdb.dbo.sp_send_dbmail
@recipients = N'<email>',
@body = @body,
@subject = @subjectt,
@profile_name = @ProfileName,
@query ='exec test..sp_checks'
Run Code Online (Sandbox Code Playgroud)
这可以用于多个选择语句吗?
我正在尝试复制 SQL Server 2008 在生成全文索引时所做的事情,但我很难找到 SQL Server 2008 认为是断字的字符列表。
是否有一个列表指定 SQL Server 2008 将在英文全文索引的哪些字符上断词?
我正在运行一些性能测试,我从 900.000 条记录的数据集开始,更新需要 10 秒或每秒大约 90000 条记录。然后我将记录数增加到 9.000.000,更新耗时 170 秒或每秒更新约 52941 条记录。
为什么当记录总数增加时每秒更新的记录数会下降?
数据中的分布是一样的,较大的集合是复制10次的较小的集合。自从我复制了 10 次数据以来,数据和日志文件的大小确实增加了。在那之后我确实缩小了日志文件。此时数据库服务器上没有其他工作负载。
执行更新的存储过程如下:
CREATE PROCEDURE updatePoints
@ids NVARCHAR(MAX)
AS
DECLARE @points1 INT
DECLARE @points2 INT
SET @points1 = 1
SET @points2 = 2
UPDATE p
SET points = (0 + CASE WHEN p.[x] = m.[x] AND p.[y] = m.[y]
THEN @points1
ELSE 0
END +
CASE WHEN p.[u] = m.[u] AND p.[v] = m.[v]
THEN @points2
ELSE 0
END)
FROM p
JOIN m ON m.id = …Run Code Online (Sandbox Code Playgroud) 我varchar在数据库表中有数据,它以DD-MM-YYYY格式存储日期。
我想varchar在MM-DD-YYYY格式中选择它。
我正在使用
select convert (varchar(30), (select CONVERT(datetime, '16-11-2011', 103)), 101)
Run Code Online (Sandbox Code Playgroud)
它给 11/16/2011
对此可以进行任何简单的查询吗?
我已经移动了我的 SQL Server 的域,虽然一切主要都在工作,但查询的日期格式似乎已经改变。
所以如果我运行这个:
select convert(datetime,'2012-02-13')
Run Code Online (Sandbox Code Playgroud)
我得到
消息 242,级别 16,状态 3,第 1 行
varchar 数据类型到 datetime 数据类型的转换导致值超出范围。
当我跑
select @@Language, @@Langid
Run Code Online (Sandbox Code Playgroud)
我得到
英国 | 23
我试图设置 sp_defaultlanguage 但这似乎没有区别。
我还检查了控制面板中的区域设置,似乎也设置为英国。
甚至此代码示例也会导致问题:
set language british
select convert(datetime, '2012-02-13')
Run Code Online (Sandbox Code Playgroud)
结果
将语言设置更改为英国。消息 242,级别 16,状态 3,第 3 行 varchar 数据类型到 datetime 数据类型的转换导致值超出范围。