我应该如何确保mytable有效
我正在设计一个可能有200K行的新表。 我想确保这张表格的querys是有效的。我应该如何确保mytable有效
过去我一直在假设,这将导致指数给出行的唯一ID:
CREATE TABLE [dbo].[Equipment](
[EquipID] [nchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[EquipDescription] [nchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Category] [nchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[id] [int] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]
是否足够呢? ,我应该设置一个主键。
如果有人有任何建议,请让他们飞。
T-SQL,SQL2000,
您只有在可以创建一个主键或明确创建一个得到一个指数。您需要的索引取决于您的查询,只有在列上有索引时,才会使查询更快,除非查询或加入该列。
指数也不是没有成本,他们使数据库更大,并增加了修改表的成本。
这article,虽然老似乎给了指数很好的概述。
如果你打算用数据库获得数据库教科书如Database Systems并阅读它,将证明是非常宝贵的。寻找索引和查询的最有效安排是困难的,尝试和错误不是试图优化查询的好方法。
你应该问自己的第一件事是“'设备'的属性是什么?”没有EquipID,描述或类别的设备是否可以存在?如果不是,那么这些列不应该被允许为空。
其次是“什么唯一定义了一件'设备'?”它是EquipID吗?那么这应该是你的主键。它是EquipID和Category的组合吗?然后你有一个由两个列组成的复合主键。然而,有时候,数据本身并不适用于一个可以在完全关系模型中轻松加入的主键。因此,您可以考虑显示的Identity ID列 - 这被称为代理键。要知道,默认情况下创建主键会在这些键列上创建聚簇索引。如果你使用代理键方法,恕我直言,那么在你的对象的唯一性(即EquipID)上创建另一个唯一索引是个好主意。
就其他指标而言,你应该进一步问自己:“我会经常查询哪些专栏?”也许你会有很多问题,比如“SELECT EquipID FROM Equipment WHERE Category = 3”。这表明类别是索引的一个很好的候选列。
最后,另一个很好的经验法则是索引任何外键列 - 它看起来类别可能是。这会优化您可能执行的任何连接查询。
一个好方法,这将是类似下面(快扔在一起,未测试):
CREATE TABLE [dbo].[Equipment](
[EquipID] [nchar](20) NOT NULL
,[EquipDescription] [nchar](100) NOT NULL
,[CategoryID] [bigint] NOT NULL
,CONSTRAINT [PK_Equipment] PRIMARY KEY CLUSTERED (
[EquipID] ASC
)
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Categories](
[CategoryID] [bigint] IDENTITY(1,1) NOT NULL
,[CategoryName] [nchar](100) NOT NULL
,CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED (
[CategoryID] ASC
)
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IDX_Equipment_Category] ON [dbo].[Equipment] (
[CategoryID] ASC
) ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [IDX_Categories_CategoryName] ON [dbo].[Categories] (
[CategoryName] ASC
) ON [PRIMARY]
ALTER TABLE [dbo].[Equipment] WITH CHECK ADD CONSTRAINT [FK_Equipment_Categories]
FOREIGN KEY([CategoryID]) REFERENCES [dbo].[Categories] ([CategoryID])
GO
这是在表上创建一个主键的最佳实践。如@deinst所示,除非明确创建它们,否则不会获取索引。创建主键是创建索引的一种方法。
[id]列可能是主键的一个很好的候选者。而且,将它作为聚簇索引(每个表得到一个聚簇索引)可能是可以的,这是创建主键时的默认值。
您可能希望根据查询表的方式(如@deinst所示)在其他列上创建索引。
Is [EquipID]是表的自然键。自然键是业务领域中的一个独特属性。业务人员如何参考每个项目。如果[EquipID]是自然键,则可能需要为此列添加唯一约束或唯一索引,并且您可能希望将其可空性更改为NOT NULL。
数据库优化本身就是一门艺术/科学,但数据建模也是如此。首先确保你的模式是坚实的,并支持你的应用程序。然后,您可以添加索引以提高查询性能。但是,不要根据某种观点选择数据建模选项,以某种方式使表更快地查询。
1)除了性能以外,所有表都应该有一个主键。您需要能够唯一标识一条记录。
2)查询的性能和哪些索引将提高效率取决于查询。如果您在JOIN,WHERE子句或ORDER BY子句中使用列,那么它应该有一个索引。您的主键会自动获取索引,因此可以考虑以这种方式使用哪些其他列。在某些情况下,多列索引是最佳选择。
这个问题是不可能的也没有张贴查询和关系,你将不得不回答。
- 你打算总是用
id
来指代设备吗?还是通过EquipID
? - 其他表是否通过存储
id
值或EquipID
来将参考(外键)存储到设备? - 你打算由
Category
聚合吗? - 是否有
Category
暗示的层次? - 设备上的
EquipID
是否有变化?