标签: sql-server-2014

用 where 子句计数

有没有办法在 COUNT 中有 WHERE 子句?或者如何用一些条款来计算?

select 
  a
  b,
  count(c where t1.u='UAE') as c1 
from t1 
Run Code Online (Sandbox Code Playgroud)

我正在使用 MS SQL Server 2014

sql-server count sql-server-2014 where

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

错误的估计行数

我正在尝试确定我有时在存储过程中遇到的问题。

我不得不说,存储过程在 select 子句中使用了 UDF(也许这就是问题的原因)但无论如何,不​​管它不是,下面是执行计划的一部分:

在此处输入图片说明

其中 Hash Match 的输出估计行数和非聚集索引 IX_Job_OperationID 上的 Index_Seek 估计值都是完全错误的:

在此处输入图片说明 在此处输入图片说明

我试图更新与索引 IX_Job_OperationID 相关的统计信息,即使使用 fullscan 选项,但它没有帮助。

UPDATE STATISTICS Job [IX_Job_OperationID] with fullscan
Run Code Online (Sandbox Code Playgroud)

我也在使用 recompile存储中选项,因为给定提供的参数,所涉及的数据集可能会发生很大变化。

有人能指出我正确的方向并帮助我理解为什么即使更新了统计数据,估计值与实际值相差甚远?

这里是实际执行计划的链接

该执行计划导致总共 8,610,665 次逻辑读取,而其他以某种方式选择的更好的计划可能约为 122,692

index sql-server statistics t-sql sql-server-2014

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

减少此 COUNT() 查询的持续时间

我有一个包含 2,161,524 行的表。我认为计数查询花费的时间太长。

select count(mcon_codigo_pk) from tbMovimentoConta
-- count = 2,161,524
-- time = 9 seconds

select count(1) from tbMovimentoConta 
where con_codigo_fk = 1 
and mcon_data between '2015-01-05' and '2016-01-06'
-- count = 1,034,729 
-- time = 13 seconds
Run Code Online (Sandbox Code Playgroud)

细节:

  • 该列con_codigo_fkbigint并且具有外键索引(非聚集)
  • 该列mcon_datadatetime并且具有索引(非聚集)
  • 表有自增PK(聚集索引)
  • 还有更多三个具有索引的外来索引(所有索引都是由实体框架创建的)

索引创建脚本

CREATE NONCLUSTERED INDEX [ix_mcon_data] ON [dbo].[tbMovimentoConta]
(
    [mcon_data] ASC
)
WITH (
    PAD_INDEX = OFF
    , STATISTICS_NORECOMPUTE = OFF
    , SORT_IN_TEMPDB = OFF
    , DROP_EXISTING = OFF …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2014 query-performance

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

脚本无法作为 SQL Server 代理作业运行,从 SSMS 运行时成功完成

我有两个 T-SQL 脚本,它们计划每天运行一次。两者都清理不同表中的一些旧数据。两个脚本都以同一用户身份在同一数据库上运行。

脚本 A 将在 SQL Server Management Studio 和作为作业启动时成功执行,但脚本 B 将仅在 SQL Server Management Studio 中成功执行,即使以设置为在 SQL Server 下运行脚本的同一用户登录代理人。

脚本 B 失败并出现以下错误:

以用户 [username] 身份执行。
DELETE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。

验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。

[SQLSTATE 42000](错误 1934)。步骤失败。

我在尝试清理的表之一上确实有一个过滤索引,但为什么它会通过 SSMS 工作?

sql-server ssms sql-server-agent sql-server-2014

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

如果数据计数增加,SQL Server DB 表数据大小查询结果不会增加

我有一个查询,它将显示 SQL Server 中数据库表的记录的表名、行数和大小。当我执行查询时,我得到了一个结果显示

TableName            NumberOfRows   SizeinKB
TBL_PROCESS_AUDIT2   1              16
Run Code Online (Sandbox Code Playgroud)

但是当我使用相同的插入查询将更多记录插入同一个表并执行查询时,它显示更多的行数 (50) 但大小相同 (16kb)。

TableName            NumberOfRows   SizeinKB
TBL_PROCESS_AUDIT2   50             16
Run Code Online (Sandbox Code Playgroud)

实际上,当表的行数增加时,它的大小也应该增加。因此,对于 1 条记录,大小为 16KB,因此对于 50 条记录,大小应为 800KB。当我插入像大约 2000 条记录这样的批量记录时,大小会有所不同。

我的查询中的逻辑或问题是什么?我想要一个数据库表的记录的实际大小。

我的查询:

CREATE TABLE #RowCountsAndSizes (TableName NVARCHAR(128),rows CHAR(11),      
       reserved VARCHAR(18),data VARCHAR(18),index_size VARCHAR(18), 
       unused VARCHAR(18))

