有没有办法在 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
我正在尝试确定我有时在存储过程中遇到的问题。
我不得不说,存储过程在 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
我有一个包含 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_fk是bigint并且具有外键索引(非聚集)mcon_data是datetime并且具有索引(非聚集)索引创建脚本
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) 我有两个 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 中数据库表的记录的表名、行数和大小。当我执行查询时,我得到了一个结果显示
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) (与此问题有关)
如果我想查看当前是否有任何长时间运行的查询在我的数据库上执行,最简单的检查方法是什么?(我希望答案会是一些关于master..sysprocesses?)
这是我有的表的一个例子:
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)
我想根据日期范围添加一定数量的行。此外,在每一行中添加基本上是月份和年份的列期间。
我们有一个大约 3 TB 的 SQL Server 2014 企业版数据库。我们每周都进行压缩完整备份,直到上周它都运行良好,现在突然需要 18 个小时才能完成。
备份完成后,备份大小约为 550 GB。
备份驱动器有大约 950 GB 的可用磁盘空间。
可能是什么问题?
我想从一个名为 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
')' 附近的语法不正确。
有时我们的开发人员会编写一个使用游标的查询,但不会明确地关闭它们。我正在尝试在我的生产数据库中生成一个活动对象列表,这些对象使用游标但没有明确关闭/取消分配它们。为此,我编写了一个简单的语句来完成这项工作,但速度非常慢:
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-2014 ×10
sql-server ×9
t-sql ×2
backup ×1
bulk-insert ×1
count ×1
index ×1
insert ×1
performance ×1
ssms ×1
statistics ×1
where ×1