我有一个大表(约 5000 万行)我正在尝试批量插入 SQL Server,但出现错误:
无法为数据库“I 3 Stroke”中的对象“myDB”分配空间,因为“PRIMARY”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
数据库中有另一个表,大约有 2500 万行。该数据库将仅在一台机器上使用,它旨在挖掘已经存在的数据,并且在任何情况下都不会超过其当前大小。
对于这种情况,解决此问题的最佳方法是什么,这样 SQL Server 就不会抱怨?这个数据库不会暴露给多个用户的解决方案是否重要?
我开始学习一些关于查看执行计划和提高查询效率的知识
考虑这两个基本查询
select distinct pat_id, drug_class, drug_name from rx
select pat_id, drug_class, drug_name from rx
Run Code Online (Sandbox Code Playgroud)
以及他们的执行计划
使用的索引:
CREATE CLUSTERED INDEX [ix_overlap] ON [dbo].[rx]
(
[pat_id] ASC,
[fill_date] ASC,
[script_end_date] ASC,
[drug_name] ASC
)
Run Code Online (Sandbox Code Playgroud)
即使第一个查询的成本高出 4:1,它的运行速度也比第二个快。为什么向查询添加一个简单的 distinct 会添加(我认为总是不好的,欢迎更正)哈希匹配运算符?如果它运行得更快,为什么它相对于第二个查询具有更高的查询成本。
我有一个大表 ~2500 万行的结构
CREATE TABLE [dbo].[rx](
[pat_id] [int] NOT NULL,
[fill_Date] [date] NOT NULL,
[script_End_Date] AS (dateadd(day,[dayssup],[filldate])) persisted,
[drug_Name] [varchar](50) NULL,
[days_Sup] [int] NOT NULL,
[quantity] [float] NOT NULL,
[drug_Class] [char](3) NOT NULL,
CHECK(fill_Date <=script_End_Date
PRIMARY KEY NONCLUSTERED
(
[clmid]
)
create clustered index ix_rx_temporal on rx(fill_date asc, script_end_date asc, pat_id asc)
Run Code Online (Sandbox Code Playgroud)
永远不会查询此表上的主键。迄今为止,该表最常用于涉及日期范围的查询。我有一个带有结构的日历表
CREATE TABLE [dbo].[Calendar](
[cal_date] [date] PRIMARY KEY,
[Year] AS YEAR(cal_date) PERSISTED,
[Month] AS MONTH(cal_date) PERSISTED,
[Day] AS DAY(cal_date) PERSISTED,
[julian_seq] AS 1+DATEDIFF(DD, CONVERT(DATE, CONVERT(varchar,YEAR(cal_date))+'0101'),cal_date));
Run Code Online (Sandbox Code Playgroud)
我试图加速的查询是:
;WITH x …
Run Code Online (Sandbox Code Playgroud)