标签: identity-column

Sql Server旧数据库到群集索引与否

我们有一个遗留数据库,它是一个sql server db(2005和2008).

表中的所有主键都是UniqueIdentifiers.

这些表当前没有在它们上创建聚集索引,我们在仅有750k记录的表上遇到性能问题.这是我使用唯一标识符作为唯一主键的第一个数据库,我从未见过sql server返回数据这么慢.

我不想在uniqueidentifier上创建聚簇索引,因为它们不是顺序的,因此在插入数据时会降低应用程序的速度.

我们无法删除uniqueidentifier,因为它用于远程站点记录身份管理目的.

我曾考虑过向表中添加一个大整数标识列,并在此列上创建聚簇索引并包含唯一标识符列.

int identity - 保持插入速度唯一标识符的第一列 - 确保应用程序按预期保持工作.

目标是改进身份查询并加入表查询性能.

问题1:这会改善数据库的查询性能还是会降低它的速度?

Q2:有没有我没有列出的替代方案?

谢谢皮特

编辑: 性能问题是通过select语句快速检索数据,特别是如果一些更"交易/更改"的表连接在一起.

编辑2:表之间的连接通常都在主键和外键之间,对于具有外键的表,它们包含在非聚集索引中以提供更多覆盖索引.

这些表都没有其他值可以提供良好的聚簇索引.

我更倾向于在每个高负载表上添加一个额外的标识列,然后在聚簇索引中包含当前的Guid PK列以提供最佳的查询性能.

编辑3:我估计只有80%的查询是通过数据访问机制单独在主键和外键上执行的.通常,我们的数据模型具有延迟加载的对象,这些对象在访问时执行查询,这些查询使用对象id和PK列.我们有大量用户驱动的数据排除/包含查询,它们使用外键列作为基于类型X的条件的过滤器,不包括以下id.剩下的20%是Enum(int)或日期范围列的子句,在系统中执行的文本查询非常少.

在可能的情况下,我已经添加了覆盖索引来覆盖最重的查询,但到目前为止,我仍然感到失望.蓝脚表示数据存储为堆.

sql sql-server indexing identity-column clustered-index

6
推荐指数
1
解决办法
419
查看次数

"每个表只能有一个IDENTITY列" - 为什么?

"每个表只能有一个IDENTITY列"

为什么会这样?以车辆的情景为例,存在唯一的登记号码以及唯一的登记号码.要在sql server中描述这种情况,我们需要在列上进行自定义实现.相反,在Oracle中,您可以在表上拥有任意数量的序列.为什么IDENTITY列有限制,有什么具体原因吗?

拥有车辆架构的场景是一个虚构的问题,我在质疑为什么对标识列有限制.

sql-server database-design identity-column

6
推荐指数
2
解决办法
3669
查看次数

使用现有存储过程通过Entity Framework为Oracle数据库生成标识

如何通过Entity Framework自动为Oracle数据库生成标识?

我有一个函数,我可以调用并生成不在上下文中的列如何通过Entity Framework显式调用存储过程?我正在使用存储库模式.

用于插入记录的随机数生成器(我通过UDF获取主键并将其传递给要插入的实体).

oracle identity-column repository-pattern oracle11g entity-framework-4

6
推荐指数
1
解决办法
913
查看次数

SQL Set IDENTITY字段使用变量

全部,我想IDENTITY根据从另一个表获得的当前最大值开始字段的编号.所以我尝试了类似下面的内容

DECLARE @CurrentES INT;
SET @CurrentES = (SELECT MaxES 
                  FROM [NDB]..[TmpMaxES]) + 1;
ALTER TABLE BA 
ADD ES INT IDENTITY(@CurrentES, 1);
Run Code Online (Sandbox Code Playgroud)

但是这不会接受变量作为IDENTITY中的种子值.我怎样才能实现我的目标?

谢谢你的时间.

t-sql dynamic-sql identity-column sql-server-2008

6
推荐指数
2
解决办法
2万
查看次数

我可以在SQL Server中创建一个包含多个表的标识字段吗?

我可以在多个表中使用"标识"(唯一,非重复)列吗?例如,假设我有两个表:书籍和作者.

Authors
  AuthorID
  AuthorName
Books
  BookID
  BookTitle
Run Code Online (Sandbox Code Playgroud)

BookID列和AuthorID列是标识列.我希望标识部分跨越两列.因此,如果存在值为123的AuthorID,则不能存在值为123的BookID.反之亦然.

