小编Joh*_*ner的帖子

临时表聚集键没有得到尊重:错误还是预期的功能?

当我将一些测试数据集放在一起时,我注意到临时表的一些有趣行为。在处理通过并行执行计划填充的集群临时表中的大量数据时,选择数据时集群键看起来不受欢迎。这个问题似乎也影响了我测试过的所有版本的 SQL Server(包括 vNext)。

这是测试的dbfiddle.uk示例。您可能需要执行几次才能得到我找到的结果,但执行一次或两次才能产生相同的结果。此外,这是我在我的环境中得到的本地执行计划,它表明大数据集和小数据集之间的唯一区别是数据输入表的方式(例如并行与串行计划)。

如果你想在家玩,这是我正在运行的测试:

-- Large Data Set
CREATE TABLE #tmp
(
    ID  INT PRIMARY KEY CLUSTERED
)

INSERT INTO #tmp
-- Purposely insert in reverse order
SELECT TOP 100 PERCENT RN
FROM
(
    SELECT TOP (10000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
    FROM master..spt_values t1
    CROSS JOIN master..spt_values t2
) x
ORDER BY RN DESC


-- Smaller Data Set
CREATE TABLE #tmp2
(
    ID  INT PRIMARY KEY CLUSTERED
)

INSERT INTO #tmp2 …
Run Code Online (Sandbox Code Playgroud)

sql-server temporary-tables

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

间隙和岛屿 - 寻找最近的岛屿

我正在处理以下场景,其中我的时间数据属于island 和 gaps。每隔一段时间,我需要根据事件发生的时间将落入现有间隙内的事件与其最近的岛屿相关联。

为了演示,假设我有以下定义我的时间段的数据:

在此处输入图片说明

这个数据是除了哪个ID之间存在间隙连续的27,对于所述时间段2017-07-26 00:03:00通过2017-07-26 00:07:00

为了确定最近的岛屿,我目前将差距分为两个时期,如下所示:

在此处输入图片说明

如果我有一个属于这个差距的事件,GapWindowStart/End时间将决定我需要将事件与哪个岛相关联。因此,例如,如果我有一个发生在 的事件2017-07-26 00:03:20,我会将该事件与 ID 相关联,2相反,如果我有一个事件发生在 ,2017-07-26 00:05:35我会将该事件与 ID 相关联7

最有效的方法,我已经能够编写我的方法,迄今为止,是组装使用的空白伊茨克奔甘的从SQL Server MVP深海潜水书第3解决方案通过ROW_NUMBER窗口函数,然后每一个分裂的差距CROSS APPLY作用的语句就像一个简单的UNPIVOT操作。

这是我用来组装最近的岛屿集的方法的db<>fiddle计划。

确定最近的岛屿后,我使用事件的事件时间来确定与所述事件相关联的最近岛屿。因为这些岛屿全天都在变化,所以我无法制作静态主表,而是必须在遇到事件时在运行时构建所有内容。

这是一个db<>fiddle 计划,显示应该针对随机事件时间使用什么 NearestIsland 值。

对于通常会落入间隙的给定事件,是否有更好的方法来找出最近的岛屿?例如,是否有更有效的方法来识别间隙或更有效的方法来识别最近的岛屿?我什至以最好的逻辑方式来解决这个问题吗?这个问题没有什么重要的,但我总是试图弄清楚是否有一种“更好”的方法来解决问题,我认为这个问题有助于一些创造力,所以我很想看到其他高性能的选择。

我目前使用的环境是 SQL 2012,但我们很快就会迁移到 SQL 2016 环境,所以我几乎可以接受任何东西。

第二个 db<>fiddle 链接的代码如下:

-- Creation of Test Data
CREATE TABLE #tmp
( …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 gaps-and-islands sql-server-2016

5
推荐指数
1
解决办法
818
查看次数

如何识别哪些 SSIS 包使用给定的环境变量?

我怀疑我今天的 Google 技能不够,但我正在寻找一个快速的 TSQL 脚本,该脚本将识别包存储中使用给定环境变量名称的所有 SSIS 包。

例如,当我配置一个包并查看 Paramaters 页面时,我可以选择一个给定的环境变量。在以下屏幕截图中,我关注的环境变量名为SMTP。我想找到所有使用这个环境变量的包,这样我就可以在进行任何大规模更改之前进行一些调查/测试。

在此处输入图片说明

如果有人有现成的脚本,我将不胜感激,如果你能发布它,否则我会在编码后发布一些东西。

谢谢!

sql-server ssis t-sql

5
推荐指数
1
解决办法
4412
查看次数

SQL Server:识别最接近数据文件末尾的对象

TL\DR

我正在寻找一种方法来有效地识别最靠近物体结束一个的SQL Server的数据文件。这种方法需要对大型数据文件保持高性能。

到目前为止我所拥有的

下面的查询使用一个未公开的动态管理功能是随2012 SQL:sys.dm_db_database_page_allocations; 此 DMF 提供了与DBCC IND命令的粗略等效项。

以下查询标识给定数据文件中的最后一个对象(警告:不要对大于 25 GB 的数据库运行此查询,除非您想在某个时候取消它):

-- Return object with highest Extent Page ID
SELECT   files.name as logical_file_name
        , files.physical_name as physical_file_name
        , OBJECT_SCHEMA_NAME(object_id) + N'.' + OBJECT_NAME(object_id) AS object_name
        , alloc.*
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, NULL) alloc
    INNER JOIN sys.database_files files
        ON alloc.extent_file_id = files.file_id
WHERE is_allocated = 1
    AND files.name = 'Logical_FileName'
ORDER BY files.name , files.physical_name, …
Run Code Online (Sandbox Code Playgroud)

sql-server datafile

5
推荐指数
1
解决办法
399
查看次数

sys.dm_exec_sql_text 在 dbid、objectid 和 number 列中返回 NULL,但不返回 text

这是值得的窃听我虽然从来没有引起任何真正的问题,我可以大致找到其他方式提供这些信息,但有人可以解释为什么NULL可以在返回dbidobjectid以及number从列sys.dm_exec_sql_text在DMV,但收效text列?我理解为什么输出会反向返回(例如所有列但text会产生数据),但我已经在多个 SQL Server 版本中多次看到这种行为,并且文档似乎并不暗示这应该是可能的,或者我只是读错了。

这是我正在运行的查询示例:

SELECT TOP 100 
      t.*
    , s.*
    , c.*
FROM    sys.dm_exec_query_stats s
        LEFT JOIN sys.dm_exec_connections c
               ON c.most_recent_sql_handle = s.sql_handle
        CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) t
