小编Vac*_*ano的帖子

没有函数的交叉应用

我想在我的生产数据库之一上运行与此非常相似的查询:

-- 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)

sql-server-2008 sql-server cross-apply

3
推荐指数
1
解决办法
998
查看次数

收缩“丢弃”数据库的大型日志文件

我在开发服务器上有我的 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

3
推荐指数
1
解决办法
221
查看次数

具有读取权限的用户的性能/健康检查查询

我是一名软件开发人员,只能读取我们的产品数据库(当然)。

有时,当我的 DBA 不可用时,我们的服务器上会出现性能问题。

是否有任何类型的查询可以运行(仅具有数据读取器权限)可以告诉我有关 SQL Server 当前运行状况的任何信息?

如果有某种边缘权限不允许更改有用的数据或架构,我可能会获得该权限。(例如,我被授予在我们的生产环境中监控复制的权限。)

sql-server sql-server-2012

3
推荐指数
1
解决办法
3310
查看次数

如果您不查询分区值,分区是否有帮助?

假设我有一个分区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 不会并行。

有没有更好的分区方法,以便像上面那样的随机查询性能更好?(也许在主键上?)

第三个注意:上面的查询是组成的。我用它来表明我有许多查询命中了许多随机列(已正确编入索引)。

sql-server partitioning sql-server-2012

3
推荐指数
1
解决办法
235
查看次数

在 Sql Server 索引(物化)视图中创建嵌套 XML

此页面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 树(从一堆不同的表中提取)。

xml sql-server materialized-view sql-server-2012

3
推荐指数
1
解决办法
924
查看次数

插入来自对 sp_sequence_get_range 的调用的数字范围

鉴于以下代码:

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

3
推荐指数
1
解决办法
1445
查看次数

我可以使用 Try_Cast 为我提供具有不同数据类型的查询结果列吗?

我有一列是 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 不允许结果具有多个数据类型。但我想我会问专家以确定。

sql-server t-sql sql-server-2012

2
推荐指数
1
解决办法
705
查看次数

为什么分区范围右跳过删除/插入?

我有两个示例查询(如下所示)。两者(删除和)都在其中创建一个数据库和一个分区表。该表有几个分区,每个分区都有数据(包括最后一个,无界的,一个)。分区数据从 1 到 3996。

然后每个脚本添加一个新分区。新分区从 4000 开始。

在第一个脚本中,事务日志显示最后一个分区(分区 4)中的每条记录都被删除并重新插入。

第二个脚本显示没有发生行的活动(没有删除和插入)。

只有两个脚本之间的区别是RANGE LEFTVSRANGE RIGHT的分区函数。 RANGE RIGHT导致不删除或插入,RANGE LEFT导致最后一个分区中的所有行被删除和重新插入。

我想RANGE LEFTRANGE RIGHT只是控制边界值是否与左侧或右侧分区一致。但它显然也做了其他事情。

是否有更多的RANGE LEFTRANGE 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)

sql-server partitioning sql-server-2012

2
推荐指数
2
解决办法
891
查看次数

ISOLATION LEVEL READ UNCOMMITTED 会影响删除吗?

我有一个特殊的情况让我使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. (我sp_getapplock用来确保单个进程访问给定的行。)

我正在尽力避免任何类型的锁定升级。我清楚地知道ISOLATION LEVEL READ UNCOMMITTED读取有什么作用,但我不确定删除。

我看到用做删除一些示例代码ROWLOCKREADPAST,连同ISOLATION LEVEL READ UNCOMMITTED但我是没有什么,会做明确的,所以我也没有一直在使用它了。

这是否需要防止我的删除锁定升级或就ISOLATION LEVEL READ UNCOMMITTED足够了?

注意:
如果有兴趣,这里这里是这个问题的相关 sprocs。

sql-server locking isolation-level sql-server-2016

0
推荐指数
1
解决办法
483
查看次数