标签: sql-server

相关子查询以查找大于状态平均值的总数

我有表 Vendors (VendorName, VendorState,....) 和 Invoices (InvoiceID, InvoiceTotal,...)。我想获得大于平均状态 InvoiceTotal 的发票(作为 InvoiceId)。

我知道我首先找到每个州的平均总数:

SELECT  VendorState, Avg(InvoiceTotal) AS AvgStateInvoice
from Invoices I join Vendors V on V.VendorID= I.VendorID 
group by VendorState
Run Code Online (Sandbox Code Playgroud)

所以我现在有按州列出的平均 InvoiceTotal 列表。现在我需要弄清楚:

如何进行外部查询以选择那些大于州平均水平的发票,这就是我迷路的地方,因为我不记得进行比较的语法。我想它会是这样的:

SELECT InvoiceId from Invoices where InvoiceTotal > .....?
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

sql-server subquery sql-server-2012

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

GUID 上的聚集索引是否比非聚集索引产生更多的碎片?

我有一个简单的表:

CREATE TABLE [dbo].[UserTestGroups](
    [UserTestGroupId] [int] IDENTITY(1,1) NOT NULL,
    [Token] [nvarchar](100) NOT NULL,
    [TestId] [bigint] NOT NULL,
    [Group] [tinyint] NOT NULL,
    [InsertDate] [datetime] NOT NULL)
Run Code Online (Sandbox Code Playgroud)

该表将有相对大量的插入 - 最初 10,000 个会话,每个会话 8 行,每天总共 80,000 个插入。我们预计在不久的将来会显着增加。无论如何,我们努力使我们的平台尽可能具有弹性,而不仅仅是适应当前的负载。

该表将用于报告,可将其视为次要要求。

由于我们使用的是实体框架(Microsoft 的 ORM),因此所有写入的表都需要一个逻辑主键,因此我添加了一个我直接忽略的 Identity 列。我不喜欢使用复合键,它们往往会使 ORM 成为噩梦,所以除非我绝对必须这样做,否则我会添加另一个标识列并将其设为 PK。

所有 BI 报告的查询都将基于令牌,即sessionId - GUID,因此我在该token列上创建了聚集索引。

我们的 DBA 是 SQL Server MVP,他告诉我在 GUID 列上使用聚集索引会导致碎片,我应该在IDENTITY列上创建聚集索引,并为列创建非聚集索引Token

不明白,非聚集索引会不会有同样的碎片问题?为什么将数据复制到新索引中比使用聚集索引更好?

token-Guid 不是 PK,PK 是所有列的组合(包括InsertDate)。

目前(因为我真的不知道是什么原因)所有 GUID 值都存储为NVARCHAR(100),我不知道这样做的历史原因是什么,但这就是我们所拥有的。

我们的DBA在海外,我们的沟通是一条推特长,所以在他回来之前我无法得到正确的答案

sql-server clustered-index identity fragmentation sql-server-2014

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

使用数据库引擎优化顾问 - 如何为建议生成脚本?

我已经运行了一个多小时的服务器端配置文件跟踪,以生成一个 .trc 文件,其中包含我的一个数据库中的所有活动。

然后,我将此 .trc 跟踪文件作为参数传递给数据库引擎优化顾问。

在此处输入图片说明

运行 DTA 后,我得到了建议:

在此处输入图片说明 我如何编写建议?

我正在使用SQL Server 2005,除了单独编写脚本之外,我似乎找不到任何其他方法,这太耗时了。

index sql-server-2005 sql-server optimization statistics

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

每小时监控数据库以防止数据丢失

这是我的要求,虽然我知道可以做些什么来实现它,但仍在寻找最佳解决方案。

几天前,有人(一些黑客或一些以前的开发人员)截断了我的重要表,给我的客户带来了不便。我需要更改我的数据库密码、服务器密码和其他应用程序的密码,以避免此类令人讨厌的行为并阻止我的应用程序。

此外,首先我需要知道是否在我的客户之前使用我的数据执行此类活动,以便我可以为他们找到任何解决方法。这是我到现在为止的想法——

  • 我应该创建一个窗口服务,它将每 1 小时运行一次并检查所有表,或者最重要的是在主表中检查记录数是否符合预期。如果没有,则会向我发送警报,以便我可以快速解决该问题。
  • 我应该创建一个 SQL 作业,该作业将执行我在第一点中提到的相同步骤。

这些变通方法似乎很好且可行。但我真的很想知道我还能做些什么来阻止我的数据或在数据丢失时提醒我。我相信还有其他有效且更可行的方法来实现我想要的。如果有人可以帮助我,那就太好了。

这是一个 Web 应用程序,只有经过身份验证的用户才能登录。我的 SQL Server 版本是企业版。

