相关疑难解决方法(0)

对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

我有一个表,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)

sql sql-server indexing count

9
推荐指数
1
解决办法
679
查看次数

为什么 Linq To Entities 创建未优化的查询

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)

sql-server entity-framework entity-framework-core

1
推荐指数
1
解决办法
248
查看次数