通用表表达式 (CTE) 和临时表有什么区别?我什么时候应该使用一个?
CTE
WITH cte (Column1, Column2, Column3)
AS
(
SELECT Column1, Column2, Column3
FROM SomeTable
)
SELECT * FROM cte
Run Code Online (Sandbox Code Playgroud)
临时表
SELECT Column1, Column2, Column3
INTO #tmpTable
FROM SomeTable
SELECT * FROM #tmpTable
Run Code Online (Sandbox Code Playgroud) 我被教导不要将名称Id用于我的表的标识列,但最近我一直在使用它,因为它简单、简短并且非常描述数据的实际内容。
我见过有人建议Id使用表名作为前缀,但这似乎让编写 SQL 查询的人(或程序员,如果您使用的是像实体框架这样的 ORM)做更多的工作,尤其是在更长的表名上,例如CustomerProductId或者AgencyGroupAssignementId
我们聘请的一位第三方供应商为我们创建了一些东西,实际上命名了他们所有的身份列,Ident只是为了避免使用Id. 起初我认为他们这样做是因为Id是一个关键字,但是当我查看它时,我发现它Id不是 SQL Server 2005 中的关键字,而我们正在使用它。
那么为什么人们建议不要使用Id标识列的名称呢?
编辑:澄清一下,我不是在问要使用哪种命名约定,也不是在询问使用一种命名约定而不是另一种命名约定的参数。我只想知道为什么建议不要使用Id标识列名称。
我是一名程序员,而不是 dba,对我来说,数据库只是存储数据的地方。由于我通常构建小型应用程序,并且通常使用 ORM 进行数据访问,因此标识字段的通用字段名称更容易使用。我想知道这样做我错过了什么,以及是否有任何真正好的理由让我不这样做。
我们有一个存储过程,用户可以手动运行它来获取全天不断使用的报告的一些更新数字。
我有第二个存储过程应该在第一个存储过程运行后运行,因为它基于从第一个存储过程中获得的数字,但是运行时间更长,并且是一个单独的进程,所以我不想在第二个存储过程运行时让用户等待。
有没有办法让一个存储过程启动第二个存储过程,并立即返回而不等待结果?
我正在使用 SQL Server 2005。
我目前使用以下方法从 UTC 日期时间获取本地日期时间:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果夏令时发生在GetUTCDate()和之间@utcDateTime,@localDateTime最终会休息一个小时。
是否有一种简单的方法可以将非当前日期的日期从 UTC 转换为当地时间?
我使用的是 SQL Server 2005
如果您在视图内部或外部过滤视图会有所不同吗?
例如,这两个查询之间有什么区别吗?
SELECT Id
FROM MyTable
WHERE SomeColumn = 1
Run Code Online (Sandbox Code Playgroud)
或者
SELECT Id
FROM MyView
WHERE SomeColumn = 1
Run Code Online (Sandbox Code Playgroud)
并且MyView定义为
SELECT Id, SomeColumn
FROM MyTable
Run Code Online (Sandbox Code Playgroud)
如果源表位于链接服务器上,答案有什么不同吗?
我问是因为我必须从链接服务器两次查询一个大表(4400 万行),并获得结果的汇总。我想知道是否应该创建两个视图来访问数据,每个查询一个视图,或者我是否可以使用单个视图和一个WHERE子句。
performance sql-server-2005 sql-server view query-performance
我想从 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) 我们收到了有关查询运行缓慢或在清晨超时的报告,我看到的唯一一项我认为可能会影响它的作业是我们的数据库备份作业。
数据库本身大约有 300GB,备份工作从凌晨 4:30 开始,直到早上 7:00 之后才完成。我们备份作业的当前语法是:
BACKUP DATABASE [DatabaseName]
TO DISK = N'E:\Database Backups\DatabaseName.Bak'
WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak',
NOSKIP, STATS = 10, NOFORMAT
Run Code Online (Sandbox Code Playgroud)
E:\ 是服务器上的一个分区,其中包含数据库和数据库备份。
还应该注意的是,这是一个虚拟服务器,而不是专用的独立服务器。在我们切换到虚拟服务器后,我们开始收到关于备份过程中速度变慢的抱怨,所以我认为这可能是相关的。
有没有办法运行此备份作业,使其在运行时不影响查询性能?
我们使用的是 SQL Server 2005
我们有以下设置:
目前网站登录web数据库,web数据库连接中间数据库,在生产数据库上拉取数据或执行存储过程。所有数据库都在同一个SQL实例上,整个过程使用同一个用户账号。
用户账户对web数据库和中间数据库有完全访问权限,但只能访问私有数据库的特定视图和存储过程
这真的比让公共数据库直接连接到私有数据库更安全吗?
中间数据库似乎只是为了使事情复杂化,因为使用相同的登录名访问所有数据库中的数据,并且它已经仅限于私有数据库中所需的视图/SP。我希望删除它。
我被要求创建一些东西来跟踪每天收取的帐户成本,我正在尝试找出一个支持这一点的数据库表模式。
这是我所知道的
我的第一个想法是标准化数据库:
帐户ID 日期 成本类型 ID 数量
我的问题是,做数学。这张桌子很快就会变大。假设所有 13 种成本类型都应用于当月的所有工作帐户,即每月200k * 13 * N days in month大约 75-8000 万条记录,或接近每年 10 亿条记录。
我的第二个想法是对其进行非规范化
帐户ID 日期 总消耗 成本类型 1 成本类型2 成本类型 3 成本类型 4 成本类型5 成本类型 6 成本类型7 成本类型8 成本类型9 成本类型10 成本类型11 成本类型12 成本类型13
这种方法更加非规范化,每月最多可创建 600 万条记录 ( 200k * N days in month),或每年约 7200万条。它比第一种方法少很多,但是如果公司将来决定使用新的成本类型,则需要添加另一个数据库列。
在这两种方法中,您更喜欢哪种方法?为什么?您是否可以想到另一种替代方法可以更好地处理此问题?
我对报告绩效最感兴趣,包括总结报告和详细报告。将成本分摊到帐户的工作将在无人在场的情况下每晚运行。次要问题是数据库大小。现有的数据库已经接近300GB,我相信磁盘空间在500GB左右。
数据库是 SQL Server 2005
我有一个复杂的查询,它在查询窗口中运行 2 秒,但作为存储过程运行大约 5 分钟。为什么作为存储过程运行需要这么长时间?
这是我的查询的样子。
它需要一组特定的记录(由@id和标识@createdDate)和特定的时间范围(从 开始的 1 年@startDate),并返回发送的信件的汇总列表以及由于这些信件而收到的估计付款。
CREATE PROCEDURE MyStoredProcedure
@id int,
@createdDate varchar(20),
@startDate varchar(20)
AS
SET NOCOUNT ON
-- Get the number of records * .7
-- Only want to return records containing letters that were sent on 70% or more of the records
DECLARE @limit int
SET @limit = IsNull((SELECT Count(*) FROM RecordsTable WITH (NOLOCK) WHERE ForeignKeyId = @id AND Created = @createdDate), 0) * .07
SELECT DateSent …Run Code Online (Sandbox Code Playgroud) performance sql-server-2005 stored-procedures query-performance
sql-server ×7
performance ×4
aggregate ×1
backup ×1
cte ×1
identity ×1
security ×1
timezone ×1
utc-time ×1
view ×1