我有两个巨大的表,每个表大约有 1 亿条记录,恐怕我需要在两者之间执行内部联接。现在,两张表都非常简单;这是描述:
生物实体表:
- BioEntityId (int)
- 名称(nvarchar 4000,虽然这是一个矫枉过正)
- 类型 ID (int)
EGM 表(一个辅助表,实际上是批量导入操作的结果):
- EMGId (int)
- PID(整数)
- 名称(nvarchar 4000,虽然这是一个矫枉过正)
- 类型 ID (int)
- LastModified(日期)
我需要获得一个匹配的名称,以便将 BioEntityId 与 EGM 表中的 PId 相关联。最初,我尝试使用单个内部连接来完成所有操作,但查询似乎花费的时间太长,并且数据库的日志文件(在简单恢复模式下)设法耗尽了所有可用的磁盘空间(刚刚超过 200 GB,当数据库占用18GB时),如果我没记错的话,等待两天后查询会失败。我设法阻止日志增长(现在只有 33 MB),但是查询已经连续运行了 6 天,而且看起来不会很快停止。
我在一台相当不错的计算机(4GB RAM,Core 2 Duo (E8400) 3GHz,Windows Server 2008,SQL Server 2008)上运行它,我注意到计算机每隔 30 秒(给予或接受)偶尔会卡顿一段时间几秒钟。这使得它很难用于其他任何事情,这真的让我很紧张。
现在,这是查询:
SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
FROM EGM INNER JOIN BioEntity
ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
我手动设置了一些索引;EGM 和 BioEntity 都有一个包含 TypeId 和 Name 的非聚集覆盖索引。但是,查询运行了 5 天,也没有结束,所以我尝试运行 Database Tuning Advisor 以使其正常工作。它建议删除我的旧索引并创建统计信息和两个聚集索引(每个表上一个,只包含我觉得很奇怪的 TypeId - 或者只是简单的愚蠢 - 但我还是试了一下)。
它已经运行了 6 天,我仍然不知道该怎么办......有什么想法吗?我怎样才能使它更快(或者,至少,有限)?
更新: -好的,我已取消查询并重新启动服务器以使操作系统重新启动并运行-我正在使用您提出的更改重新运行工作流,特别是将 nvarchar 字段裁剪为更小的大小并交换“like”对于“=”。这至少需要两个小时,所以我稍后会发布更多更新
更新 2(格林威治标准时间下午 1 点,2009 年 11 月 18 日): - 估计的执行计划显示表扫描的成本为 67%,然后是 33% 的哈希匹配。接下来是 0% 并行度(这不是很奇怪吗?这是我第一次使用估计的执行计划,但这个特别的事实让我大吃一惊),0% 哈希匹配,更多 0% 并行度,0% 顶部,0 % 表插入,最后是另一个 0% 选择。似乎索引是垃圾,正如预期的那样,所以我将制作手动索引并丢弃蹩脚的建议索引。