我有一个包含大量 UDF 的数据库,这些 UDF 由涉及大量数据操作和计算的长时间运行的进程调用。
我使用 UDF 的想法是将信息的逻辑单元从底层表中分离出来。例如,如果我想获取有关汽车的信息,我可能有几个表,例如颜色、型号、年份等,每次获取汽车时我都必须加入这些表。相反,我将使用像 fnCar() 这样的函数来获取数据的非规范化视图。
我在长时间运行的过程中多次调用这些函数,我想知道如果我有一个非规范化的工作表、视图或临时表来进行数据操作和计算是否会更好。一般来说,使用 UDF 在性能方面是否有一些我应该注意的缺点?
例如,我使用 UDF 进行一些计算。然后,我对该数据进行逆透视并将其存储在表中。每当我需要再次使用该数据时,我都会调用 UDF 将数据转回原处。我们这样做的原因是为了保持计算的灵活性。如果我们添加/删除/更改计算,我们不想更改数据模型。
--Calculate some values in a function
declare @location table
(
id int,
lattitude float,
longitude float
)
insert into @location select 1, 40.7, 74
insert into @location select 2, 42, 73
insert into @location select 3, 61, 149
insert into @location select 4, 41, 87
declare @myLattitude float
declare @myLongitude float
set @myLattitude =43
set @myLongitude = 116
declare @distance table
( …Run Code Online (Sandbox Code Playgroud) 我有一个包含 ~35k IDs ( TableC) 的表,一个包含多列 ( TableA) 的ID表,其中包括前面提到的表和第三个空表,具有与第二个表 ( TableB)相同的列。
现在,我需要每个条目从复制TableA到TableB其中ID的TableA是TableC。我想出了这个查询:
SELECT * INTO TableB
FROM TableA
WHERE ID IN
(SELECT ID FROM TableC)
Run Code Online (Sandbox Code Playgroud)
但这会导致错误There is already an object named 'TableB' in the database... 我不允许为此删除和重新创建TableB。
使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2
我怎么能每个条目将复制TableA到TableB其中ID的TableA是TableC?
我最近从 SQL Server 2005 升级到 2012。但是在验证过程中,发现了一个错误。
某个触发器的编码如下:
CREATE TRIGGER [dbo].[trigger] on [dbo].[foo]
FOR UPDATE, UPDATE
AS
UPDATE foobar
SET datetime = GetDate()
FROM bar
WHERE foobar.id = bar.id
GO
Run Code Online (Sandbox Code Playgroud)
我可以在 SQL Server 2005 上安全地执行这个(奇怪的)。
但是,在 SQL Server 2012 上,它会引发(我所期望的)语法错误。
语法错误:触发器声明中操作“UPDATE”的重复规范。
为什么这不会在 SQL Server 2005 上引发语法错误?我在这方面的 google-fu 失败了。
为什么这似乎适用于 SQL Server 2005?
我对 JOIN 操作的语法有点好奇,特别是我们设置条件的 ON 子句。假设我们正在对现有表和我们刚刚创建为 JOIN 中的子查询的表执行连接,例如:
SELECT DISTINCT ssn, job, identifier, startdate, enddate, salary, ceasing
FROM oldcontracts
JOIN (SELECT DISTINCT name, identifier FROM jobs)
ON oldcontracts.job = jobs.name
;
Run Code Online (Sandbox Code Playgroud)
这里的问题是,我们将如何设置一个有效的 ON 条件?我这样说是因为语法具有以下形式:
table1.column <condition> table2.column
Run Code Online (Sandbox Code Playgroud)
显然,SQL 2005 对我们从何处获取这些列非常严格。这意味着我在 jobs.name 上收到一个错误,说它不是一个有效的标识符。我假设 SQL 抛出这个错误是因为作业不是在操作中加入的表。
我知道解决这个问题的方法是简单地将作业设置为 table2 以在 JOIN 中使用,并根据需要调整 SELECT,然后一切都会工作,但我很想知道是否有办法解决一列一个子查询,假设该特定子查询是在 JOIN 操作中用作 table2 的那个?
我已经运行了一个多小时的服务器端配置文件跟踪,以生成一个 .trc 文件,其中包含我的一个数据库中的所有活动。
然后,我将此 .trc 跟踪文件作为参数传递给数据库引擎优化顾问。
运行 DTA 后,我得到了建议:
我正在使用SQL Server 2005,除了单独编写脚本之外,我似乎找不到任何其他方法,这太耗时了。
我有一个像这样的分层数据表:
BookGroupID GroupName ParentGroupID
----------- --------- -------------
0 Primary 0
1 abc 0
2 abd 0
3 abe 0
4 cbc 1
5 ceg 2
6 cjd 3
7 hjd 5
8 bjy 5
9 mfs 4
10 ikl 7
11 hjy 8
12 mnf 5
13 aws 10
14 qws 11
15 aqe 13
Run Code Online (Sandbox Code Playgroud)
我想在层次结构中选择一个特定的 BookGroupID 及其所有直接和间接子级。例如,对于 2 的 BookGroupID,输出应如下所示:
BookGroupID
-----------
2
5
7
8
10
11
12
13
14
15
Run Code Online (Sandbox Code Playgroud)
解释一下,第 5 行在输出中,因为它是第 2 行的直接孩子,第 7、8 和 …
在 SQL Server 2005 和 2008 R2 中,我调用了一个存储过程,该存储过程的 out 参数定义为varbinary(max). 根据 .out 参数返回 10020 字节DATALENGTH。
但是,如果我尝试定义大于 8000 字节的 varbinary,例如 varbinary(10000),则 SQL Server 会出错。例如
The size (10000) given to the type 'varbinary' exceeds the maximum allowed for any data type (8000).
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?SQL Server 如何返回超过数据类型允许的字节数?SQL Server 是否在幕后使用其他一些数据类型来保存 > 8000 字节?
我们有一个应用程序,它使用 MSSync 将数据从服务器下载到客户端的 SQL Server Express 2005。客户端具有双核和超线程,因此总共有 4 个核。
我对 SQL Server Express 的局限性进行了大量研究,我认为它归结为 1 个物理套接字,但在该套接字中最多使用 4 个内核。但是,这提出了一些与我在实践中所感知到的形成对比的问题。
我们的同步过程将 1 个内核最大化,淹没了同步过程,导致性能比具有更高 GHz 且未最大化 SQL Server Express 2005 使用的单个内核的设备慢 10-20 倍。
但是:如果允许 SQL Server 在 1 个套接字中使用 4 个内核,为什么它只使用 1 个用于我们的同步过程?这是因为 1 个连接有一个专用核心吗?还是我没有正确理解限制规格?将 SQL Server Express 升级到现代版本是否有助于让它使用更多内核?
我做了更多的研究。我使用了 SQL Server Express 2012 甚至 SQL Server Developer 2012 并且 ALL 最多只有 1 个核心。因此,显然,这与 Express 限制无关。
这可能是一个技术限制,您在单个连接/事务中的查询仅停留在单个核心上。很可能,这是保证事务一致性的逻辑要求。
我在 SQL Server 2012 中看到的是,负载会时不时地交换到另一个核心,但它永远不会同时使用超过 1 个核心。甚至没有开发版。
如果有人能证实这些假设,那将是受欢迎的。
sql-server-2005 sql-server sql-server-2012 sql-server-express limits
我知道这里面有很多变量,我不是在寻找精确的分钟数:秒 :) 我已经阅读了许多资源,这些资源声明 aTRUNCATE使用的资源比 a 少得多DELETE,因此执行速度更快。但是没有提到数量级。由于 aTRUNCATE是 DDL(数据定义语言)操作而不是 DML(数据操作语言)操作,并且只有系统表是事务的一部分,因此我认为它不会花费很长时间。
任何有经验的人都可以使用接近这种大小的桌子来做这件事,可以提供一些见解吗?我们最多谈一分钟,最多一个小时,几天,几周?
我正在尝试导入、导出 SSIS 包。我知道他们在那里。当我查询 msdb.dbo.sysdtspackages90 时,我得到 22 个包。但是当我连接到服务器上的 Integration Services 时,存储的包文件夹是空的。到底是怎么回事?
我已经检查了 MsDtsSrvr.ini.xml。它使用标准的默认设置进行设置。
sql-server-2005 ×10
sql-server ×7
copy ×1
functions ×1
index ×1
join ×1
limits ×1
optimization ×1
recursive ×1
select ×1
ssis ×1
statistics ×1
syntax ×1
trigger ×1
truncate ×1
varbinary ×1