EXEC       sp_MSForEachTable 'INSERT INTO #RowCountsAndSizes EXEC sp_spaceused ''?'' '

SELECT     TableName,CONVERT(bigint,rows) AS NumberOfRows,
           CONVERT(bigint,left(reserved,len(reserved)-3)) AS SizeinKB
FROM       #RowCountsAndSizes 
ORDER BY   NumberOfRows DESC,SizeinKB DESC,TableName

DROP TABLE #RowCountsAndSizes
Run Code Online (Sandbox Code Playgroud)

sql-server insert database-size sql-server-2014 bulk-insert

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

如何判断当前是否有任何长时间运行的查询正在执行?

(与此问题有关

如果我想查看当前是否有任何长时间运行的查询在我的数据库上执行,最简单的检查方法是什么?(我希望答案会是一些关于master..sysprocesses?)

sql-server sql-server-2014

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

在由两列定义的范围内为每个月显示一行

这是我有的表的一个例子:

Part No  | Start Date | End Date  |Cost
ABCD1    | 2014-01-01 | 2014-04-01|50.99
BDE2     | 2014-01-01 | 2014-03-01|14.59
ABCD1    | 2014-04-13 | 2014-05-01|13.99
Run Code Online (Sandbox Code Playgroud)

这是我想看到的输出

Part No  | Start Date | End Date  |Cost   |Period
ABCD1    | 2014-01-01 | 2014-04-01|50.99  |2014/01
ABCD1    | 2014-01-01 | 2014-04-01|50.99  |2014/02
ABCD1    | 2014-01-01 | 2014-04-01|50.99  |2014/03
BDE2     | 2014-01-01 | 2014-03-01|14.59  |2014/01
BDE2     | 2014-01-01 | 2014-03-01|14.59  |2014/02
ABCD1    | 2014-04-13 | 2014-05-01|13.99  |2014/04
Run Code Online (Sandbox Code Playgroud)

我想根据日期范围添加一定数量的行。此外,在每一行中添加基本上是月份和年份的列期间。

sql-server sql-server-2014

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

备份突然需要很长时间才能完成

我们有一个大约 3 TB 的 SQL Server 2014 企业版数据库。我们每周都进行压缩完整备份,直到上周它都运行良好,现在突然需要 18 个小时才能完成。

备份完成后,备份大小约为 550 GB。

备份驱动器有大约 950 GB 的可用磁盘空间。

可能是什么问题?

sql-server backup sql-server-2014

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

计算订单之间的平均天数

我想从一个名为 Orders 的表中计算几个订单日期之间的平均天数。对于每个 CustomerID,订单之间的平均天数是多少。示例表如下(img):

CREATE TABLE #Orders(CustomerID int, OrderDate datetime);

INSERT #Orders(CustomerID, OrderDate) VALUES
    (100,'20170114'),(100,'20170123'),(100,'20170129'),
    (101,'20170202'),(101,'20170212');
Run Code Online (Sandbox Code Playgroud)

我试过这个查询:

SELECT  CustomerID, AVG(OrderDate - PriorDate)
FROM (SELECT CustomerID, OrderDate
           , LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY OrderDate) as PriorDate
      FROM #Orders where CustomerID = 100)
Run Code Online (Sandbox Code Playgroud)

但是,这会产生:

消息 102,级别 15,状态 1
')' 附近的语法不正确。

sql-server t-sql sql-server-2014

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

获取使用游标但未明确关闭/取消分配它们的活动对象的列表

有时我们的开发人员会编写一个使用游标的查询,但不会明确地关闭它们。我正在尝试在我的生产数据库中生成一个活动对象列表,这些对象使用游标但没有明确关闭/取消分配它们。为此,我编写了一个简单的语句来完成这项工作,但速度非常慢:

select distinct name, 
            definition
from   SYS.SQL_MODULES 
   inner join SYS.OBJECTS O 
           on SQL_MODULES.OBJECT_ID = O.OBJECT_ID 
where  SQL_MODULES.DEFINITION like '%open%'
   and SQL_MODULES.DEFINITION like '%declare % cursor%'
   and ( SQL_MODULES.DEFINITION not like '%close%' 
          or SQL_MODULES.DEFINITION not like '%deallocate%' )
Run Code Online (Sandbox Code Playgroud)

目前,这需要大约 3 分钟才能运行。有没有更好的方法来获取我正在寻找的信息?

sql-server sql-server-2014

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