c# - SQL 索引表连接

标签 c# sql sql-server join

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

查询1

SELECT tableone.id, name, time, type, grade, product, element, value
FROM dbo.tableone INNER JOIN dbo.tabletwo ON dbo.tableone.id = dbo.tabletwo.id
Where name = '" + Name + "' Order By tableone.id Asc, element

查询2

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

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

我怎样才能加快它们的速度?我从未创建过 SQL 索引,我不确定如何为其中的每一个创建它,或者这是否是正确的路径。

Tableone 目前有 20808805 行和 3 列,tabletwo 有 597707 行和 6 列。

table 一

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 所说,tabletwo.name 上的索引将有助于提高性能。

另外,tableone.id 和tabletwo.id 有索引吗?我假设有,因为它们看起来像主键。如果没有,您肯定需要在它们上放置索引。我可以看到 tableone 到 tabletwo 是多对一的关系,这意味着您可能在 table one 上没有主键。 你真的需要在tableone上添加一个主键,比如tableoneid,并让它成为聚簇索引!

我认为这里的另一个原因是,您的 tableone 比 tabletwo 大得多,后者受 where 子句 (name = 'Name') 限制得更小。这意味着您正在将一个大表 (tableone) 连接到一个小表 (带有 where 子句的 tabletwo)。 在 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 + "'"

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

关于c# - SQL 索引表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15855960/

相关文章:

c# - 绑定(bind)在 treeview WPF 中无法正常工作

sql-server - 带有 DateTime2 列的 SSIS 数据流 CSV 到 SQL Server

sql-server - 列中的循环 IDENTITY 编号

sql-server - 创建新组织时出错(部署管理器)

c# - 正则表达式从 HTML 中删除所有跨度,保持内部文本不变

C# 从BackgroundWorker 更新DataGridView

c# - 如何强制 wpf 中的文本框在单元测试中调用 OnLostFocus?

mysql - 从多个表中获取多个值

mysql - 具有不同值的 SQL 查询

php - 使用 PHP 从 MySQL 表进行计算