[英]Why a subselect filter fails after a columnstore index deploy?
我在一个巨大的表上部署了一个列存储索引,整体性能提升非常显着,但是一个包含 where id in (subselect) 过滤的报告开始因数据类型不匹配而失败。 我检查了数据类型,错误消息没有任何意义。 当我回滚新索引时,查询运行没有任何错误。 玩了一下,发现如果我将 where -subselect 翻转为带有 string_split 的连接,它可以与索引一起使用。
你有没有经历过类似的事情?
先感谢您!
正如评论中提到的其他人,您必须在导致问题的数据中某处进行隐式转换。 需要显式转换数据并相应地处理异常
/*Raw data*/
DROP TABLE IF EXISTS #Test
CREATE TABLE #Test (ID INT IDENTITY(1,1) PRIMARY KEY, Val Varchar(100))
INSERT INTO #Test VALUES ('1'),('2'),('A')
/*Example of how index might "break" code aka expose implicit conversion issue*/
/*This select works*/
CREATE INDEX ix on #Test(Val)
SELECT TOP (1) * FROM #Test WITH (INDEX (ix)) WHERE Val = 2 /*Implicitly casts Val to int*/
/*Change index and run same query, it now tries to cast 'A' and breaks*/
CREATE INDEX ix on #Test(Val DESC) WITH (DROP_EXISTING = ON )
SELECT TOP (1) * FROM #Test WITH (INDEX (ix)) WHERE Val = 2
/*Need to explicitly cast so data types match*/
/*Can cast the search parameter (generally most performant as it allows use of indexes on source data)*/
SELECT TOP (1) * FROM #Test WHERE Val = Cast(2 AS Varchar(100)) /*Explicitly cast the parameter*/
/*Or use TRY_CAST to cast the source data. Might be needed if you have formatted data in the Val column*/
SELECT TOP (1) * FROM #Test WHERE TRY_CAST(Val AS INT) = 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.