我需要在两个系统之间转换数据。
第一个系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能存在各种差异(周末、公共假期和更长的停顿,一周中的某些日子可能会被排除在日程之外)。根本没有间隙,甚至可以包括周末。该时间表最长可达 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) 我一直在阅读 MSDN 关于TRY...CATCH
和XACT_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) 考虑这两个函数:
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 Standard,它没有 SEQUENCE
功能的。
外部系统从主数据库的几个专用表中读取数据。外部系统保留一份数据副本并定期检查数据中的更改并刷新其副本。
为了使同步高效,我只想传输自上次同步以来更新或插入的行。(这些行永远不会被删除)。要知道自上次同步以来更新或插入了哪些行,有一bigint
列RowUpdateCounter
,每个表中。
这个想法是,无论何时插入或更新一行,其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)
预期结果 …
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 …
我一直在使用 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) 我一直在阅读 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 2016 将支持所谓的Temporal Tables。
我找不到任何说明此功能是否仅适用于企业版或在标准版中可用的文档。
一方面,临时表注意事项和限制表明它将仅适用于企业:
- 默认情况下,历史表是 PAGE 压缩的。
- 最佳索引策略将包括聚集列存储索引 [...] 默认历史记录表具有聚集行存储索引
据我所知,数据压缩是企业独有的功能,但技术上标准版可以创建一个非压缩的历史表。
列存储索引是企业独有的功能,但默认情况下它会创建一个行存储索引,所以还是有希望的。
另一方面,sys.dm_db_persisted_sku_features 的文档在2014 年和 2016 年是相同的,并且企业功能列表没有临时表(也许文档还没有更新?)。
如果这个功能很有可能会被纳入标准版,我可以等半年,直到2016年发布,然后再将我的2008数据库迁移到最新版本。如果没有希望,我会将其迁移到 2014 年。如果我迁移到 2014 年,它可能会在接下来的 10 年中保留在此版本上。
关于搁置这个问题:
我不想要这个问题的“基于意见”的答案,我想知道事实。我本来希望这种信息会在某个地方发布,我只是不知道在哪里看。例如,直到今天我都不知道sys.dm_db_persisted_sku_features。
问题可以调整为:
如果不知道确凿的事实(尚未做出决定,甚至 SQL Server 开发人员也不知道),则根据先前版本中如何做出此决定进行有根据的猜测也很好。
我们使用 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