小编Vla*_*nov的帖子

将每日计划分组为 [开始日期; 结束日期] 间隔与工作日列表

我需要在两个系统之间转换数据。

第一个系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能存在各种差异(周末、公共假期和更长的停顿,一周中的某些日子可能会被排除在日程之外)。根本没有间隙,甚至可以包括周末。该时间表最长可达 2 年。通常它会持续数周。

这是一个简单的时间表示例,它跨越两周,不包括周末(下面的脚本中有更复杂的示例):

+----+------------+------------+---------+--------+
| ID | ContractID |     dt     | dowChar | dowInt |
+----+------------+------------+---------+--------+
| 10 |          1 | 2016-05-02 | Mon     |      2 |
| 11 |          1 | 2016-05-03 | Tue     |      3 |
| 12 |          1 | 2016-05-04 | Wed     |      4 |
| 13 |          1 | 2016-05-05 | Thu     |      5 |
| 14 |          1 | 2016-05-06 | Fri     |      6 |
| 15 |          1 | 2016-05-09 | …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server gaps-and-islands

18
推荐指数
3
解决办法
3203
查看次数

当 XACT_ABORT 设置为 ON 时,在什么情况下可以从 CATCH 块内部提交事务?

我一直在阅读 MSDN 关于TRY...CATCHXACT_STATE

它有以下示例,用于XACT_STATE在构造CATCH块中TRY…CATCH确定是提交还是回滚事务:

USE AdventureWorks2012;
GO

-- SET XACT_ABORT ON will render the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This 
        -- statement will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block will not execute. …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

17
推荐指数
4
解决办法
8424
查看次数

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 不使用 (A,B,C) 上的索引

考虑这两个函数:

ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C)

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C)
Run Code Online (Sandbox Code Playgroud)

据我了解,它们产生完全相同的结果。换句话说,您在PARTITION BY子句中列出列的顺序无关紧要。

如果有一个索引,(A,B,C)我希望优化器在两个变体中都使用这个索引。

但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。

我在 SQL Server 2008 Standard 和 SQL Server 2014 Express 上见过它。

这是我用来重现它的完整脚本。

在 Microsoft SQL Server 2014 上试用 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation Express Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack 1)

和 Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 …

sql-server-2008 sql-server sql-server-2014

15
推荐指数
1
解决办法
9416
查看次数

为每个更改的行增加一个计数器

我使用的是 SQL Server 2008 Standard,它没有 SEQUENCE功能的。

外部系统从主数据库的几个专用表中读取数据。外部系统保留一份数据副本并定期检查数据中的更改并刷新其副本。

为了使同步高效,我只想传输自上次同步以来更新或插入的行。(这些行永远不会被删除)。要知道自上次同步以来更新或插入了哪些行,有一bigintRowUpdateCounter,每个表中。

这个想法是,无论何时插入或更新一行,其RowUpdateCounter列中的数字都会改变。RowUpdateCounter应从不断增加的数字序列中获取进入该列的值。中的值RowUpdateCounter列中的应该是唯一的,并且存储在表中的每个新值都应该大于任何以前的值。

请参阅显示所需行为的脚本。

架构

CREATE TABLE [dbo].[Test](
    [ID] [int] NOT NULL,
    [Value] [varchar](50) NOT NULL,
    [RowUpdateCounter] [bigint] NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
    [ID] ASC
))
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_RowUpdateCounter] ON [dbo].[Test]
(
    [RowUpdateCounter] ASC
)
GO
Run Code Online (Sandbox Code Playgroud)

插入一些行

INSERT INTO [dbo].[Test]
    ([ID]
    ,[Value]
    ,[RowUpdateCounter])
VALUES
(1, 'A', ???),
(2, 'B', ???),
(3, 'C', ???),
(4, 'D', ???);
Run Code Online (Sandbox Code Playgroud)

预期结果 …

sql-server-2008 sql-server

8
推荐指数
1
解决办法
2359
查看次数

Calculate 40 day moving average w.r.t to a field

I have a table that stores the information about user calls in a call center. The table has a call_id, date when the call was made, actual date and time of the call, call type and a score associated with the call.

My requirement is to calculate a 40 day moving average of the score with respect to the call day. The 40 day should start from the previous day from the call date. If there are no call in …

postgresql window-functions postgresql-9.4

6
推荐指数
1
解决办法
3047
查看次数

SSMS 突然开始生成内联到 CREATE TABLE 语句而不是 ALTER TABLE 的 DEFAULT 约束

我一直在使用 SSMS 生成整个数据库的脚本并将它们存储在源代码管理中。

短信

选项

多年来它一直运行良好,但几天前我注意到 SSMS 开始生成DEFAULT约束作为内联到CREATE TABLE语句中的子句,而不是添加单独的ALTER TABLE语句。

这是一张表的示例。这是脚本之前的样子:

USE [my db name]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ConsignmentGroups](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ConsignmentID] [int] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Notes] [nvarchar](255) NOT NULL,
    CONSTRAINT [PK_ConsignmentGroups] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms

6
推荐指数
1
解决办法
882
查看次数

使用 sp_getapplock 实现队列。这是正确的吗?有没有更好的办法?

