标签: identity-column

非标识列上的聚簇索引可加快批量插入?

我的两个问题是:

  • 我可以使用聚簇索引来加速大表中的批量插入吗?
  • 如果我的IDENTITY列不再是聚集索引,我还能有效地使用外键关系吗?

详细说来,我有一个包含公司数据的几个非常大(在100-1000万行之间)的数据库.通常,在这样的表中存在大约20-40个公司的数据,每个公司都是由"CompanyIdentifier"(INT)标记的他们自己的"块".此外,每家公司都有大约20个部门,每个部门都有自己的"子块",标有"DepartmentIdentifier"(INT).

经常会发生从表中添加或删除整个"块"或"子块".我的第一个想法是在这些块上使用表分区,但由于我使用的是SQL Server 2008标准版,因此我无权使用它.尽管如此,我所拥有的大多数查询都是在"块"或"子块"上执行而不是在整个表格上执行.

我一直在努力为以下功能优化这些表:

  1. 在子块上运行的查询
  2. 作为整体在桌面上运行的"基准测试"查询
  3. 插入/删除大块数据.

对于1)和2)我没有遇到很多问题.我在关键字段上创建了几个索引(也包含有用的CompanyIdentifier和DepartmentIdentifier),查询运行正常.

但对于3)我一直在努力寻找一个好的解决方案.我的第一个策略是始终禁用索引,批量插入大块并重建索引.这在开始时非常快,但现在数据库中有很多公司,每次重建索引需要很长时间.

目前我的策略已经改为只是在插入时保持索引,因为现在这似乎更快.但我想进一步优化插入速度.

我似乎注意到通过添加在CompanyIdentifier + DepartmentIdentifier上定义的聚簇索引,将新的"块"加载到表中的速度更快.在我放弃这个策略以支持在IDENTITY列上添加聚簇索引之前,有几篇文章向我指出聚簇索引包含在所有其他索引中,因此聚簇索引应该尽可能小.但现在我正在考虑恢复这个旧策略来加速插入.我的问题,这是明智的,还是会在其他领域遇到性能打击?这真的会加速我的插入还是仅仅是我的想象力?

我也不确定在我的情况下是否确实需要IDENTITY列.我希望能够与其他表建立外键关系,但我是否也可以使用类似于CompanyIdentifier + DepartmentIdentifier + [uniquifier]方案的东西?或者它必须是一个表格,分散的IDENTITY数字?

非常感谢任何建议或解释.

database sql-server identity-column clustered-index sql-server-2008

8
推荐指数
1
解决办法
4774
查看次数

RESEED数据库上的标识列

我可以用吗?

DBCC CHECKIDENT(<table_name>, RESEED, value)
Run Code Online (Sandbox Code Playgroud)

命令将标识列当前值重置为SQL Server 2008中的原始值?

如果是的话,这是正确的做法,没有任何缺点吗?如果没有,是否有另一种方法可以做到这一点?

sql-server identity-column sql-server-2008

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

为什么Hibernate默认生成PostgreSql"SequenceGenerator",而不是"IdentityGenerator"?

Hibernate中Postgresql的默认标识符生成器是SequenceGenerator [1].即Hibernate将SELECT nextval('hibernate_sequence')在执行INSERT foo (id, ...) VALUES (123, ...)会话提交之前生成ID .

但是,PostgreSql支持自动增量id列(参见例如[2]),并且支持自动增量的所有其他数据库的默认生成器是使用该功能[3],并执行省略id值的插入并查询数据库以获取新的id(在会话提交之前,但在会话的事务中).

我已经看到最近的一些讨论[4]表明,由于插入前会话提交不匹配,前一策略总体上更好.

如果SequenceGenerator更好(根据[4]),为什么它不是支持它的数据库的默认值(见[3])?

如果IdentityGenerator更好,为什么Postgres支持前者时PostgreSql显式选择SequenceGenerator(按照[2])?