security sql-server

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

将 SQL SERVER 过程转换为 POSTGRESQL

我在 SQL Server 中有程序可以打印给定国家/地区的所有玩家。我尝试将其转换为 plpgsql,但出现错误。

SQL Server 过程

CREATE PROCEDURE kraj_pilkarze @kraj varchar(30)
AS
DECLARE @idkraj INT
DECLARE @nazwa_zespolu varchar(30)
SELECT @idkraj = id_kraj FROM kraj WHERE @kraj=nazwa
DECLARE kursor_pilk CURSOR
FOR SELECT imie,nazwisko, id_zespol, id_kraj FROM pilkarz
DECLARE @imie varchar(20), @nazwisko varchar(30), @zespol int, @d_kraj int
OPEN kursor_pilk
FETCH NEXT FROM kursor_pilk INTO @imie, @nazwisko,@zespol, @d_kraj
WHILE @@FETCH_STATUS=0
    BEGIN
    IF @d_kraj=@idkraj
        BEGIN
            SELECT @nazwa_zespolu = nazwa FROM zespol WHERE @zespol=id_zespol 
            PRINT @imie+' '+@nazwisko+', '+@nazwa_zespolu
            FETCH NEXT FROM kursor_pilk INTO …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server cursors plpgsql functions

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

修改备份目录路径 Ola 维护脚本

我已经使用 Ola ( https://ola.hallengren.com ) 的SQL Server 维护解决方案配置了备份。

在备份作业中,我将 BackupDirectory 指定为共享文件夹(例如:\comp1\path)。它工作正常,但现在我需要更改路径。假设我不想修改/重新创建作业,有没有办法修改 sql 作业中的路径?

sql-server backup ola-hallengren

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

计划缓存行为

有人可以解释一下为什么以下内容没有被缓存

use AdventureWorks2014
go
DECLARE @id INT=43865
SELECT
sp.[BusinessEntityID]
, so.salesorderid
FROM sales.salesorderheader so JOIN sales.salesperson sp
ON sp.[BusinessEntityID] = so.salespersonid
WHERE so.salesorderid = @id
Run Code Online (Sandbox Code Playgroud)

每次我使用不同的参数执行上述查询时,它都会在计划缓存中创建一个条目

顺便说一下,优化临时工作负载已设置

谢谢

sql-server database-internals sql-server-2012

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

使用 EarlyTermination Timeout 优化查询是否值得?

在运行Ola 的 IndexOptimize重建所有索引和统计信息后,我立即清除了数据和计划缓存,并运行了一个非常复杂的丑陋查询来获得其性能的基线。查询实际计划显示 ReasonForEarlyTermination=Timeout 和 Est Rows 和 Actual Rows 的偏差(与 est. 相比,实际行因子为 10,000)。

我想知道这种行数的不平衡是否可能是超时的结果 - 我认为在索引和统计信息重建之后应该是合适的?

如果无法更改查询本身,那么优化以 ReasonForEarlyTermination=Timeout 结尾的查询是否有意义?由于我打算做一些索引调整并重新运行查询,所以不是不可能确定可能改进的结果,因为下一个查询计划创建肯定会再次超时,因此可能会有所不同,结果不同?

技术 详细信息:Sql Server 2008 R2 开发。埃德。10.50.6000.34 DB Comp. 80级。

sql-server statistics execution-plan sql-server-2008-r2

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

调度索引重建作业

我有一个 MS-SQL 2014 SP1 - 两个节点 AlwaysOn AG(一个主节点和一个只读辅助节点)有大约 10 个数据库,总大小为 20-30GB。我有一些关于调度索引重建和统计信息收集的问题。

我计划通过维护计划每周安排一次。通常在主节点上根本没有负载的周日晚上。

我应该在主要还是在副本中运行作业?如果我只在辅助上运行它,那么我会得到什么好处?或相反亦然?(意思是我应该在两个节点上运行)

如果我通过维护计划使用 SP1 和索引重建,是否可能发生损坏? 正如这里提到的

sql-server availability-groups sql-server-2014 index-maintenance

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

跟踪标志 2861 以及“零成本”计划的实际含义

我试图了解跟踪标志 2861 以及它对琐碎查询的实际作用?

简介

SQL Server 通常不会缓存这些简单查询的计划,因为缓存计划的成本高于为此类简单查询生成新计划的成本。

这显然是不正确的,因为我运行的每个“琐碎”查询似乎都被缓存了。所以我想知道 2861 的意义是什么,除非我误解了一个微不足道的计划实际上是什么。当我查询缓存计划并且它说它是临时的和微不足道的时,我没有理由怀疑它。

希望有人能给我解惑。

sql-server plan-cache trace-flags

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