我有一个这样的查询。它有一个使用我期望的索引的执行计划,直到 SELECT 返回的数据量(即字符数)超过边界。那时,计划不再使用索引,查询速度慢了 100 多倍。
如果我使用NVARCHAR(203)
,它很快。NVARCHAR(204)
是缓慢的。此外,当它不使用索引时,它会完全烧毁 CPU。至少在我看来这是一个数据大小问题,但我正在寻找任何见解。
我已将 oldValueString 和 newValueString 更改为 NVARCHAR(255) 并且情况有所好转,但我仍然无法查询所有列而不会丢失计划中的索引。
SELECT
[Lx_AuditColumn].[auditColumnPK],
CONVERT(NVARCHAR(204), [Lx_AuditColumn].[newValueString])
FROM
[dbo].[Lx_AuditColumn] [Lx_AuditColumn],
[dbo].[Lx_AuditTable] [Lx_AuditTable]
WHERE
[Lx_AuditColumn].[auditTableFK] = [Lx_AuditTable].[auditTablePK]
AND
[Lx_AuditTable].[createdDate] >= @P1
AND
[Lx_AuditTable].[createdDate] <= @P2
ORDER BY
[Lx_AuditColumn].[auditColumnPK] DESC
这是表的基本结构(我消除了一些索引和 FK 约束)。
CREATE TABLE [dbo].[Lx_AuditTable]
(
[auditTablePK] [int] NOT NULL IDENTITY(1, 1) ,
[firmFK] [int] NOT NULL ,
[auditMasterFK] [int] NOT NULL ,
[codeSQLTableFK] [int] NOT NULL ,
[objectFK] [int] NOT NULL ,
[projectEntityID] [int] NULL ,
[createdByFK] [int] NOT NULL ,
[createdDate] [datetime] NOT NULL ,
CONSTRAINT [Lx_PK_AuditTable_auditTablePK] PRIMARY KEY CLUSTERED
(
[auditTablePK]
) WITH FILLFACTOR = 90
)
GO
CREATE INDEX [Lx_IX_AuditTable_createdDatefirmFK]
ON [dbo].[Lx_AuditTable]([createdDate], [firmFK])
INCLUDE ([auditTablePK], [auditMasterFK])
WITH (FILLFACTOR = 90, ONLINE = OFF)
GO
CREATE TABLE [dbo].[Lx_AuditColumn]
(
[auditColumnPK] [int] NOT NULL IDENTITY(1, 1) ,
[firmFK] [int] NOT NULL ,
[auditTableFK] [int] NOT NULL ,
[accessorName] [nvarchar] (100) NOT NULL ,
[dataType] [nvarchar] (20) NOT NULL ,
[oldValueNumber] [int] NULL ,
[oldValueString] [nvarchar] (4000) NULL ,
[newValueNumber] [int] NULL ,
[newValueString] [nvarchar] (4000) NULL ,
[newValueText] [ntext] NULL ,
CONSTRAINT [Lx_PK_AuditColumn_auditColumnPK] PRIMARY KEY CLUSTERED
(
[auditColumnPK]
) WITH FILLFACTOR = 90 ,
CONSTRAINT [Lx_FK_AuditColumn_auditTableFK] FOREIGN KEY
(
[auditTableFK]
) REFERENCES [dbo].[Lx_AuditTable] (
[auditTablePK]
)
)
GO
CREATE INDEX [Lx_IX_AuditColumn_auditTableFK]
ON [dbo].[Lx_AuditColumn]([auditTableFK])
WITH (FILLFACTOR = 90, ONLINE = OFF)
GO
好的:
坏的: