Usando o exemplo abaixo, os predicados são os mesmos, no entanto, a instrução superior (corretamente) retorna 0 linhas, a instrução inferior retorna 1 - mesmo que os predicados NÃO correspondam:
declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ'
declare @tableId int = null
declare @total decimal(10, 2) = 5.17
SELECT 1
FROM
[dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All]))
WHERE
Barcode = @barcode
AND StatusID = 1
AND TableID = @tableID
AND @total <= Total
SELECT 1
FROM
[dbo].[transaction]
WHERE
Barcode = @barcode
AND StatusID = 1
AND TableID = @tableID
AND @total <= Total
Por que isso pode estar acontecendo?
Mais informações:
- O índice não clusterizado na instrução superior NÃO é filtrado
- CheckDB retorna 0 questões
- Versão do servidor:
Microsoft SQL Azure (RTM) - 12.0.2000.8 Dec 19 2018 08:43:17 Copyright (C) 2018 Microsoft Corporation
Cole o link do plano:
https://www.brentozar.com/pastetheplan/?id=S1w_rU68E
Mais informações:
Foram executados, o dbcc checktable ([transaction]) with all_errormsgs, extended_logical_checks, data_purity
que indica que não há problemas.
Posso reproduzir de maneira confiável o problema nessa tabela ao restaurar um backup desse banco de dados.
sql-server
azure-sql-database
columnstore
Uberzen1
fonte
fonte
Respostas:
Este bug não requer a remoção ou renomeação de colunas.
Você também verá o mesmo comportamento para o
statusId = 100
qual nunca esteve presente em nenhuma versão da coluna.Exigências
Exemplo
Qualquer um dos seguintes procedimentos evitará o erro:
= NULL
db <> demo de violino .
Este bug foi corrigido no CU15 para SQL Server 2017 (e CU7 para SQL Server 2016 SP2):
CORRECÇÃO: A consulta em uma tabela com o índice columnstore clusterizado e o índice rowstore não clusterizado pode retornar resultados incorretos no SQL Server 2016 e 2017
fonte
Este é um erro no SQL Server. Se uma coluna é excluída de uma tabela com um índice columnstore clusterizado e, em seguida, uma nova coluna é adicionada com o mesmo nome, ela parece estar usando a coluna excluída antiga para o predicado. Aqui está o MVCE:
Esse script começa com
10000
linhas comstatusId
of1
estatusId2
of5
- depois solta astatusID
coluna e renomeiastatusId2
parastatusId
. Portanto, no final, todas as linhas devem ter umstatusId
de 5.Mas a consulta a seguir atinge o índice não agrupado ...
... e retorna
2
linhas (com o selecionadostatusId
diferente do implícito naWHERE
cláusula) ...... enquanto este acessa o columnstore e retorna corretamente
0
MVCE
Também levantei um problema no portal de comentários do Azure :
E para qualquer pessoa que encontre isso, a reconstrução do Índice de armazenamento de colunas em cluster corrige o problema:
A reconstrução da CCI corrige apenas os dados existentes. Se novos registros forem adicionados, o problema surgirá novamente nesses registros; atualmente, a única correção conhecida para a tabela é recriá-la completamente.
fonte
and id2 = @id2
deve garantir zero linhas de qualquer maneira como@id2
énull
, mas você ainda obter o 2REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
o trabalho? Isso limpará o deltastore - o problema ainda ocorre para novas linhas adicionadas posteriormente a isso?Com base nos planos, parece que o índice Columnstore foi criado com SET ANSI_NULLS OFF. Tabelas e índices mantêm a configuração como era quando o índice foi criado. Você pode verificar criando um índice duplicado do Columnstore enquanto assegura que ANSI_NULLS está LIGADO, descartando o original ou desativando-o.
Mas, a menos que você tenha descoberto um bug do SQL Server, essa é a única maneira de os resultados acontecerem.
fonte