sql-server – 非标识列上的聚簇索引,以加快批量插入?

我的两个问题是:

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

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

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

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

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

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

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

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

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

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

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

解决方法

好吧,我已经对它进行了测试,并在两个“chunk-defined”列上放置了聚簇索引,从而提高了我的表的性能.

与我拥有集群IDENTITY密钥的情况相比,插入块现在相对较快,并且与我没有任何聚簇索引的情况一样快.删除块比使用或不使用聚簇索引更快.

我认为我想要删除或插入的所有记录都保证在硬盘的某个部分上一起使表更快 – 这对我来说似乎是合乎逻辑的.

更新:经过一年的设计经验,我可以说,对于这种工作方法,有必要安排定期重建所有索引(我们每周做一次).否则,索引很快就会碎片化并且性能会丢失.尽管如此,我们正在迁移到具有分区表的新数据库设计,这在各方面都基本上更好 – 除了Enterprise Server许可证成本,但我们现在已经忘记了它.至少我有.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_no='LJCG001H' THEN dbo.ELTPNAME(a.fw_nu) ELSE d.fm_name END),e.fw_state_nm,f.fw_rmk_nm
if not exists(select name from syscolumns where name='tod_no' and id=object_id('iebo09d12')) alter table iebo09d12 add tod_no varchar(
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_nm,g.fa_name from LJSS007H a (nolock) Left join LJPA002H b (nolock) On a.pa_no =b.pa_no Left jo
要在 SQL Server 2019 中设置定时自动重启,可以使用 Windows 任务计划程序。下面是详细的步骤: 步骤一:创建批处理文件 打开记事本。 输入以下内容: net stop "SQL Server (MSSQLSERVER)" net start "SQ
您收到的错误消息表明数据库 'EastRiver' 的事务日志已满,导致数据库操作失败。要解决这个问题,可以按照以下步骤操作: 1. 备份事务日志首先,备份事务日志以释放空间: BACKUP LOG [EastRiver] TO DISK = N'C:\Backup\East
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标识ID,若不知道怎么查询数据库的标识ID, 打开SQL Server management studio,点击工具。选择SQL Server Profiler。 登录,登录成功后,如果有个默认弹窗,先取消 新建追踪 命名
--最新的解决方法 --先创建用户帐户,不进行授权,然后通过下面的SQL语句将该用户帐户关联至对应的数据库用户。优点是避免了重新授权的操作。 USE tempdbEXEC sp_change_users_login 'Update_One', 'iemis', &#3
命令: ALTER TABLE 表名 add 列名 数据类型 default 默认值 not null 例如: ALTER TABLE LJEL005H add el_req int default 15 not null
declare @i int set @i=340 while @i<415 begin set @i=@iʱ insert into LJWK007H select '2024','28','9110','3PTSD621000000
alter table LJSU002H add default (0) for su_totalamt with values
命令: 有默认值时用:alter table 表名 DROP 约束 alter table 表名 DROP COLUMN 列名 例如: alter table LJEL005H DROP COLUMN el_req 注意: 如果有默认值先删除约束,否则报错: --消息 5074,级别 16,状态 1
mysql报错Unknown collation: utf8mb4_0900_ai_ci 解决方案: 将文件内的所有 utf8mb4_0900_ai_ci 换成 utf8_general_ci utf8mb4 换成 utf8
SQL SERVER根据数据表的某个栏位查询另一个数据表符合条件的某个栏位的值,如果多行则合并为一张字符串形式 要在 SQL Server 中根据一个数据表的某个列查询另一个数据表符合条件的某个列的值,并将多行结果合并为一个字符串,可以使用 FOR XML PATH 子句来执行此操作。以下是一个示例
ALTER TABLE LJPA001H DROP CONSTRAINT DF_LJPA001H_pa_sex_1 ALTER TABLE LJPA001H ALTER COLUMN pa_sex VARCHAR(1)
DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。使用DATEDIFF和DATEADD函
select top 100 substring(qr_code,8,8) ,* from [LiuJun_PKh_lcfc_hf] --where right(ri,8) or substring(qr_code,8,8)=. select top 10 left(right(one_code,1
1、发现事务日志备份突然停止了 2、查看维护计划中的事务日志设置 3、发现备份任务中,事务日志需要指向的数据库不在 4、进入数据库属性 5、在选项中将恢复模式改为“完整”
select DB_ID('SBTERPDB')
您收到的错误消息表明数据库 'EastRiver' 的事务日志已满,导致数据库操作失败。要解决这个问题,可以按照以下步骤操作: 1. 备份事务日志首先,备份事务日志以释放空间: BACKUP LOG [EastRiver] TO DISK = N'C:\Backup\East