在SQL Server中选择大量数据的快速方法

时间:2011-07-19 11:24:56

标签: sql-server-2008

这是我桌子的架构:

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]

2 个答案:

答案 0 :(得分:8)

哇,所有那些MAX列...你真的需要MAX用于URL和标题吗?你真的需要PK作为GUID吗?

由于大多数系统都受I / O限制,因此良好性能的一个关键(除了合理的索引和仅提取您需要的数据之外)是尽可能多地将数据放到每个页面上。由于所有这些LOB列每个都可能存储2GB数据,因此每次抓取页面对SQL Server来说都是一个噩梦。强烈建议尽可能考虑修剪其中一些数据类型,例如

  • 如果可行,请使用IDENTITY列而不是GUID - 为什么同时使用?
  • 对于FK要查找的任何INT,它们总是具有< 32K行,使用SMALLINT
  • 对于FK要查找的任何INT,它们总是具有< 255行,使用TINYINT
  • 使用行内存储(而不是MAX类型)来处理标题和网址
  • 你可以使用< 18位数的价格 - 怀疑您将分类物品价值$ 1,000,000,000,000 +
  • 如果< Date / Fetch_Date不需要精确度,使用SMALLDATETIME
  • 如果< Date / Fetch_Date不需要日精度,使用DATE

(我也觉得奇怪的是你需要Unicode / nvarchar作为标题,但不需要描述,你需要Unicode / nvarchar用于URL / ImageURL,但不需要DisplayURL。你能解释一下那里的理由吗?我会给一个提示:如果标题可以包含Unicode,那么可以合理地假设标题也可以在描述中提及,因此它也应该支持Unicode。并且所有的URL都可能只支持varchar;我不记得了曾经看到过包含Unicode字符的URL(这些通常是URL编码的)。)

如果您使用的是Enterprise Edition或更高版本,请考虑使用数据压缩。同样,由于大多数系统都受I / O限制,我们很乐意为压缩/解压缩数据付出轻微的CPU代价,以便将其放到更少的页面上,这将大大减少对表执行大量读取操作所需的时间。 / p>

答案 1 :(得分:1)

在讨论性能时,了解哪种查询对您的表最常见是非常重要的。 您的搜索将使用哪些列进行过滤?标题和日期?

假设您的大部分查询都是通过以下方式过滤您的表:日期然后按标题。

您应首先使用Date创建一个不唯一的聚簇索引,然后使用Title。 这是为什么?因为那时您的记录按顺序按顺序存储,使搜索速度更快,这就是为什么每个表只能有一个聚簇索引。

选中此explanantion out