C# 如何提高Sql查询的效率

C# 如何提高Sql查询的效率,c#,sql,sql-server-2008,C#,Sql,Sql Server 2008,我正在对大约250万个数据运行一个sql查询,但是它的计算速度非常慢。有没有办法让查询快速计算出特定的答案 我的问题是 SELECT COUNT(FarmerName) AS Total_Number_Of_Farmers FROM try WHERE FarmerName <> '-'" 选择COUNT(FarmerName)作为农民总数 从尝试 “法默那个名字在哪里?” 在“FarmerName”上尝试索引 CREATE INDEX FarmerNameIndex ON

我正在对大约250万个数据运行一个sql查询,但是它的计算速度非常慢。有没有办法让查询快速计算出特定的答案

我的问题是

SELECT COUNT(FarmerName) AS Total_Number_Of_Farmers 
FROM try  
WHERE FarmerName <> '-'"
选择COUNT(FarmerName)作为农民总数
从尝试
“法默那个名字在哪里?”

在“FarmerName”上尝试索引

CREATE INDEX FarmerNameIndex
ON try (Farmername)

此外,如果此字段是
NVarchar
,请将其更改为
varchar
,或使用
WHERE FarmerName N'-'”

尝试对“FarmerName”进行索引

CREATE INDEX FarmerNameIndex
ON try (Farmername)

此外,如果此字段为
NVarchar
,请将其更改为
varchar
,或使用
WHERE FarmerName N'-'“

通常,在SSMS中使用查询执行计划选项。这将提示您缺少索引。尽管建议的缺失索引并不总是可信的,但通过查看执行计划,您可以轻松地确定需要在哪一列上创建索引。尽量减少索引扫描和表扫描。尽可能将它们转换为索引搜索。这将大大提高性能


对于您的查询,正如@electrillama所建议的,应用“”将有额外的负担。最好使用“=”,这样就可以使用该列上的索引。

通常,在SSMS中使用查询执行计划选项。这将提示您缺少索引。尽管建议的缺失索引并不总是可信的,但通过查看执行计划,您可以轻松地确定需要在哪一列上创建索引。尽量减少索引扫描和表扫描。尽可能将它们转换为索引搜索。这将大大提高性能

create INDEX FarmerNameIndex
ON try (Farmername)
对于您的查询,正如@electrillama所建议的,应用“”将有额外的负担。最好使用“=”,这样就可以使用该列上的索引

create INDEX FarmerNameIndex
ON try (Farmername)
然后执行与上面所写相同的查询

 select COUNT(FarmerName) Total_Number_Of_Farmers 
 FROM try  
 where FarmerName <> '-'"
选择计数(农场主名称)农场主总数
从尝试
“法默那个名字在哪里?”
注意:尝试将数据类型设置为父名称所需的最小值

然后执行与上面所写相同的查询

 select COUNT(FarmerName) Total_Number_Of_Farmers 
 FROM try  
 where FarmerName <> '-'"
选择计数(农场主名称)农场主总数
从尝试
“法默那个名字在哪里?”


注意:尝试将数据类型设置为父亲姓名所需的最小值。

向我们展示您的完整任务,以便我们可以对此进行思考。加快此速度的唯一方法是向
农场名称
列添加特定索引。@user1056466请检查此处,因为运算符是
,索引不太可能用于FarmerName。如果运算符为
=
,则可能会使用它。@如果SQL Server在内部进行转换以查找所有等于“-”的记录,然后从表中的总记录中减去,则可能会有所帮助。从表中获取总计数将非常有助于向我们展示您的整个任务,以便我们能够稍微考虑一下。加快此速度的唯一方法是向
FarmerName
列添加特定的索引。@user1056466请检查此处,因为运算符是
,所以不太可能在FarmerName上使用索引。如果运算符为
=
,则可能会使用它。@如果SQL Server在内部进行转换以查找所有等于“-”的记录,然后从表中的总记录中减去,则可能会有所帮助。从一个表中获取总计数将是非常重要的。转换一个小字符串文本的成本应该是无穷小的。索引将是一个非常好的主意,尽管.query将保持不变。抱歉,但我不明白,nvarchar和varchar与使用过滤索引有什么关系?如果您总是在SELECT查询中使用相同的筛选器,那么您不应该使用它吗?我的意思是,除了列中的数据本身占用太多空间之外。Tilak先生,仅使用上述查询,它将自动创建索引…或者我必须执行更多操作。
create index…
将创建索引,然后重新运行查询@kahn的想法是减少/消除隐式转换,通过使类型的两侧相同(即,如果字段为varchar,则与varchar匹配,如果字段为nvarchar,则与nvarchar匹配),对微小字符串文本进行转码的成本应该是无穷小的。索引将是一个非常好的主意,尽管.query将保持不变。抱歉,但我不明白,nvarchar和varchar与使用过滤索引有什么关系?如果您总是在SELECT查询中使用相同的筛选器,那么您不应该使用它吗?我的意思是,除了列中的数据本身占用太多空间之外。Tilak先生,仅使用上述查询,它将自动创建索引…或者我必须执行更多操作。
create index…
将创建索引,然后重新运行查询@kahn的想法是通过使类型的两侧相同(即如果字段为varchar,则与varchar匹配,如果字段为nvarchar,则与nvarchar匹配)来减少/删除隐式转换