Bu SQL Server ile ilgili bir hatadır. Bir sütun, kümelenmiş bir sütun deposu dizinine sahip bir tablodan silinir ve ardından aynı ada sahip yeni bir sütun eklenirse, yüklem için eski, silinmiş sütunu kullanıyor gibi görünür. İşte MVCE:
Bu komut dosyası ile başlar 10000
olan satırlar statusId
arasında 1
ve statusId2
içinde 5
- o zaman düşer statusID
sütunu yeniden adlandırmaları statusId2
için statusId
. Sonuçta tüm satırlarda statusId
5 olmalıdır .
Ancak aşağıdaki sorgu kümelenmemiş dizine isabet ediyor ...
select *
from example
where statusId = 1
and total <= @filter
and barcode = @barcode
and id2 = @id2
... ve 2
satırları döndürür (seçili statusId
, WHERE
maddede belirtilenlerden farklı olarak ) ...
+-------+---------+------+-------+----------+
| id | barcode | id2 | total | statusId |
+-------+---------+------+-------+----------+
| 5 | 5 | NULL | 5.00 | 5 |
| 10005 | 5 | NULL | 5.00 | 5 |
+-------+---------+------+-------+----------+
... ancak bu sütun deposuna erişir ve doğru şekilde döner 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 geri bildirim portalında da bir sorunla karşılaştım :
Ve bununla karşılaşan herkes için, Kümelenmiş Sütun Deposu Dizini'nin yeniden oluşturulması sorunu giderir:
alter index cci_example on example rebuild
CCI'nin yeniden oluşturulması yalnızca mevcut verileri düzeltir. Yeni kayıtlar eklenirse, sorun yine bu kayıtlarda ortaya çıkar; şu anda tablo için bilinen tek düzeltme, tabloyu tamamen yeniden oluşturmaktır.