我一直在阅读 Paul White 撰写的关于SQL Server 隔离级别的一系列文章,并遇到了一个短语

为了强调这一点,无论发生什么并发修改,用 T-SQL 编写的伪约束都必须正确执行。应用程序开发人员可能会使用 lock 语句来保护敏感操作。T-SQL 程序员最接近风险存储过程和触发器代码的工具是相对很少使用的sp_getapplock系统存储过程。这并不是说它是唯一的,甚至是首选的选择,只是它存在并且在某些情况下可能是正确的选择。

我正在使用sp_getapplock,这让我想知道我是否正确使用它,或者有更好的方法来获得所需的效果。

我有一个 C++ 应用程序,可以 24/7 全天候循环处理所谓的“构建服务器”。有一个包含这些建筑物服务器列表的表格(大约 200 行)。可以随时添加新行,但这种情况并不经常发生。行永远不会被删除,但它们可以被标记为不活动。处理一个服务器可能需要几秒到几十分钟,每个服务器都不一样,有的“小”,有的“大”。一旦服务器被处理,应用程序必须等待至少 20 分钟才能再次处理它(服务器不应过于频繁地轮询)。应用程序启动 10 个并行执行处理的线程,但我必须保证没有两个线程试图同时处理同一个服务器. 两个不同的服务器可以而且应该同时处理,但每个服务器的处理频率不能超过 20 分钟一次。

下面是一个表的定义:

CREATE TABLE [dbo].[PortalBuildingServers](
    [InternalIP] [varchar](64) NOT NULL,
    [LastCheckStarted] [datetime] NOT NULL,
    [LastCheckCompleted] [datetime] NOT NULL,
    [IsActiveAndNotDisabled] [bit] NOT NULL,
    [MaxBSMonitoringEventLogItemID] [bigint] NOT NULL,
CONSTRAINT [PK_PortalBuildingServers] PRIMARY KEY CLUSTERED 
(
    [InternalIP] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql locking

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

SQL Server 2016 标准版中是否会包含临时表?

新版本的 SQL Server 2016 将支持所谓的Temporal Tables

我找不到任何说明此功能是否仅适用于企业版或在标准版中可用的文档。

一方面,临时表注意事项和限制表明它将仅适用于企业:

  • 默认情况下,历史表是 PAGE 压缩的。
  • 最佳索引策略将包括聚集列存储索引 [...] 默认历史记录表具有聚集行存储索引

据我所知,数据压缩是企业独有的功能,但技术上标准版可以创建一个非压缩的历史表。

列存储索引是企业独有的功能,但默认情况下它会创建一个行存储索引,所以还是有希望的。

另一方面,sys.dm_db_persisted_sku_features 的文档在2014 年和 2016 年是相同的,并且企业功能列表没有临时表(也许文档还没有更新?)。

  • 有谁知道,也许是非正式的,可能的变体是什么?
  • 如果有人安装了最新的 2016 RC,如果数据库有临时表,他们能告诉我们sys.dm_db_persisted_sku_features返回什么吗?

如果这个功能很有可能会被纳入标准版,我可以等半年,直到2016年发布,然后再将我的2008数据库迁移到最新版本。如果没有希望,我会将其迁移到 2014 年。如果我迁移到 2014 年,它可能会在接下来的 10 年中保留在此版本上。

关于搁置这个问题:

我不想要这个问题的“基于意见”的答案,我想知道事实。我本来希望这种信息会在某个地方发布,我只是不知道在哪里看。例如,直到今天我都不知道sys.dm_db_persisted_sku_features

问题可以调整为:

  • SKU 决策是如何以及何时做出的?
  • 怎么会知道做出了这个决定?
  • 如果不是这个版本,以前的版本是怎么做的?
  • 这种信息是在RTM版本发布时发布还是更早发布?

如果不知道确凿的事实(尚未做出决定,甚至 SQL Server 开发人员也不知道),则根据先前版本中如何做出此决定进行有根据的猜测也很好。

sql-server temporal-tables sql-server-2016

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

Postgres 可以向后扫描索引吗?

我们使用 Amazon RDS 实例

x86_64-pc-linux-gnu 上的 PostgreSQL 11.13,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位

我有一个简单的经典每组前 1 名查询。我需要获取每个 的历史记录中的最新项目creativeScheduleId

这是表和索引的定义:

CREATE TABLE IF NOT EXISTS public.creative_schedule_status_histories (
  id serial PRIMARY KEY,
  "creativeScheduleId" text NOT NULL,
  -- other columns
);

CREATE UNIQUE INDEX IF NOT EXISTS idx_creativescheduleid_id
  ON public.creative_schedule_status_histories ("creativeScheduleId" ASC, id ASC);
Run Code Online (Sandbox Code Playgroud)

当引擎的查询排序时id ASC仅读取索引并且不执行任何额外的排序:

EXPLAIN (ANALYZE) 
SELECT history.id, history."creativeScheduleId"
FROM  (
    SELECT cssh.id, cssh."creativeScheduleId"
         , ROW_NUMBER() OVER (PARTITION BY cssh."creativeScheduleId"
                              ORDER BY cssh.id ASC) …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan window-functions greatest-n-per-group

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