我有两个大型表,每个大约有1亿条记录,恐怕我需要在两个表之间执行内部连接。现在,两张桌子都很简单。这里的介绍:SQL:内部连接两个大型表
生物实体表:
- BioEntityId(INT)
- 名称(nvarchar的4000,虽然这是一个矫枉过正)
- TYPEID(INT)
临时股东大会表(一个附配表,实际上得到的本体导入操作的):
- EMGId(INT)
- PID(INT)
- 名称(nvarchar的4000,虽然这是一个矫枉过正)
- TYPEID(INT)
- 上次更改时间(日期)
我需要获取一个匹配的名称,以便将BioEntityId与驻留在EGM表中的PId相关联。最初,我试图用单个内部连接完成所有事情,但查询似乎耗时过长,并且数据库的日志文件(以简单恢复模式)设法咀嚼所有可用磁盘空间(超过200 GB,当数据库占用18GB)并且等待两天后查询会失败,如果我没有弄错。我设法防止日志增长(现在只有33 MB),但查询已经连续运行了6天,看起来不会很快停止。我在一个相当不错的电脑上运行它(4GB内存,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的非聚集覆盖索引。然而,查询运行了五天,也没有结束,所以我试着运行数据库优化顾问来让这件事情起作用。它建议删除我的旧索引并创建统计信息和两个聚集索引(每个表上只有一个,只包含TypeId,我觉得它很奇怪 - 或者只是简单的愚蠢 - 但我仍然放弃它)。
已现在正在运行6天,我仍然不知道该怎么办...... 任何想法的家伙?我怎样才能让这个更快(或者至少是有限的)?
更新: - 好吧,我已经取消了查询,并重新启动服务器,以获得OS重新启动和运行 - 我重新运行工作流程与您建议的修改,特别是裁剪为nvarchar领域的尺寸小得多,并为“=”交换“like”。这是要花至少两个小时,所以我会在
更新2晚些时候发布进一步的更新(格林尼治标准时间下午1:00时,18/11/09): - 估计执行计划揭示了67%的成本关于表扫描,然后是33%的散列匹配。接下来是0%的并行性(这不奇怪吗?这是我第一次使用估计的执行计划,但这个特殊的事实刚刚解除了我的眉毛),0%的散列匹配,0%的并行性,0%的顶级,0 %表插入,最后再选择0%。似乎索引是垃圾,正如预期的那样,所以我将制作手动索引并丢弃糟糕的建议索引。
只是好奇...为什么你需要100+万行回来,你有什么打算用这些数据做? – 2009-11-17 16:22:56
4k名称字段中存储的最大值是多少?如果它实质上小于4k,那么在每个表格中缩小尺寸。 – 2009-11-17 16:23:14
生物信息学...:] – 2009-11-17 16:23:24