标签: sql-server-2008

聚合 GROUP BY 瓶颈

我有一个SELECT GROUP BY操作的性能瓶颈。

架构

我有一张这样的表:

CREATE TABLE [InverterData](
    [InverterID] [bigint] NOT NULL,
    [TimeStamp] [datetime] NOT NULL,    
    [ValueA] [decimal](18, 2) NULL,
    [ValueB] [decimal](18, 2) NULL
    CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED 
    (
        [TimeStamp] DESC,
        [InverterID] ASC
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
    , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON
    , ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)

Index这样的:

CREATE NONCLUSTERED INDEX [TimeStamp_Power-NonClusteredIndex] ON [dbo].[InverterData]
(
    [InverterID] ASC,
    [TimeStamp] ASC
)
INCLUDE 
(   
    [ValueA],
    [ValueB]
)
Run Code Online (Sandbox Code Playgroud)

[InverterData]表具有以下存储统计信息:

  • 数据空间:26,901.86 …

index sql-server-2008 sql-server execution-plan

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

是否有维护计划来检查我的数据库是否损坏?

有什么方法可以让维护计划在单个实例上检查我的所有数据库?保养计划Check Database Integrity Task够吗?

sql-server-2008 maintenance sql-server-2008-r2 corruption maintenance-plans

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

SQL Server 拒绝的筛选索引提示

我有一个 SQL Server 没有使用的筛选的非聚集索引。我很确定优化器正在做正确的选择,但我想强制它使用该索引运行,以便我可以比较计划并了解为什么它更昂贵。

我已经从查询中删除了所有内容,我只是选择了正在过滤的列。

索引定义:

CREATE INDEX idx_all
    ON tbl_test (CommentDateTime, name)
    INCLUDE (comment, CommentByType)
    WHERE CommentByType='INT';
Run Code Online (Sandbox Code Playgroud)

我试图运行的查询是:

SELECT CommentByType
FROM tbl_test WITH (INDEX (idx_all))
WHERE CommentByType='INT';
Run Code Online (Sandbox Code Playgroud)

并且 SQL Server 返回以下错误:

Query processor could not produce a query plan because of the hints defined in this query.
Resubmit the query without specifying any hints and without using SET FORCEPLAN.
Run Code Online (Sandbox Code Playgroud)

我已经阅读了很多关于被过滤的列被包含在键中或作为包含列的信息,但没有任何帮助。

在此处输入图片说明

sql-server-2008 sql-server filtered-index

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

sys.index_columns 中的索引列与索引中的不同

当我运行以下命令时,我得到 3 个索引列:

SELECT b.name,
       c.name
FROM sys.index_columns a
INNER JOIN sys.indexes b ON a.object_id = b.object_id
AND a.index_id = b.index_id
INNER JOIN sys.columns c ON b.object_id = c.object_id
AND a.column_id = c.column_id
WHERE b.object_id = OBJECT_ID('dbo.MyTableIssue')
  AND b.name = 'IX_MyTableIssue_ColId_Col2Id'
Run Code Online (Sandbox Code Playgroud)

返回:

IX_MyTableIssue_ColId_Col2Id    ColId 
IX_MyTableIssue_ColId_Col2Id    Col2Id
IX_MyTableIssue_ColId_Col2Id    ColDate
Run Code Online (Sandbox Code Playgroud)

但是当我右键单击,脚本索引然后创建到新的查询窗口时,我得到以下信息:

CREATE NONCLUSTERED INDEX [IX_MyTableIssue_ColId_Col2Id] ON [dbo].[MyTableIssue]
(
    [ColId] ASC,
    [Col2Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

不同频率表之间的连接

假设我有两个表DailyTableQuarterlyTable,每个表都有 3 列:IDDateValue

顾名思义,DailyTable存储数据的频率是每天,而QuarterlyTable存储数据的频率是季度。

如何连接这两个表,以便根据IDDate 将每个表中的最新(时间点)数据结合起来获得每日结果?

每日表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |     10    |
    1    |1/2/2010 |     15    |
              ... 
    1    |3/1/2010 |     20    |
              ... 
    1    |4/1/2010 |     30    |
Run Code Online (Sandbox Code Playgroud)

季表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |   1000    |
    1    |4/1/2010 |   2000    |
              ... 
Run Code Online (Sandbox Code Playgroud)

结果

    ID   |  Date   |    Value  | …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 join sql-server greatest-n-per-group

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

SQL Server 从 2008R2 升级到 SQL Server 2014 后出现超时错误

我们的数据库有一个 SQL Server 2008R2 企业版来支持前端应用程序。我们以前从未遇到过超时问题。最近,该公司决定将数据库升级到 SQL Server 2014 企业版,其中 2 个节点始终处于群集设置。新服务器比旧服务器具有更好的 CPU、内存。

升级后我做了所有必要的修改,检查数据库一致性,运行 DBCC UPDATEUSAGE,更新统计信息,重建索引,重新编译存储过程等等。数据库切换和迁移一切顺利。但是,我们的用户开始抱怨超时问题。

我一直在查看不同的文章、博客文章并进行了一些修改,例如更改连接字符串和添加 MultiSubnetFailover = 'True',这似乎有很大帮助并最大限度地减少了超时频率,但问题仍然存在。有谁知道是什么导致了这个问题以及如何解决它?我非常感谢您提出的解决此问题的建议和建议。

sql-server-2008 php availability-groups sql-server-2014 timeout

3
推荐指数
2
解决办法
1943
查看次数

确定逻辑/物理读取的总数

我正在使用循环优化包含一些业务逻辑的 SP。我已经删除了循环并将这些代码段转换为一些简单的插入/更新语句。

现在我必须进行基准测试并在执行时间和逻辑/物理读取方面比较新旧代码。

我的问题是由于旧代码中的循环,我如何确定逻辑/物理读取的总数是多少。因为在 SSMS 中,我可以看到数以千计的 IO stats 语句,例如:

“表‘员工’。扫描计数 1,逻辑读取 3,物理读取 0,预读读取 0,lob 逻辑读取 43,lob 物理读取 0,lob 预读读取 0。”

sql-server-2008 sql-server

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

SQL Server 2008 重建索引/重建

我应该在我的数据库启动并运行时重新索引/重建还是应该将其脱机?此外,在进行了一些挖掘之后,我发现这篇文章建议在 40% 碎片后重建和在 10% 到 40% 之间重建索引。任何人都可以验证这一点吗?我的数据库很大并且越来越慢。

sql-server-2008 sql-server

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

PRIMARY KEY 约束(带有 NONCLUSTERED INDEX)可以只检查某些值吗?

我可以设置一个(逻辑)PRIMARY KEY 约束,由(物理)NONCLUSTERED INDEX 提供服务,以便它只检查相关表中受约束和索引列另一列的某些值?

并且,如果是这样,该列是否可以建立为从其他表引用的 FOREIGN KEY 约束?

我试图基本上看看我是否可以从表中删除某些行而不从表中删除这些行,但仍然强制执行关系,例如:

  • IDs > 1000, 或者
  • CreatedDateTime > RemovalDate.

例如,你可以有这样的约束:

ALTER TABLE MyTable WITH NOCHECK ADD 
    CONSTRAINT PK_MyTable CHECK (Id > 1000)
Run Code Online (Sandbox Code Playgroud)

但是您将如何将此列设置为用 NONCLUSTERED INDEX 固定的 PRIMARY KEY 呢?

我可以做类似以下定义的事情吗:

ALTER TABLE MyTable WITH NOCHECK ADD 
    CONSTRAINT PK_MyTable CHECK (CreatedOn > '01/01/2010')
Run Code Online (Sandbox Code Playgroud)

但是对于名为Id?的列有一个 INDEX

sql-server-2008 database-design sql-server nonclustered-index check-constraints

3
推荐指数
2
解决办法
772
查看次数

在多行中使用“IN”?

所以我得到了一个带有一大堆连接的查询,它返回一行,像这样(只是一个例子):

select t1.chickenId, t2.beefId, t3.fishId from Food f
join t1 on t1.id = f.id
join t2 on t2.id = f.id
join t3 on t3.id = f.id
where f = 'something' 
Run Code Online (Sandbox Code Playgroud)

结果是这样的,例如:

chickenId | beefId | fishId
5          58         14
Run Code Online (Sandbox Code Playgroud)

现在我不知道该怎么做的部分......使用上面的查询的原因是因为我想使用结果在另一个表中找到一些东西。

我有另一个名为“Extras”的表,我希望该表中的行具有来自上一个查询的任何列的 ID。因此,如果 id 5、58 或 14 在 Extras 表中,我想要这些行。

以下查询不正确,但我相信它可以用来演示我想要实现的目标:

select * from Extras where extra = 'Potatoes' and foodId in (select t1.chickenId, t2.beefId, t3.fishId from Food f
    join t1 on t1.id = f.id
    join t2 on t2.id = f.id …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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