我有一个表,VARCHAR上面有一列和一个索引。每当SELECT COUNT(*)对该表进行检查时,COLUMN = N'' OR COLUMN IS NULL都会返回双倍的行数。SELECT *使用相同的where子句将返回正确的记录数。
阅读本文后:https://sqlquantumleap.com/2017/07/10/impact-on-indexes-when-mixing-varchar-and-nvarchar-types/并做了一些测试,我相信列的排序规则和隐式转换不是错误(至少不是直接错误)。该列的排序规则是Latin1_General_CI_AS。
数据库在SQL Server 2012上,我也在2016上测试过。
我创建了一个测试脚本(如下)来演示这个问题。这样做,我相信它可能与数据分页有关,因为它需要表中的一些数据才能发生。
CREATE TABLE [dbo].TEMP
(
ID [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
[DATA] [varchar](200) COLLATE Latin1_General_CI_AS NULL,
[TESTCOLUMN] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_TEMP] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO
CREATE NONCLUSTERED INDEX [I_TEMP_TESTCOLUMN] ON dbo.TEMP (TESTCOLUMN ASC)
GO
DECLARE @ROWS AS INT = 40;
WITH NUMBERS (NUM) AS
(
SELECT 1 AS …Run Code Online (Sandbox Code Playgroud) EF 创建的查询使用索引扫描,而不是索引查找。通过稍微修改查询以不使用参数,而是使用索引查找。索引扫描大约需要三秒,而查找是即时的。
生成的查询(使用索引扫描):
exec sp_executesql N'SELECT TOP (1)
[Extent1].[phone_id] AS [phone_id],
[Extent1].[phone] AS [phone],
[Extent1].[high_usage_flag] AS [high_usage_flag],
[Extent1].[cds_flag] AS [cds_flag],
[Extent1].[never_call_flag] AS [never_call_flag],
[Extent1].[pa_state_dnc_flag] AS [pa_state_dnc_flag],
[Extent1].[ma_state_dnc_flag] AS [ma_state_dnc_flag],
[Extent1].[national_dnc_flag] AS [national_dnc_flag],
[Extent1].[note] AS [note],
[Extent1].[pec_never_call_flag] AS [pec_never_call_flag],
[Extent1].[nicor_dnc_flag] AS [nicor_dnc_flag],
[Extent1].[css_vici_flag] AS [css_vici_flag],
[Extent1].[css_pec_flag] AS [css_pec_flag],
[Extent1].[css_vici_alt_flag] AS [css_vici_alt_flag],
[Extent1].[area_code] AS [area_code],
[Extent1].[phone_type_id] AS [phone_type_id],
[Extent1].[last_answer_date] AS [last_answer_date],
[Extent1].[csr_bad_flag] AS [csr_bad_flag],
[Extent1].[to_process_flag] AS [to_process_flag],
[Extent1].[deleted_date] AS [deleted_date],
[Extent1].[wireless_flag] AS [wireless_flag]
FROM [dbo].[phone] AS [Extent1]
WHERE [Extent1].[phone] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'555555555' …Run Code Online (Sandbox Code Playgroud)