这是我桌子的架构:
CREATE TABLE [dbo].[ClassifiedDataStore_MasterTesting]
(
[PK_ID] [uniqueidentifier] NOT NULL,
[FK_SubCategory_Master] [int] NULL,
[FK_IntegratedWeb_Master] [int] NULL,
[FK_City_Master] [int] NULL,
[Title] [nvarchar](max) NULL,
[Description] [varchar](max) NULL,
[Url] [nvarchar](max) NULL,
[DisplayUrl] [varchar](max) NULL,
[Date] [datetime] NULL,
[ImageURL] [nvarchar](max) NULL,
[Price] [decimal](18, 2) NULL,
[Fetch_Date] [datetime] NULL,
[IsActive] [bit] NULL,
[record_id] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_ClassifiedDataStore_Master2] PRIMARY KEY CLUSTERED
(
[PK_ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
答案 0 :(得分:8)
哇,所有那些MAX列...你真的需要MAX用于URL和标题吗?你真的需要PK作为GUID吗?
由于大多数系统都受I / O限制,因此良好性能的一个关键(除了合理的索引和仅提取您需要的数据之外)是尽可能多地将数据放到每个页面上。由于所有这些LOB列每个都可能存储2GB数据,因此每次抓取页面对SQL Server来说都是一个噩梦。强烈建议尽可能考虑修剪其中一些数据类型,例如
(我也觉得奇怪的是你需要Unicode / nvarchar作为标题,但不需要描述,你需要Unicode / nvarchar用于URL / ImageURL,但不需要DisplayURL。你能解释一下那里的理由吗?我会给一个提示:如果标题可以包含Unicode,那么可以合理地假设标题也可以在描述中提及,因此它也应该支持Unicode。并且所有的URL都可能只支持varchar;我不记得了曾经看到过包含Unicode字符的URL(这些通常是URL编码的)。)
如果您使用的是Enterprise Edition或更高版本,请考虑使用数据压缩。同样,由于大多数系统都受I / O限制,我们很乐意为压缩/解压缩数据付出轻微的CPU代价,以便将其放到更少的页面上,这将大大减少对表执行大量读取操作所需的时间。 / p>
答案 1 :(得分:1)
在讨论性能时,了解哪种查询对您的表最常见是非常重要的。 您的搜索将使用哪些列进行过滤?标题和日期?
假设您的大部分查询都是通过以下方式过滤您的表:日期然后按标题。
您应首先使用Date创建一个不唯一的聚簇索引,然后使用Title。 这是为什么?因为那时您的记录按顺序按顺序存储,使搜索速度更快,这就是为什么每个表只能有一个聚簇索引。