我有一个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]表具有以下存储统计信息:
有什么方法可以让维护计划在单个实例上检查我的所有数据库?保养计划Check Database Integrity Task够吗?
sql-server-2008 maintenance sql-server-2008-r2 corruption maintenance-plans
我有一个 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)
我已经阅读了很多关于被过滤的列被包含在键中或作为包含列的信息,但没有任何帮助。
当我运行以下命令时,我得到 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) 假设我有两个表DailyTable和QuarterlyTable,每个表都有 3 列:ID、Date和Value。
顾名思义,DailyTable存储数据的频率是每天,而QuarterlyTable存储数据的频率是季度。
如何连接这两个表,以便根据ID和Date 将每个表中的最新(时间点)数据结合起来获得每日结果?
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 2008R2 企业版来支持前端应用程序。我们以前从未遇到过超时问题。最近,该公司决定将数据库升级到 SQL Server 2014 企业版,其中 2 个节点始终处于群集设置。新服务器比旧服务器具有更好的 CPU、内存。
升级后我做了所有必要的修改,检查数据库一致性,运行 DBCC UPDATEUSAGE,更新统计信息,重建索引,重新编译存储过程等等。数据库切换和迁移一切顺利。但是,我们的用户开始抱怨超时问题。
我一直在查看不同的文章、博客文章并进行了一些修改,例如更改连接字符串和添加 MultiSubnetFailover = 'True',这似乎有很大帮助并最大限度地减少了超时频率,但问题仍然存在。有谁知道是什么导致了这个问题以及如何解决它?我非常感谢您提出的解决此问题的建议和建议。
sql-server-2008 php availability-groups sql-server-2014 timeout
我正在使用循环优化包含一些业务逻辑的 SP。我已经删除了循环并将这些代码段转换为一些简单的插入/更新语句。
现在我必须进行基准测试并在执行时间和逻辑/物理读取方面比较新旧代码。
我的问题是由于旧代码中的循环,我如何确定逻辑/物理读取的总数是多少。因为在 SSMS 中,我可以看到数以千计的 IO stats 语句,例如:
“表‘员工’。扫描计数 1,逻辑读取 3,物理读取 0,预读读取 0,lob 逻辑读取 43,lob 物理读取 0,lob 预读读取 0。”
我应该在我的数据库启动并运行时重新索引/重建还是应该将其脱机?此外,在进行了一些挖掘之后,我发现这篇文章建议在 40% 碎片后重建和在 10% 到 40% 之间重建索引。任何人都可以验证这一点吗?我的数据库很大并且越来越慢。
我可以设置一个(逻辑)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
所以我得到了一个带有一大堆连接的查询,它返回一行,像这样(只是一个例子):
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 ×10
sql-server ×8
corruption ×1
index ×1
join ×1
maintenance ×1
php ×1
timeout ×1