Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在SQL Server中从非常大的表(600M)中获取子集(200M)的最快方法_.net_Sql_Sql Server 2008_Large Data Volumes - Fatal编程技术网

.net 在SQL Server中从非常大的表(600M)中获取子集(200M)的最快方法

.net 在SQL Server中从非常大的表(600M)中获取子集(200M)的最快方法,.net,sql,sql-server-2008,large-data-volumes,.net,Sql,Sql Server 2008,Large Data Volumes,我们面临着以下问题,我们正在努力找到最好的解决方案 我们正在使用SQLServer2008。我们有一个表,它有超过6亿条记录,大约有25列。其中一列是ID,并已编制索引。我们需要从这个表中获取记录的子集。主要有两种情况: a子集包含1000到200百万行之间的任意位置;要获取的行的ID存储在SQL Server中的索引表中 b子集包含少于100万行;要获取的行的ID存储在应用程序服务器的内存.NET web app中 我们的挑战是尽可能快地得到这个子集。我们确实需要在几秒钟内实现这一点 到目前为

我们面临着以下问题,我们正在努力找到最好的解决方案

我们正在使用SQLServer2008。我们有一个表,它有超过6亿条记录,大约有25列。其中一列是ID,并已编制索引。我们需要从这个表中获取记录的子集。主要有两种情况:

a子集包含1000到200百万行之间的任意位置;要获取的行的ID存储在SQL Server中的索引表中

b子集包含少于100万行;要获取的行的ID存储在应用程序服务器的内存.NET web app中

我们的挑战是尽可能快地得到这个子集。我们确实需要在几秒钟内实现这一点

到目前为止,我们的解决方案:

a我们在两个表之间进行连接。这是可行的,但还不够快。查询类似于SELECT*FROM Big_Table JOIN IndexTable ON Big_Table.ID=IndexTable.ID

b我们真的没有解决办法。我们尝试运行WHERE IN查询,但如果子集接近ID1、ID2、ID3中的WHERE ID的大_表中的百万行SELECT*,那么这将花费很长时间。。。。解决方案可以是将索引存储在临时表中,但这又回到了案例A

我们正在尽可能地优化SQL Server,特别是使用良好的索引和分区。今天我更想问的是,在a和b两种情况下,您认为最好的方法是提取子集

任何想法或建议都将不胜感激


谢谢

对于您的问题a,最明显的问题是:SELECT*FROM Big_Table JOIN IndexTable ON Big_Table.ID=IndexTable.ID查询:您确定两个表中的ID列都有索引吗

问题a中最明显的问题是,在Big_Table.ID=IndexTable.ID查询中,SELECT*FROM Big_Table JOIN IndexTable是:您确定两个表中的ID列都有索引吗

既然您正在进行分页,您不能先从IndexTable中再选择一系列行,然后将其加入到大表中吗

比如:

select * from big_table where id in (select top 100 id from indextable)

既然您正在进行分页,您不能先从IndexTable子选择一系列行,然后将其连接到大表中吗

比如:

select * from big_table where id in (select top 100 id from indextable)

很抱歉对此提出疑问,但您需要将数据拉回来吗?你能在数据库中工作吗?出于好奇,为什么你要一次获取2亿行?你需要返回所有列吗?我建议只显式命名要返回的列。运行sql server的计算机中是否有足够的内存?这对性能有着巨大的影响。似乎你需要改变任务:你真的需要收回2亿条记录吗?你想用2亿记录做什么?即使BigTable中的所有列都有数据类型int,200M记录也是20GB,必须在RAM中处理,以避免HDDSorry的性能损失,但您需要将数据拉回来吗?你能在数据库中工作吗?出于好奇,为什么你要一次获取2亿行?你需要返回所有列吗?我建议只显式命名要返回的列。运行sql server的计算机中是否有足够的内存?这对性能有着巨大的影响。似乎你需要改变任务:你真的需要收回2亿条记录吗?你想用2亿记录做什么?即使BigTable中的所有列都有数据类型int,2亿条记录也是20 GB,必须在RAM中处理,以避免在所有ID列都被索引时性能损失。将600M大表与100k索引表连接起来大约需要1分钟。这是在具有非分区表的开发服务器上进行的,因此我预计这一次在具有分区表的生产服务器上会减少一半。但是,即使是30秒也太长了。是的,所有ID列都被索引。将600M大表与100k索引表连接起来大约需要1分钟。这是在具有非分区表的开发服务器上进行的,因此我预计这一次在具有分区表的生产服务器上会减少一半。然而,即使是30岁也太长了。