我试图找到重写Postgres方言中默认值的决定的历史(见[1]),但我在GitHub中找不到相关的提交.我已经将代码跟回到SVN存储库,但是在r11563中添加了PostgreSQLDialect文件,其中有一条无用的提交消息"maven migration"[5].我似乎无法再追溯历史了.任何人都可以找到添加此覆盖的提交吗?也许提交消息中有更多信息.

提前致谢.

[1] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L267

[2] PostgreSQL Autoincrement

[3] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java#L639

[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

[5] https://source.jboss.org/browse/Hibernate/core/trunk/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java?focusedRev=14993&fromRev=11563&toRev=14993#r14993

postgresql nhibernate hibernate identity-column

8
推荐指数
1
解决办法
2695
查看次数

从矩阵的不同列获取值的向量

我有一个矩阵10x4,我有一个有10个元素的向量.每个元素都是应该检索的矩阵的列索引.这是一个例子:

> M.mat
            [,1]       [,2]        [,3]        [,4]
 [1,] -0.4236174  0.2228897  0.11676857  0.16906735
 [2,] -0.4860078  0.9862164 -2.04735716 -0.33708521
 [3,] -0.6931023 -0.2255126 -0.58214338 -0.08705187
 [4,]  0.4048169  0.8713917  0.38543781 -1.38207954
 [5,]  2.4005044  1.2483514  0.66759229 -1.33667156
 [6,] -1.2083913  0.2389032  0.29554618 -0.05910570
 [7,]  0.8055317 -0.7978780 -0.31873361  0.57248675
 [8,] -0.1606493  0.4110878  0.90236993 -0.62311446
 [9,]  0.3721249  0.5276403 -0.09323399 -0.41223947
[10,]  2.0704414  0.1747543  0.45456052 -1.09215597

> Idx
 [1] 3 4 1 2 1 3 1 1 2 3
Run Code Online (Sandbox Code Playgroud)

这意味着我想从第2行第1,4行第3列第3列获取第3列,...

我试图创建一个包含两列的data.frame,一个是来自1; 10的row.indx,另一列是Idx,但它不起作用.任何建议如何访问指定的元素?

r matrix identity-column

8
推荐指数
1
解决办法
1254
查看次数

ORA-32795:无法插入生成的始终标识列

伙计们我试图在insert语句下面执行并且我一直收到错误:

无法插入生成的始终标识列

声明是:

INSERT INTO leaves_approval 
SELECT * 
FROM   requests_temp r 
WHERE  r.civil_number = 33322 
       AND r.request_id = (SELECT Max(s.request_id) 
                           FROM   requests_temp s)
Run Code Online (Sandbox Code Playgroud)

sql oracle identity-column oracle12c

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

Oracle Alter命令重命名现有的列错误环

alter table tablename rename column zl_divn_nbr to div_loc_nbr;
Run Code Online (Sandbox Code Playgroud)

执行以上语句时出错。请帮忙。

SQL Error: ORA-54032: column to be renamed is used in a virtual column expression
54032. 0000 -  "column to be renamed is used in a virtual column expression"
*Cause:    Attempted to rename a column that was used in a virtual column
           expression.
*Action:   Drop the virtual column first or change the virtual column
           expression to eliminate dependency on the column to be renamed
Run Code Online (Sandbox Code Playgroud)

oracle alter identity-column

8
推荐指数
2
解决办法
3014
查看次数

如何将表与自动编号主键合并?

我想每个人偶尔遇到这个问题:你有两个表有自动编号需要合并的主键.使用自动编号主键有利于说应用程序生成的密钥有很多很好的理由,但与其他表合并必然是最大的缺点之一.

出现的一些问题是重叠的id和不同步的外键.我想听听你解决这个问题的方法.我总是遇到问题,所以如果有人有某种通用的解决方案,我很好奇.

- 编辑 -

在回答建议使用guid或其他非数字键的答案时,有些情况事先提醒使用自动编号键(后来你后悔),或者你正在接管其他人的项目,或者你得到一些你必须使用的遗留数据库.所以我真的在找一个你无法控制数据库设计的解决方案.

sql-server database-design identity-column

7
推荐指数
1
解决办法
2869
查看次数

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
查看次数