我想在我的生产数据库之一上运行与此非常相似的查询:
-- Setup the table (Already there in my real scenario)
create table dbo.MyTable(MyValue int, MyGroup varchar(5))
insert into dbo.MyTable values
(56,'I'), (12,'I'), (56, 'II'), (12, 'II'), (56, 'III'), (56, 'IV'), (56, 'V'), (12, 'V')
-- Create a function to cross apply with (I can't make this in my production env)
create function dbo.GetOrderGroup(@groupName varchar(15))
returns @ReturnTable table(GroupValue varchar(8000), GroupName varchar(15))
as
begin
DECLARE @groupValue VARCHAR(8000)
SELECT @groupValue = COALESCE(@groupValue + ', '
+ cast(MyValue as VARCHAR(10)), cast(MyValue as VARCHAR(10))) …Run Code Online (Sandbox Code Playgroud) 我在开发服务器上有我的 prod 数据库的副本。我正在使用它来测试部署脚本。
但是当我运行它时,它说日志文件已满。
我查了一下,它是 10 GB(几乎是整个数据库的大小)。
我不需要这个数据库,但需要几个小时(之后它将被删除)。
有没有办法优雅地摆脱日志文件?(直接删除它似乎是错误的。)
注意:
我已经运行了这个:
select log_reuse_wait, log_reuse_wait_desc, name
from sys.databases
where name = 'ProdCopyDatabase'
Run Code Online (Sandbox Code Playgroud)
结果是:
log_reuse_wait log_reuse_wait_desc name
2 LOG_BACKUP ProdCopyDatabase
Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server sql-server-2008-r2 transaction-log
我是一名软件开发人员,只能读取我们的产品数据库(当然)。
有时,当我的 DBA 不可用时,我们的服务器上会出现性能问题。
是否有任何类型的查询可以运行(仅具有数据读取器权限)可以告诉我有关 SQL Server 当前运行状况的任何信息?
如果有某种边缘权限不允许更改有用的数据或架构,我可能会获得该权限。(例如,我被授予在我们的生产环境中监控复制的权限。)
假设我有一个分区orders.Order表(日期时间列设置为创建行时)。 CreatedWhenGetDate()
该表有超过 1000 万行,分区是每季度一次(或一些这样的固定时间间隔)。
如果我运行如下查询:
SELECT ord.OrderId, ord.ClientId, ord.ReceptId, ord.Cost, agt.State
FROM orders.Order ord
join personnel.Agent agt
on ord.AgentId = agt.AgentId
WHERE agt.FirstName = 'Bob'
and LastName = 'Whiely'
and ord.Cost > 135
Run Code Online (Sandbox Code Playgroud)
我会从这个查询的分区中看到任何好处吗?
我看不出有什么好处,因为我没有在查询中使用分区值,并且仍然需要搜索所有表。
注意:查询的结果都会在最近的分区中。但我看不出这会有什么帮助。
第二个注意事项:分区都在同一个 SAN 驱动器上(系统管理员不会让它以任何其他方式存在),因此磁盘 IO 不会并行。
有没有更好的分区方法,以便像上面那样的随机查询性能更好?(也许在主键上?)
第三个注意:上面的查询是组成的。我用它来表明我有许多查询命中了许多随机列(已正确编入索引)。
此页面https://msdn.microsoft.com/en-us/library/ms188276.aspx表示如果您想要嵌套的 XML(即 XML 树),那么您需要像这样设置查询:
SELECT Col1,
Col2,
( SELECT Col3, Col4
FROM T2
WHERE T2.Col = T1.Col
...
FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;
Run Code Online (Sandbox Code Playgroud)
(使用子查询)
这与索引视图的要求完全不一致(不允许子查询)。
有没有办法将这两个功能结合在一起?(有一个带有 XML 树的索引视图?)
我的问题的不足是: 如何在不使用任何子查询或联合的情况下从许多表创建 XML 树(即嵌套的 XML 节点)。(因此它将与 SQL Server 索引视图一起使用。)
仅供参考:不确定是否重要,但我的特定查询有超过 10 个级别的 xml 树(从一堆不同的表中提取)。
鉴于以下代码:
CREATE SEQUENCE dbo.NextTestId AS [bigint]
START WITH 10 INCREMENT BY 2 NO CACHE
GO
DECLARE
@variableNumberOfIdsNeeded INT = 7, -- This will change for each call
@FirstSeqNum SQL_VARIANT , @LastSeqNum sql_variant, @SeqIncr sql_variant;
EXEC sys.sp_sequence_get_range @sequence_name = N'dbo.NextTestId',
@range_size = @variableNumberOfIdsNeeded,
@range_first_value = @FirstSeqNum OUTPUT,
@range_last_value = @LastSeqNum OUTPUT,
@sequence_increment = @SeqIncr OUTPUT;
-- The following statement returns the output values
SELECT @FirstSeqNum AS FirstVal, @LastSeqNum AS LastVal, @SeqIncr AS SeqIncrement;
Run Code Online (Sandbox Code Playgroud)
我得到这样的结果:
FirstVal LastVal SeqIncrement
------- ------- --------------
38 …Run Code Online (Sandbox Code Playgroud) sql-server sequence sql-server-2012 cross-apply number-table
我有一列是 varchar(max)。它主要包含有效的 XML。但有时它有无效的 xml(我仍然需要)。
我试图为这个表创建一个视图,当数据是有效的 XML 时,它允许值显示为 XML(使用 SSMS 附带的漂亮链接功能),但当它是无效的 XML 时仍然显示字符串。
像这样:
SELECT TRY_CAST([RunLog] AS xml) as [Log], -- works
RunLog, -- Also Works
-- This is the one I want, but it tries to parse all of them
-- (even the ones that fail the cast)
Case
When Try_Cast(RunLog as xml) is NULL
Then NettinRunLoggLog else CAST(RunLog AS xml)
end as CombinedLog
FROM LoggingTable
Run Code Online (Sandbox Code Playgroud)
我认为这是一个失败的原因,因为 SQL Server 不允许结果具有多个数据类型。但我想我会问专家以确定。
我有两个示例查询(如下所示)。两者(删除和)都在其中创建一个数据库和一个分区表。该表有几个分区,每个分区都有数据(包括最后一个,无界的,一个)。分区数据从 1 到 3996。
然后每个脚本添加一个新分区。新分区从 4000 开始。
在第一个脚本中,事务日志显示最后一个分区(分区 4)中的每条记录都被删除并重新插入。
第二个脚本显示没有发生行的活动(没有删除和插入)。
在只有两个脚本之间的区别是RANGE LEFTVSRANGE RIGHT的分区函数。 RANGE RIGHT导致不删除或插入,RANGE LEFT导致最后一个分区中的所有行被删除和重新插入。
我想RANGE LEFT或RANGE RIGHT只是控制边界值是否与左侧或右侧分区一致。但它显然也做了其他事情。
是否有更多的RANGE LEFT和RANGE RIGHT我不明白?
另外,我喜欢在不影响系统的情况下添加分区的想法。RANGE RIGHT如果它让我知道,我愿意使用。但是,我担心这可能是某种错误,我不应该依赖它(因为它可能会在以后的版本中“修复”)。
这是一个可以依赖的“功能”吗?
脚本:
Range Left
删除和插入
use master
GO
-- Comment this next line out for the first run
DROP database PartitionTest
go
create database PartitionTest
go
use PartitionTest
go
-- Add Filegroups
ALTER DATABASE [PartitionTest] ADD FILEGROUP …Run Code Online (Sandbox Code Playgroud) 我有一个特殊的情况让我使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. (我sp_getapplock用来确保单个进程访问给定的行。)
我正在尽力避免任何类型的锁定升级。我清楚地知道ISOLATION LEVEL READ UNCOMMITTED读取有什么作用,但我不确定删除。
我看到用做删除一些示例代码ROWLOCK和READPAST,连同ISOLATION LEVEL READ UNCOMMITTED但我是没有什么,会做明确的,所以我也没有一直在使用它了。
这是否需要防止我的删除锁定升级或就ISOLATION LEVEL READ UNCOMMITTED足够了?
sql-server ×9
cross-apply ×2
partitioning ×2
locking ×1
number-table ×1
sequence ×1
t-sql ×1
xml ×1