我希望这是有道理的.

这可能吗?

谢谢.

我为什么要这样做?我正在写一个APS.NET MVC应用程序.我正在创建一个评论部分.作者可以发表评论.书籍可以有评论.我希望能够将实体ID(书籍ID或作者ID)传递给某个操作,并让该操作提取所有相应的注释.如果它是书籍或作者或其他什么,该行动将无关紧要.声音合理吗?

sql-server identity-column

5
推荐指数
2
解决办法
3886
查看次数

在表上打开IDENTITY_INSERT以使用DB Unit加载它

我尝试使用DB Unit加载具有标识列的表.我希望能够自己设置id值(我不希望数据库为我生成它).

这是我的表的最小定义

create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

要在X中插入一行,我执行以下SQL

set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)
Run Code Online (Sandbox Code Playgroud)

没问题.但是当我尝试使用以下数据库单元XML数据集(RS_7_10_minimal_ini.xml)加载此表时

<dataset>
 <X id="666"/>
</dataset>
Run Code Online (Sandbox Code Playgroud)

使用以下最小JUnit(DBTestCase)测试用例:

package lms.lp.functionnal_config;

import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;

public class SampleTest extends DBTestCase

{

public SampleTest(String name)

{
    super( name );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );

}

protected IDataSet getDataSet() throws …
Run Code Online (Sandbox Code Playgroud)

sybase junit dbunit identity-insert identity-column

5
推荐指数
1
解决办法
4793
查看次数

SQL Server——有什么方法可以添加一列并使其成为表中的第一列吗?

我正在更改现有表以添加身份列。我能做到,没问题。

但我想确保将来查看它的人会看到它添加了标识列,所以我真的想将其设置为第 1 列。我知道这对系统的运行完全无关紧要;它仅供人类阅读。

有谁知道有什么方法可以做到这一点?我查看了 Alter Table 和 column_definition 的 TSQL 语法,但没有看到任何内容;但我希望有人知道一种方法来实现这一点。

FWIW,这是一项一次性操作(但在许多服务器上,因此需要自动化),所以我不担心任何“技巧”将来是否会消失——只要它现在有效。我们正在使用最新版本的 SQL Server Express。

感谢您的任何建议。

sql sql-server alter-table identity-column

5
推荐指数
1
解决办法
4万
查看次数

从Database表的所有Identity列中删除[NOT FOR REPLICATION]

我有一个数据库,其中包含许多表,其中标识列设置为[NOT FOR REPLICATION].在SQL Server 2008 R2中是否有任何方法可以从Management Studio或任何Query感谢中删除所有表中的此约束.

Create Table mytbl (
[EmpId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但它逐个删除.

ALTER TABLE dbo.tblAttendance ALTER COLUMN Id
         DROP NOT FOR REPLICATION;
Run Code Online (Sandbox Code Playgroud)

sql sql-server replication identity-column sql-server-2008-r2

5
推荐指数
1
解决办法
1万
查看次数

在Oracle中插入后返回identity列的值

如何在插入后返回Oracle 12c中标识列(id)的值?似乎大多数方法都使用序列来获取插入项的id.

sql oracle identity-column oracle12c sql-returning

5
推荐指数
1
解决办法
4654
查看次数

在 Dbeaver 上创建 Postgres 表时无法使用“GENERATED ALWAYS AS IDENTITY”?

我正在使用 Dbeaver 创建 Postgres 数据库表,但在使用“GENERATED ALWAYS AS IDENTITY”作为我递增的 id 值时出现语法错误。这很奇怪,因为我在本地主机上创建表时使用了完全相同的语法,并且没有任何语法错误或创建表的问题。

这是我尝试保存表时的 SQL 预览:

CREATE TABLE public.conversation (
    id bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
    startdatetime timestamptz NOT NULL,
    enddatetime timestamptz NOT NULL,
    CONSTRAINT conversation_pk PRIMARY KEY (id)
);

Run Code Online (Sandbox Code Playgroud)

当我尝试保存表时,出现“错误:‘GENERATED’处或附近的语法错误”。我认为这是正确的语法,考虑到 SQL 是由 Dbeaver 本身构建的,并且在创建本地数据库进行测试时它工作得很好?

sql postgresql auto-increment identity-column

5
推荐指数
1
解决办法
5536
查看次数