我有一个采用专有编程语言的应用程序。数据库访问通过与 SQL Server 2019 的 ODBC 连接进行处理。应用程序中有一个用例,其中使用准备好的语句将数千个插入转储到同一个表中。 不幸的是,我无法更改插入本身,因为应用程序的对象关系映射处理插入,这是一个“黑匣子”。 我唯一的选择就是为这些插入物的茁壮成长提供理想的环境。 表格的布局如下:
CREATE TABLE [dbo].[CostTable](
[Deleted] [bit] NOT NULL,
[TimeEntry] [datetime] NOT NULL,
[UserEntry] [int] NOT NULL,
[GUID] [varchar](50) NOT NULL,
[Costs1] [decimal](18, 2) NULL,
[Costs2] [decimal](18, 2) NULL,
[Costs3] [decimal](18, 2) NULL,
[Costs4] [decimal](18, 2) NULL,
[Costs5] [decimal](18, 2) NULL,
[Costs6] [decimal](18, 2) NULL,
[Costs7] [decimal](18, 2) NULL,
CONSTRAINT [PK_CostTable] PRIMARY KEY NONCLUSTERED
(
[GUID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
该表还应用了一些索引。 不幸的是,我无法更改主键的格式,并且该值本身是由应用程序创建的。它是一个字母数字键。数字键很可能会更好,但我不能这样做。 关闭检查约束并在所有插入后将其打开是否有帮助? 还有其他选择吗? 我可以在 ODBC 驱动程序中调整什么吗?我使用的是 SQL Server Native Client 11.0。 ODBC 驱动程序可以根据需要进行更改。
您可以修改数据库和表的配置和结构以加快相同的应用程序过程。
检查中
应用程序可能会在写入表之前通过一些查询计算其他表中的一些值。这些查询可能需要优化。
在批量加载过程之前,请使用 Sql Profiler 调查应用程序向 Sql Server 发送的内容。然后看看哪些步骤需要更长的时间
批量加载优化
如果这些是一次性作业或计划作业,则要优化插入速度。
1.)
Take a full backup
。 释放事务日志分配的空间。
2.) 改变
recovery model to Simple
.
3.) 检查日志和数据库文件的大小。 512, 1024 MB 如下图所示。
这会降低Increase the Autogrowth
的
生长频率。 在预定的过程之后,您可以设置一个理想的磁盘值。假设为 256 MB。
database - transaction log file
,主键除外。
5.)Disable all indexes
无支票。
6.) 在 Sql Server 中,不要将所有内容都放在同一个磁盘/驱动器中。Disable all constraint
如果可以的话,将临时数据库文件添加到单独的专用快速磁盘中。