我有一个空间索引用于该DBCC CHECKDB
报告损坏:
DBCC CHECKDB(MyDB)
WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS
Run Code Online (Sandbox Code Playgroud)
空间索引、XML 索引或索引视图“sys.extended_index_xxx_384000”(对象 ID xxx)不包含视图定义生成的所有行。这不一定表示此数据库中的数据存在完整性问题。
空间索引、XML 索引或索引视图“sys.extended_index_xxx_384000”(对象 ID xxx)包含不是由视图定义生成的行。这不一定表示此数据库中的数据存在完整性问题。
CHECKDB 在表“sys.extended_index_xxx_384000”(对象 ID xxx)中发现 0 个分配错误和 2 个一致性错误。
维修级别为repair_rebuild
.
删除并重新创建索引不会删除这些损坏报告。没有EXTENDED_LOGICAL_CHECKS
但有DATA_PURITY
错误是不报告的。
此外,CHECKTABLE
尽管它的 CI 大小为 30 MB 并且有大约 30k 行,但该表需要 45 分钟。该表中的所有数据都是点geography
数据。
在任何情况下都会出现这种行为吗?它说“这不一定代表完整性问题”。我应该做些什么?CHECKDB
正在失败这是一个问题。
此脚本重现了该问题:
CREATE TABLE dbo.Cities(
ID int NOT NULL,
Position geography NULL,
CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED
(
ID ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = …
Run Code Online (Sandbox Code Playgroud) 正常的JOIN ... ON ...
语法是众所周知的。但也可以将ON
子句JOIN
与其对应的分开放置。这在实践中很少见,在教程中找不到,我也没有找到任何网络资源甚至提到这是可能的。
这是一个可以玩的脚本:
SELECT *
INTO #widgets1
FROM (VALUES (1), (2), (3)) x(WidgetID)
SELECT *
INTO #widgets2
FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue)
SELECT *
INTO #widgetProperties
FROM (VALUES
(1, 'a'), (1, 'b'),
(2, 'a'), (2, 'b'))
x(WidgetID, PropertyName)
--q1
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 ON w2.WidgetID = w1.WidgetID
LEFT JOIN #widgetProperties wp ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = …
Run Code Online (Sandbox Code Playgroud) 我有以下形式的查询:
SELECT ...
FROM ColumnstoreTable cs
CROSS APPLY (
SELECT *
FROM (VALUES
('A', cs.DataA)
, ('B', cs.DataB)
, ('C', cs.DataC)
) x(Col0, Col1)
) someValues
Run Code Online (Sandbox Code Playgroud)
这从 Columnstore 支持的子查询 ( ColumnstoreTable
) 中获取每一行并将这些行相乘。这本质上是一个UNPIVOT
. 真正的查询比这更大。这部分查询会进入其他处理。
这里的问题是这CROSS APPLY
是作为一个循环连接实现的,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。
这部分查询对性能非常关键,我怀疑以批处理模式运行它可能对性能非常有益。
我怎样才能重写这个查询,这样我就不会退出批处理模式?
我确实尝试使用临时表而不是VALUES
,但这并没有改变这样一个事实,即没有相等连接条件来进行哈希连接。
我了解到 SQL Server 可以使用伪列返回表的(单个)标识列的值$IDENTITY
:
SELECT $IDENTITY FROM Table
Run Code Online (Sandbox Code Playgroud)
此功能是否有文档记录且可靠?唯一的官方提及是在IDENTITY
页面上,但它隐藏在代码示例中。这表明它可能是未记录的。与此功能匹配的 Google 也非常少。
在我的开发机器上,我的 SQL Server 配置了很高的最大内存量(8GB 的 16GB)。这是许多开发任务所必需的。
不过,有时我想找回我的记忆。我不想永久消耗 8GB。
让 SQL Server 突然将所有内存释放给操作系统的好方法是什么?
DBCC DROPCLEANBUFFERS
不这样做。它只是将干净的缓冲区标记为可用。
重新启动 SQL Server 是一个问题,因为由于此错误/功能,这会导致运行 1 分钟的数据库恢复:停止 SQL Server 服务会导致数据库无法完全关闭(请为该连接项投票;似乎是一个严重的错误) .
一个CHECKDB
运行报告腐败sys.extended_index_1066482673_384000
。名称模式代表什么样的索引sys.extended_index_...
?消息是:
空间索引、XML 索引或索引视图“sys.extended_index_1066482673_384000”(对象 ID ...)不包含视图定义生成的所有行。这不一定表示此数据库中的数据存在完整性问题。有关解决空间索引、XML 索引和索引视图上的 DBCC 错误的详细信息,请参阅 SQL Server 联机丛书。
我的桌子看起来像这样:
GroupID INT NOT NULL
SomeValue INT NOT NULL
Run Code Online (Sandbox Code Playgroud)
我想GroupID
在结果集中保持相同的行。不过,这些组本身应该是随机排序的。SomeValue
应该是次要排序标准。像这样:
GroupID, SomeValue
13, 1
13, 2
7, 1
7, 2
11, 1
11, 2
...
Run Code Online (Sandbox Code Playgroud)
ORDER BY GroupID, SomeValue
不会随机排序组。ORDERBY NEWID()
是完全随机的。ORDER BY SomeHash(GroupID), SomeValue
浮现在脑海中,但我每次都需要一个新的随机顺序。
如何才能做到这一点?
我正在使用一个执行表单查询的 ORM:
SELECT Columns
FROM T
WHERE Col LIKE @p0 ESCAPE '~'
Run Code Online (Sandbox Code Playgroud)
Col
已编入索引且索引正在覆盖。谓词非常有选择性。这些表有 500,000 行。
我总是在查询字符串前缀(例如'prefix%'
)。显然,这里的 SQL Server 不是静态知道的。但我知道 SQL Server 基本上能够根据LIKE
带有前缀的模式进行查找。
我希望 SQL Server 在执行时发现要扫描的索引的相关范围,并且只扫描该范围。不过,我得到的执行计划有一个索引扫描。
ORM 不支持OPTION (RECOMPILE)
,我不确定它是否是一个不错的选择,因为查询在大约 20 毫秒内执行。(但是我希望这个查询更快。通过搜索,这应该能够在 ~1ms 内运行)。
我可以以某种方式让 SQL Server 在这里执行搜索吗?
为了节省许可成本,我正在评估是否可以使用 VLDB 的标准版。我将概述场景:
我想知道我需要企业版做什么。我不会从分区中获得任何好处,因为我不想切换分区或将它们放在不同的存储上。数据压缩可以为我们节省 50%,但我们使用廉价存储。与昂贵的许可证相比,节省的费用微不足道。
对于 HA,我不明白为什么我不能使用已弃用但仍在工作的镜像。这并不理想,但企业版要为不明确的好处付出高昂的代价。
尽管如此,在这里使用标准版还是让我感到紧张,因为它不是普遍推荐的,而且似乎有点冒险。寻求有关这种情况的一些建议。谢谢!
行版本控制为每行维护 14 个字节的内部版本控制信息。但这真的是每行的成本还是也适用于表中每个索引的成本?
似乎 14 个字节也必须添加到所有索引记录中,以便仅索引扫描(和其他仅索引访问)可以查看版本信息并感知数据的时间点快照。
不过,我在网上能找到的所有信息都只谈到每行 14 字节的开销。
sql-server ×10
batch-mode ×1
columnstore ×1
dbcc-checkdb ×1
identity ×1
license ×1
spatial ×1
t-sql ×1
unpivot ×1