标签: sql-server

使用聚集列存储索引向表添加新列

我有一个FactsTable1包含 240 列的每日事实表 ' ',我正在其中探索 ' Clustured Columnstore Index'(CCI)。

我想知道,

  • 当我向表中再添加约 50 列时会发生什么?
  • 他们会自动添加到 CCI 吗?或者我必须再次重建CCI?
  • 处理这种情况的最佳方法应该是什么?
  • 如果我必须重建索引以使新列成为 CCI 的一部分,那么如果我不重建会发生什么?它将如何影响我的查询性能?

附加信息 :

  • FactsTable1 包含 400000+ 行和 240 列
  • 它在日期列上分区
  • 它对分析数据的查询量很大。
  • @@版本:Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64)

sql-server columnstore sql-server-2016

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

关键字“Exec”附近的语法不正确

你能告诉我这个查询有什么问题吗?我正在尝试编写 SQL 查询来动态创建表

DECLARE @SQLString NVARCHAR(MAX)

SET @SQLString =+ 'Create Table' + GETDATE() + '_' + 'Table' + '' + '(' + 'Column1' + ' ' + 'Nvarchar(50)' + 'Null' + ')' +

Exec @SQLString ;
Run Code Online (Sandbox Code Playgroud)

sql-server

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

如何获得更好的空集执行计划?

我有一个要优化的查询,如下所示:

SELECT 1 FROM HugeView
WHERE (Col1 = 'a' AND @val = 1) OR (Col2 = 'a' AND @Val = 0)

(where Col1 and Col2 are on different tables)
Run Code Online (Sandbox Code Playgroud)

如果我对@Val值 (1/0) 进行硬编码- SQL Server 知道构建一个执行计划,在该计划中它只访问Col1或的相关表Col2。

但是当使用一个变量时,所有的表都会HugeView被访问。

您能否建议一种可以帮助 SQL Server 不访问不必要表的方法?

限制:

  • 不能用 option (recompile)
  • 无法将此代码封装在 SP 中
  • 无法改变 HugeView

不幸的是,上述所有限制都是产品设计和/或开发范围的一部分——我对此无能为力——只能在我拥有的范围内工作。

但是,我知道它@var是 1 或 0,并且可以根据需要创建和查询(并加入)临时表或“真实”表。

另请注意,我没有从Col1or的表中进行选择Col2- 我仅将它们用于过滤。

我尝试在空表上创建和加入,或者top(@somevar)根据@var的值 - 但没有帮助。

UNION ALL不会有帮助,因为在任何情况下优化器都不知道 …

sql-server optimization execution-plan

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

如果删除查询使 SQL Server for php 超时,会发生什么情况?

技术

我正在使用 php 的 mssql 扩展(在 linux 上)向 SQL Server 发送查询。

设置。

我有一个表格,可以相当快地建立一次性数据。我花了比预期更长的时间来构建一个 cron 每小时清理这些数据,所以它已经积累了几个月来超过 1G 的数据,不确定有多少行,但可能超过 100 万。

问题

因此,我对超过 1 天的任何内容运行了删除查询。

DELETE FROM CacheForms WHERE TimeStamp < 1503454349
Run Code Online (Sandbox Code Playgroud)

但是在 60 秒后查询超时并且脚本失败。(更新同样发生在 10 分钟。)

问题

当这个删除查询超时(一个 php 概念)数据库会发生什么?数据库是否从事务日志中恢复已删除的数据?还是数据真的被删除了?或者查询是否在 sql server 中继续运行?

sql-server php query-timeout

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

INSTEAD OF 触发器内的确定性

参考我之前关于首选设计的问题,以避免循环或多个更新路径参照完整性通过ON UPDATE CASCADE和级联更新和删除ON DELETE CASCADE,我正在尝试使用触发器作为替代方案。

对于这个例子,我试图尽可能地简化设计。

我有一张Parent桌子和一张Child桌子;Parent并Child共享一列,ParentName。每当Parent.ParentName发生变化时,我都想在Child.ParentName.

够简单吗?如果我更新 中的单行Parent,我可以使用inserted和deleted表很容易地知道要更新Parent和Child表中的哪一行。像这样的东西:

UPDATE Parent
SET Parent.ParentName = inserted.ParentName
FROM Parent
    INNER JOIN deleted ON Parent.ParentName = deleted.ParentName
    CROSS JOIN inserted;

UPDATE Child
SET Child.ParentName = inserted.ParentName
FROM Child
    INNER JOIN deleted ON Child.ParentName = deleted.ParentName
    CROSS JOIN inserted;
Run Code Online (Sandbox Code Playgroud)

很明显,如果Parent在一个 …

trigger sql-server referential-integrity

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

从用户 ID 获取计数

我需要一种方法来获得ek与每个相关联的唯一计数userid

我想要的输出是:

74123    3
Run Code Online (Sandbox Code Playgroud)

但我似乎无法准确获得 Distinct 计数的语法。我只能让它返回 TOTAL 计数,这不是我所追求的。

