我们有一个遗留数据库,它是一个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)或日期范围列的子句,在系统中执行的文本查询非常少.
在可能的情况下,我已经添加了覆盖索引来覆盖最重的查询,但到目前为止,我仍然感到失望.蓝脚表示数据存储为堆.
"每个表只能有一个IDENTITY列"
为什么会这样?以车辆的情景为例,存在唯一的登记号码以及唯一的登记号码.要在sql server中描述这种情况,我们需要在列上进行自定义实现.相反,在Oracle中,您可以在表上拥有任意数量的序列.为什么IDENTITY列有限制,有什么具体原因吗?
拥有车辆架构的场景是一个虚构的问题,我在质疑为什么对标识列有限制.
如何通过Entity Framework自动为Oracle数据库生成标识?
我有一个函数,我可以调用并生成不在上下文中的列如何通过Entity Framework显式调用存储过程?我正在使用存储库模式.
用于插入记录的随机数生成器(我通过UDF获取主键并将其传递给要插入的实体).
oracle identity-column repository-pattern oracle11g entity-framework-4
全部,我想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中的种子值.我怎样才能实现我的目标?
谢谢你的时间.
我可以在多个表中使用"标识"(唯一,非重复)列吗?例如,假设我有两个表:书籍和作者.
Authors
AuthorID
AuthorName
Books
BookID
BookTitle
Run Code Online (Sandbox Code Playgroud)
BookID列和AuthorID列是标识列.我希望标识部分跨越两列.因此,如果存在值为123的AuthorID,则不能存在值为123的BookID.反之亦然.
我希望这是有道理的.
这可能吗?
谢谢.
我为什么要这样做?我正在写一个APS.NET MVC应用程序.我正在创建一个评论部分.作者可以发表评论.书籍可以有评论.我希望能够将实体ID(书籍ID或作者ID)传递给某个操作,并让该操作提取所有相应的注释.如果它是书籍或作者或其他什么,该行动将无关紧要.声音合理吗?
我尝试使用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) 我正在更改现有表以添加身份列。我能做到,没问题。
但我想确保将来查看它的人会看到它添加了标识列,所以我真的想将其设置为第 1 列。我知道这对系统的运行完全无关紧要;它仅供人类阅读。
有谁知道有什么方法可以做到这一点?我查看了 Alter Table 和 column_definition 的 TSQL 语法,但没有看到任何内容;但我希望有人知道一种方法来实现这一点。
FWIW,这是一项一次性操作(但在许多服务器上,因此需要自动化),所以我不担心任何“技巧”将来是否会消失——只要它现在有效。我们正在使用最新版本的 SQL Server Express。
感谢您的任何建议。
我有一个数据库,其中包含许多表,其中标识列设置为[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
如何在插入后返回Oracle 12c中标识列(id)的值?似乎大多数方法都使用序列来获取插入项的id.
我正在使用 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 本身构建的,并且在创建本地数据库进行测试时它工作得很好?
identity-column ×10
sql ×5
sql-server ×5
oracle ×2
alter-table ×1
dbunit ×1
dynamic-sql ×1
indexing ×1
junit ×1
oracle11g ×1
oracle12c ×1
postgresql ×1
replication ×1
sybase ×1
t-sql ×1