У меня есть запрос, что-то вроде этого. У него есть план выполнения с использованием индекса, который я ожидаю, до тех пор, пока количество данных (то есть количество символов), возвращаемых SELECT, не превысит границу. В этот момент план больше не использует индекс, и запрос становится в 100+ раз медленнее.
Если я использую NVARCHAR(203)
, это быстро. NVARCHAR(204)
медленный. Кроме того, когда он не использует индекс, он полностью сжигает ЦП. По крайней мере, мне кажется, что это проблема размера данных, но я ищу любую информацию.
Я изменил 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
Хороший:
Плохо:
<br>
) во фрагменты кода. Прочтите справку по редактированию, прежде чем задавать вопрос. - person Himanshu Jansari   schedule 24.08.2012