数据线

    CREATE TABLE [dbo].[___________Purple](
    [userid] [int] NULL,
    [ek] [char](100) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES (71423, N'Black                                                                                               ')
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES (71423, N'Black                                                                                               ')
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES (71423, N'Black                                                                                               ')
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES (71423, N'Black                                                                                               ')
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES (71423, N'Black                                                                                               ')
GO
INSERT [dbo].[___________Purple] ([userid], [ek]) VALUES …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

为什么我的数据库结构和 SELECT 操作会生成 NULL?

我对数据库问题没有太多经验,所以请原谅文字墙,我相信上下文对于理解问题和目标很重要。


我每天都会从另一个系统收到一个 CSV 文件,我希望将其保留在 Microsoft SQL Server 上运行的数据库中。为了实现这一点,我每天安排一个 PowerShell 脚本,它使用 bcp 实用程序将 CSV ( accounts.csv ) “加载”到accounts_stage具有 CSV 文件“精确”布局的表 ( ) 中。此外,我将时间戳“写入”到另一个表 ( import_stage) 中。该accounts_stage表具有触发器集,并且 bcp 配置为触发该触发器。

导入完成后,我想“规范化”数据。对于一个基本示例,假设这仅涉及合同编号(在 CSV 文件中名为“Vnr”的字段),它是一个字符串。我有另一个表 ( contracts),它被触发器填充:

INSERT INTO dzp.contractid(vnr)
SELECT DISTINCT
    a.Vnr
FROM dzp.accounts_stage a
WHERE NOT EXISTS(
    SELECT id.vnr
    FROM dzp.contractid id
)
Run Code Online (Sandbox Code Playgroud)

这应该并且似乎完成了将所有导入到表中的合同编号contractids。contractids.contractId是 BIGINT PRIMARY KEY、IDENTITY 和自动增量。

我将导入元数据添加到我的表中,如下所示:

   CREATE TABLE #IMPORTMETADATA
            ([importid] bigint
            ,[generated_timestamp] datetime …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 sql-server import csv

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

从具有连续日期和相同列值的行中查找日期范围

之前有人问过一个类似的问题,但我一直无法将这些答案调整到我的问题中。

我想在连续日期中查找行,其中另一列具有相同的值,并将其作为单个日期范围返回。

我尝试使用OVER和PARTITION BY以及 ROW_NUMBER() 来获得我需要的结果,但我对这些概念不够熟悉,无法找出正确的输出。

系统为 Microsoft SQL Server 2014。

鉴于:

CREATE TABLE EXCEPTIONS
(
  ID    NUMERIC(18) NOT NULL,
  DATE  DATE        NOT NULL,
  TYPE  VARCHAR(20) NOT NULL,
  VALUE VARCHAR(20),
);
Run Code Online (Sandbox Code Playgroud)

和数据:

INSERT INTO EXCEPTIONS VALUES 
(17482, '2016-08-24', 'PRESSURE_EXCEPTION', 'Over'),
(17482, '2016-08-25', 'PRESSURE_EXCEPTION', 'Over'), 
(17482, '2016-08-26', 'PRESSURE_EXCEPTION', 'Over'), 
(17482, '2016-09-04', 'PRESSURE_EXCEPTION', 'Over'), 
(17482, '2016-09-05', 'PRESSURE_EXCEPTION', 'Over'), 
(17482, '2016-09-16', 'PRESSURE_EXCEPTION', 'Under'), 
(17482, '2016-09-17', 'PRESSURE_EXCEPTION', 'Under'), 
(17482, '2016-09-23', 'PRESSURE_EXCEPTION', 'Under'), 
(17482, '2016-09-24', 'PRESSURE_EXCEPTION', 'Under'), 
(17482, '2016-09-25', 'PRESSURE_EXCEPTION', 'Under'), …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning date

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

复杂查询中的执行顺序

我知道简单查询的查询执行顺序。

但是,我对理解此查询中的确切执行顺序感到困惑:

select 
      M.DateKey  As DateKey ,
      PersonnelCode As PersonnelCode,
      Isnull((select top 1 BranchCode 
                  from [Financial].[viwPersonnelLocation]
              where PersonnelCode = p.PersonnelCode and DateKey <= M.DateKey 
                  order by DateKey desc)
                  ,p.BranchCode) As BranchCode,

          Isnull((select top 1 CertficateCode
                   from [Financial].[viwPersonnelEducation]
                   where PersonnelCode = p.PersonnelCode and DateKey <= M.DateKey 
                   order by DateKey desc)
                   ,p.Educationcode) As Educationcode

    from (select DateKey,MonthOfYearKey,EDATE 
          from [Common].[DimTime] 
          where LastDayOfMonthKey = 1) M

                Inner Join 

               [Financial].[viwPersonnelInfo] As P  
                   on m.DateKey >= p.DateOfEmployeement
    where (m.DateKey <= p.DateOfLeave) or (p.DateOfLeave='' or p.DateOfLeave is …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

发生 Always On 故障转移时如何使用“tempdb”?

tempdb发生故障转移时如何利用?

假设有两台服务器,服务器 1是主服务器,服务器 2是辅助服务器。突然,故障转移发生了,那么,tempdb在这种情况下如何表现?

sql-server sql-server-2012 failover availability-groups sql-server-2014

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