이것은 SQL Server의 버그입니다. 클러스터 된 columnstore 인덱스가있는 테이블에서 열을 삭제 한 다음 동일한 이름으로 새 열을 추가하면 술어에 대해 삭제 된 이전 열을 사용하는 것으로 나타납니다. MVCE는 다음과 같습니다.
이 스크립트와 함께 시작합니다 10000
과 행 statusId
의 1
와 statusId2
의 5
- 다음 떨어 statusID
컬럼 및 이름 변경 statusId2
에를 statusId
. 결국 모든 행은 statusId
5의 값을 가져야합니다 .
그러나 다음 쿼리는 클러스터되지 않은 인덱스에 도달합니다 ...
select *
from example
where statusId = 1
and total <= @filter
and barcode = @barcode
and id2 = @id2
... 2
(행이 statusId
암시 한 것과 다른 선택)을 반환합니다 WHERE
...
+-------+---------+------+-------+----------+
| id | barcode | id2 | total | statusId |
+-------+---------+------+-------+----------+
| 5 | 5 | NULL | 5.00 | 5 |
| 10005 | 5 | NULL | 5.00 | 5 |
+-------+---------+------+-------+----------+
... 이것은 columnstore에 액세스하고 올바르게 반환합니다. 0
select count(*)
from example
where statusId = 1
MVCE
/*Create table with clustered columnstore and non clustered rowstore*/
CREATE TABLE example
(
id INT IDENTITY(1, 1),
barcode CHAR(22),
id2 INT,
total DECIMAL(10,2),
statusId TINYINT,
statusId2 TINYINT,
INDEX cci_example CLUSTERED COLUMNSTORE,
INDEX ix_example (barcode, total)
);
/* Insert 10000 rows all with (statusId,statusId2) = (1,5) */
INSERT example
(barcode,
id2,
total,
statusId,
statusId2)
SELECT TOP (10000) barcode = row_number() OVER (ORDER BY @@spid),
id2 = NULL,
total = row_number() OVER (ORDER BY @@spid),
statusId = 1,
statusId2 = 5
FROM sys.all_columns c1, sys.all_columns c2;
ALTER TABLE example
DROP COLUMN statusid
/* Now have 10000 rows with statusId2 = 5 */
EXEC sys.sp_rename
@objname = N'dbo.example.statusId2',
@newname = 'statusId',
@objtype = 'COLUMN';
/* Now have 10000 rows with StatusID = 5 */
INSERT example
(barcode,
id2,
total,
statusId)
SELECT TOP (10000) barcode = row_number() OVER (ORDER BY @@spid),
id2 = NULL,
total = row_number() OVER (ORDER BY @@spid),
statusId = 5
FROM sys.all_columns c1, sys.all_columns c2;
/* Now have 20000 rows with StatusID = 5 */
DECLARE @filter DECIMAL = 5,
@barcode CHAR(22) = '5',
@id2 INT = NULL;
/*This returns 2 rows from the NCI*/
SELECT *
FROM example WITH (INDEX = ix_example)
WHERE statusId = 1
AND total <= @filter
AND barcode = @barcode
AND id2 = @id2;
/*This counts 0 rows from the Columnstore*/
SELECT COUNT(*)
FROM example
WHERE statusId = 1;
Azure 피드백 포털 에서도 문제가 발생했습니다 .
그리고이 문제가 발생하는 다른 사람들을 위해 Clustered Columnstore Index를 다시 작성하면 문제가 해결됩니다.
alter index cci_example on example rebuild
CCI를 재 구축하면 기존 데이터 만 수정됩니다. 새 레코드가 추가되면이 레코드에서 문제가 다시 발생합니다. 따라서 현재 테이블에 대해 알려진 유일한 수정은 테이블을 완전히 다시 작성하는 것입니다.