我应该如何确保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是否有变化?