Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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
C# SQL索引表联接_C#_Sql_Sql Server_Join - Fatal编程技术网

C# SQL索引表联接

C# SQL索引表联接,c#,sql,sql-server,join,C#,Sql,Sql Server,Join,我正在C#MVC应用程序中对SQL数据库执行以下两个查询 问题1 问题2 在运行执行这些查询的方法时,每个查询都会挂起,并且我的应用程序的下一页通常不会加载超过一分钟,或者在其中一个页面上超时。当我在SQL Server中运行相同的查询时,每个查询都需要10到15秒才能运行,这仍然太长 我怎样才能加快速度?我从来没有创建过SQL索引,我不知道如何为每一个创建它,或者这是否是正确的方法 表1当前有20808805行和3列,表2有597707行和6列 表一 id(int, not null) ele

我正在C#MVC应用程序中对SQL数据库执行以下两个查询

问题1 问题2 在运行执行这些查询的方法时,每个查询都会挂起,并且我的应用程序的下一页通常不会加载超过一分钟,或者在其中一个页面上超时。当我在SQL Server中运行相同的查询时,每个查询都需要10到15秒才能运行,这仍然太长

我怎样才能加快速度?我从来没有创建过SQL索引,我不知道如何为每一个创建它,或者这是否是正确的方法

表1当前有20808805行和3列,表2有597707行和6列

表一

id(int, not null)
element(char(9), not null)
value(real, null)
表二

id(int, not null)
name(char(7), null)
time(datetime, null)
type(char(5), null)
grade(char(4), null)
product(char(14), null)

首先,正如Robert Co所说,table two.name上的索引将有助于提高性能

另外,tableone.id和tabletwo.id上是否有索引?考虑到它们看起来像主键,我会确定有。如果没有,您肯定需要为它们设置索引。我可以看到Table1到Table2是一个多对一的关系,这意味着表1上可能没有主键您确实需要在tableone上添加一个主键,例如tableoneid,并使其成为聚集索引

我认为另一个原因是,您的tableone比tabletwo大得多,而tabletwo又受到where子句(name='name')的进一步限制。这意味着您要将一个大表(tableone)连接到一个小表(带有where子句的Table2)在SQL中,将大表连接到小表的速度会很慢。

我可以考虑的解决方案是,也许您可以将一些列(例如“type”)移动到tableone,这样您就可以在查询中将tableone限制在一个小集合中

Select DISTINCT element FROM dbo.tableone
INNER JOIN dbo.tabletwo ON dbo.tableone.id = dbo.tabletwo.id
Where tableone.type = 'some type' and name = '" + Name + "'"

我不太确定这些建议是否适合您的数据模型,我只是希望它们能有所帮助。

首先,正如罗伯特·柯所说,Table Two.name上的索引将有助于提高性能

另外,tableone.id和tabletwo.id上是否有索引?考虑到它们看起来像主键,我会确定有。如果没有,您肯定需要为它们设置索引。我可以看到Table1到Table2是一个多对一的关系,这意味着表1上可能没有主键您确实需要在tableone上添加一个主键,例如tableoneid,并使其成为聚集索引

我认为另一个原因是,您的tableone比tabletwo大得多,而tabletwo又受到where子句(name='name')的进一步限制。这意味着您要将一个大表(tableone)连接到一个小表(带有where子句的Table2)在SQL中,将大表连接到小表的速度会很慢。

我可以考虑的解决方案是,也许您可以将一些列(例如“type”)移动到tableone,这样您就可以在查询中将tableone限制在一个小集合中

Select DISTINCT element FROM dbo.tableone
INNER JOIN dbo.tabletwo ON dbo.tableone.id = dbo.tabletwo.id
Where tableone.type = 'some type' and name = '" + Name + "'"

我不太确定这些建议如何适合您的数据模型,我只是希望它们能有所帮助。

10到15秒,有2000万行,没有索引?那还不错

正如Ethen Li所说,这一切都与索引有关。在理想情况下,您可以在过滤器(连接和位置)或ORDER BY中的所有列上创建索引。但是,由于这可能会严重影响更新和插入,所以您需要更实际,更不理想。根据您提供的信息,我建议创建以下索引: 在tableone(名称)上创建索引index1; 如果tableone.id是您的候选键(唯一标识行的键),您还应该在其上创建索引(可能是聚集的,这取决于id的生成方式):

在tableone(id)上创建唯一索引IX1TableOne

在tableone(id)上创建唯一的聚集索引IX1TableOne

对于tabletwo:对于ID和tableone同样适用-在ID上至少创建一个unqiue索引

有了这些索引,您应该会发现显著的性能改进

或者,要添加主键约束,请执行以下操作:

ALTER tableone添加约束pktableone主键集群(id)

ALTER TABLE tabletwo添加约束pktabletwo主键集群(id)


在tableone上,这可能需要一段时间,因为数据可能需要物理上重新排序。因此,在没有活动用户的维护期内执行此操作。

10到15秒,有2000万行,没有索引?那还不错

正如Ethen Li所说,这一切都与索引有关。在理想情况下,您可以在过滤器(连接和位置)或ORDER BY中的所有列上创建索引。但是,由于这可能会严重影响更新和插入,所以您需要更实际,更不理想。根据您提供的信息,我建议创建以下索引: 在tableone(名称)上创建索引index1; 如果tableone.id是您的候选键(唯一标识行的键),您还应该在其上创建索引(可能是聚集的,这取决于id的生成方式):

在tableone(id)上创建唯一索引IX1TableOne

在tableone(id)上创建唯一的聚集索引IX1TableOne

对于tabletwo:对于ID和tableone同样适用-在ID上至少创建一个unqiue索引

有了这些索引,您应该会发现显著的性能改进

或者,要添加主键约束,请执行以下操作:

ALTER tableone添加约束pktableone主键集群(id)

ALTER TABLE tabletwo添加约束pktabletwo主键集群(id)


在tableone上,这可能需要一段时间,因为数据可能需要物理上重新排序。因此,请在没有活动用户的维护期间执行此操作。

您需要提供两个表的表结构,以便我们提供帮助。你的C#代码也会有帮助。@rontornambe我已经提供了上面的结构。是的,名字上的索引将修复它。感觉到的10到15秒没有
Select DISTINCT element FROM dbo.tableone
INNER JOIN dbo.tabletwo ON dbo.tableone.id = dbo.tabletwo.id
Where tableone.type = 'some type' and name = '" + Name + "'"