WHERE s.execution_count > 1 AND DATEDIFF (second, creation_time, GETDATE()) > 0
        AND t.dbid IS NULL
Run Code Online (Sandbox Code Playgroud)

这是该text列的其中一个结果的示例,这意味着这与临时对象无关,而这正是我通常猜测的原因。

select * from [dbo].[Map_ProviderSpecialty]
Run Code Online (Sandbox Code Playgroud)

这些列返回NULL值的情况是什么?

sql-server dmv

4
推荐指数
1
解决办法
1822
查看次数

按隐式组求和

我确定我错过了一个明显的解决方案,但我正在尝试总结由显式组号和隐式排序定义的组的值。我敢肯定这不会让这更清楚,所以假设我有这个示例源表:

GroupID     Value
----------- -----------
1           5
1           5
1           3
2           4
2           1
1           4
2           3
2           5
2           2
1           1
Run Code Online (Sandbox Code Playgroud)

我想要一个为我提供以下结果的查询:

GroupID     Values
----------- -----------
1           13
2           5
1           4
2           10
1           1
Run Code Online (Sandbox Code Playgroud)

隐含的排序是我还没有找到解决方法的挑战...... 任何帮助,将不胜感激。

我希望我可以使用类似于以下的查询创建一个确定性的行排序:

SELECT    * 
        , ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum  
FROM Table WITH(TABLOCK)
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)

我希望这会强制分配顺序扫描,然后会给我一个确定性的行顺序。

可悲的是,我一直坚持使用数据。我这里没有其他指标,例如日期等,可以提供任何设定的顺序。我希望上面概述的技巧就足够了,但我不完全确定它会。

编辑:只是为了结束这个,因为我知道有关于我为什么问这个问题的问题,我有一系列按月/年命名的堆表,其中包含业务想要总结的行项目金额按天(它们与我问题中的隐含组相关)。因为有效地执行此操作看起来不可行,所以我们决定在月(例如表)级别进行聚合,因此这篇文章帮助我证明了对业务需求的更改是合理的。感谢大家的投入!

sql-server order-by window-functions

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