- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Possible Duplicate:
ORDER BY suddenly conflicting with VARCHAR concatenation in TSQL
最近,我发现在一张表中创建聚集索引,这个聚集索引改变了动态SQL语句的结果。当表有聚集索引时,该语句仅返回最后一个归档结果。从表中删除聚集索引或删除“ORDER BY fieldnumber”,将返回完整结果(15 个字段)。行为的变化是由聚集索引与替换调用以及示例语句中的 order by 和 k 声明为 1000 vs max 引起的。
聚集索引是否可以更改动态 SQL 语句行为并返回不同的结果或其他我不知道的内容?欢迎大家提出意见!
--创建测试表
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[test](
[companyid] [int] NOT NULL,
[fieldName] [nvarchar](50) NOT NULL,
[fieldnumber] [tinyint] NOT NULL,
[Tagname] [nvarchar](15) NULL
) ON [PRIMARY]
GO
--插入测试数据
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Employee Status', 1, N'<CHARACTER_1>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Admin Grouping', 2, N'<CHARACTER_2>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Department Code', 3, N'<CHARACTER_3>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Job Code', 4, N'<CHARACTER_4>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'FLSA - Exempt', 5, N'<CHARACTER_5>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 06', 6, N'<CHARACTER_6>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 07', 7, N'<CHARACTER_7>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 08', 8, N'<CHARACTER_8>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 09', 9, N'<CHARACTER_9>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Action Field 10', 10, N'<CHARACTER_10>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'ProcessLevel', 11, N'<CHARACTER_11>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Department Name', 12, N'<CHARACTER_12>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Job Title', 13, N'<CHARACTER_13>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Information Field 04', 14, N'<CHARACTER_14>')
INSERT [dbo].[test] ([companyid], [fieldName], [fieldnumber], [Tagname]) VALUES (1, N'Information Field 05', 15, N'<CHARACTER_15>')
go
--测试脚本
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_without_index
go
--创建一个聚集索引来测试上面的脚本
CREATE CLUSTERED INDEX [ix-test] ON [dbo].[test]
(
[CompanyID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
-- 使用 nvarchar(1000) 测试聚集索引的行为变化的测试脚本
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_clustered_index_varchar1000_combine
go
-- 使用 nvarchar(max) 测试行为在 nvarchar(max) 下没有变化的测试脚本 与聚集索引结合
declare @k nvarchar(Max) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_clustered_index_and_varcharMax__combine
go
--删除聚集索引
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND name = N'ix-test')
DROP INDEX [ix-test] ON [dbo].[test] WITH ( ONLINE = OFF )
GO
--然后创建非聚集索引
USE [test]
GO
CREATE NONCLUSTERED INDEX [ix_test] ON [dbo].[test]
(
[companyid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
-- 测试脚本,使用 nvarchar(100) 测试 nvarchar(100) 与非聚集索引结合使用时行为没有变化
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ',' FROM test WITH (NOLOCK)
WHERE CompanyID = 1 ORDER BY fieldnumber
select @k as test_result_with_nonClustered_index_and_varchar1000_combine
go
最佳答案
此查询从未保证有效。创建聚集索引后的查询计划如下所示。
使用 FOR XML(解决方法和正确方法)可以保证订单,因为它始终在查询正确完成后进行处理。但是,通过 @var concat 查询,SQL Server 可以根据需要自由优化查询。
在这里您可以看到 SELECT 语句的串联是在排序之前完成的,因此可以按任何顺序串联行,返回的不一定是最长的(最终的)。
我更喜欢显示表达式的文本计划,所以这里是:
StmtText
---------------------------------------------------------------------------------------------------------------------------------------------
|--Sort(ORDER BY:([test].[dbo].[test].[fieldnumber] ASC))
|--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(nvarchar(1000),([@k]+[Expr1006])+N',',0)))
|--Compute Scalar(DEFINE:([Expr1006]=replace(replace([test].[dbo].[test].[Tagname],N'<',N''),N'>',N'')))
|--Clustered Index Seek(OBJECT:([test].[dbo].[test].[ix-test]), SEEK:([test].[dbo].[test].[companyid]=(1)) ORDERED FORWARD)
REPLACE x2 和 CONCAT 操作被放在一起,表面上是为了性能。
但是,如果您将查询更改为
declare @k nvarchar(1000) --–-or max
set @k = ''
SELECT @k = @k + REPLACE(REPLACE(TagName,'<',''),'>','') + ','
FROM (
select TOP(100) TagName, fieldnumber
from test WITH (NOLOCK)
WHERE CompanyID = 1
order by fieldnumber
) X
order by fieldnumber
select @k as test_result_with_clustered_index_varchar1000_combine
您可以看到,在执行 CONCAT 之前,SQL Server 被迫在子查询中进行排序。 注意: TOP 100 PERCENT
不起作用,因为它已经被优化掉了,但是 TOP(N) 可以起作用,其中 N 大于表中的记录数。然而,正确的解决方案是使用 FOR XML。
StmtText
---------------------------------------------------------------------------------------------------------------------------------------------
|--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(nvarchar(1000),([@k]+[Expr1006])+N',',0)))
|--Sort(TOP 100, ORDER BY:([test].[dbo].[test].[fieldnumber] ASC))
|--Compute Scalar(DEFINE:([Expr1006]=replace(replace([test].[dbo].[test].[Tagname],N'<',N''),N'>',N'')))
|--Clustered Index Seek(OBJECT:([test].[dbo].[test].[ix-test]), SEEK:([test].[dbo].[test].[companyid]=(1)) ORDERED FORWARD)
关于sql-server - 聚集索引可以改变动态SQL语句的行为并返回不同的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13022079/
我想沿着一个轴从特定位置的X数组中分散并收集元素。 因此,给定一个索引数组idx,我想选择第0列的idx(0) th元素,第1列的idx(1) th元素,等等。 在Numpy中,以下语句: X = n
我有一个在集群硬件中运行的 Java 应用程序。我使用 Hashmap 作为缓存。我也希望缓存能够集群。有没有一些开源java项目可以在两台连接的机器上同步Hashmap? 最佳答案 看看 Hazel
这个问题在这里已经有了答案: Count number of times that an item occurred in each of multiple columns (4 个答案) 关闭 5
我一直在尝试“组合”一个列表 I mean putting items together depending on the item inbetween, so ['d','-','g','p','q
非聚集文件存储在数据文件中,聚集索引按逻辑索引顺序存储数据。 逻辑顺序位于哪里? 最佳答案 大多数 MySQL 索引的结构为 BTree。 (参见维基百科) (我在此讨论中排除了 FULLTEXT 和
所有源和目标都位于不可缓存的内存中。毫无疑问。在启动 DMA(即分散-聚集 DMA)之前,我构建了 DMA 链表(包含 src、dest、size 和 next)。我想我不必将列表放入不可缓存的内存中
我需要将输入字符串拆分为输出字符串(按一定顺序)通过在输入字符串上应用一组正则表达式。我想实现这个功能与 akka Actor 集群一起使用,我将其分散正则表达式和输入字符串并收集字符串。不过我想知道
Windows 文件系统支持scatter/gather IO .(当然,其他平台也可以) 但是不知道什么时候用IO机制。 你能给我解释一个合适的案例吗? 使用I/O机制我们能得到什么好处?(只是一点
我正在尝试使用克隆调用两个端点并收集它们的信息以通过聚合发送,我必须将其与分散收集中介器一起使用。每个端点返回一个 json 字符串。但我一直遇到“期望 SOAP Envelope 的实现作为父级”错
我想要实现的目标是使用户空间中的内存块可以通过 PCIe 直接由 FPGA 板中的 DMA 内核访问(不受内核的任何干扰)。 为此,我在用户空间中使用 posix_memalign() 在用户空间中分
假设我有以下数据框: > a a Source: local data frame [3 x 2] my_type_1_num_widgets my_type_2_num_widgets 1
我已经搜索了一段时间,但似乎无法在文档或 SO 上找到任何有用的信息。 This question并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 语言编写。 我有一些代码进行间接访问,我想对
我已经坚持了一段时间了。我的代码基于 https://webrtc.org/getting-started/firebase-rtc-codelab .我基本上只是将其更改为 React 和 fire
我可以合并 Mono> 的列表吗?数据源整合为单个Mono>包含所有项目而不阻塞? 在我的带有 Lombok 分散收集应用程序的 JDK 9 Spring Boot 2 中,此阻塞版本有效:
我是一名优秀的程序员,十分优秀!