在我之前的一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列:
ALTER TABLE dbo.tblBGiftVoucherItem
ADD isUsGift AS CAST
(
ISNULL(
CASE WHEN sintMarketID = 2
AND strType = 'CARD'
AND strTier1 LIKE 'GG%'
THEN 1
ELSE 0
END
, 0)
AS BIT
) PERSISTED;
Run Code Online (Sandbox Code Playgroud)
计算列是PERSISTED
,并且根据计算列定义(Transact-SQL):
坚持
指定数据库引擎将计算值物理存储在表中,并在计算列所依赖的任何其他列更新时更新值。将计算列标记为 PERSISTED 允许在确定性但不精确的计算列上创建索引。有关更多信息,请参阅计算列上的索引。任何用作分区表的分区列的计算列都必须显式标记为 PERSISTED。当指定 PERSISTED 时,computed_column_expression 必须是确定性的。
但是当我尝试在我的列上创建索引时,我收到以下错误:
CREATE INDEX FIX_tblBGiftVoucherItem_incl
ON dbo.tblBGiftVoucherItem (strItemNo)
INCLUDE (strTier3)
WHERE isUsGift = 1;
Run Code Online (Sandbox Code Playgroud)
无法在表 'dbo.tblBGiftVoucherItem' 上创建过滤索引 'FIX_tblBGiftVoucherItem_incl',因为过滤器表达式中的列 'isUsGift' 是计算列。重写过滤器表达式,使其不包含此列。
如何在计算列上创建过滤索引?
或者
有替代的解决方案吗?
index sql-server filtered-index sql-server-2014 computed-column
我有一个包含连接几个表的查询的过程,但我遇到了一些性能问题。
主表(这是一个巨大的表)有一个 PK 和一些 NC 索引。
CREATE TABLE [dbo].[TableA]
(
[TableAID] [bigint] NOT NULL,
[UserID] [int] NOT NULL,
[IP1] [tinyint] NOT NULL,
[IP2] [tinyint] NOT NULL,
[IP3] [tinyint] NOT NULL,
[IP4] [tinyint] NOT NULL
CONSTRAINT [PK_TableA]
PRIMARY KEY CLUSTERED ([TableAID] ASC)
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [idx_1] ON [dbo].[TableA]
(
[UserID] ASC
)
CREATE NONCLUSTERED INDEX [idx_2] ON [dbo].[TableA]
(
[IP1] ASC,
[IP2] ASC,
[IP3] ASC,
[IP4] ASC
)
Run Code Online (Sandbox Code Playgroud)
这是性能不佳的查询:
SELECT DISTINCT a.UserID, a.IP1, a.IP2, a.IP3, a.IP4
FROM [dbo].[TableA] …
Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 sql-server index-tuning query-performance
我看了一下这个问题:
表达式中的类型转换可能会影响查询计划选择中的“CardinalityEstimate”?
但这与整理有关,而不是与计算列有关。
我在下面的查询中使用了以下表定义,它给了我一个查询提示
表达式中的类型转换 (CONVERT(varchar(10),[t].[FLTCD_FLT_DATE],112)) 可能会影响查询计划选择中的“CardinalityEstimate”
请注意计算列 flightReference
CREATE TABLE [dbo].[repl_Transportation] (
[FLIGHT#] INT NOT NULL,
[FLTCD_FLT_DATE] DATETIME NULL,
[FLTCD_DEP_GATE] CHAR(3) NULL,
[FLTCD_ARR_GATE] CHAR(3) NULL,
[FLTCD_SEQUENCE] CHAR(1) NULL,
[DIRECTION] CHAR(1) NULL,
[PNR_NUMBERS] VARCHAR(70) NULL,
[HK] NUMERIC(3,0) NULL,
[Create_Date] DATETIME NOT NULL,
[Modify_Date] DATETIME NULL,
[flightReference] AS (substring(((CONVERT([varchar](10),[FLTCD_FLT_DATE],
(112))+[FLTCD_DEP_GATE])+[FLTCD_ARR_GATE])+[FLTCD_SEQUENCE],(3),(13))) PERSISTED,
CONSTRAINT [PK_FLIGHT#] PRIMARY KEY CLUSTERED ([FLIGHT#] asc))
IF OBJECT_ID('[dbo].[repl_Transportation_Details]') IS NOT NULL
DROP TABLE [dbo].[repl_Transportation_Details]
GO
CREATE TABLE [dbo].[repl_Transportation_Details] (
[FLT_LEG_ID] INT NOT NULL,
[FLIGHT#] INT NOT NULL,
[LEG_NO] TINYINT …
Run Code Online (Sandbox Code Playgroud) sql-server optimization sql-server-2016 computed-column cardinality-estimates