gpt4 book ai didi

sql - Linq to SQL nvarchar问题

转载 作者:行者123 更新时间:2023-12-04 04:08:45 25 4
gpt4 key购买 nike

我在Linq to SQL中发现了一个巨大的性能问题。

使用字符串从表中选择时,即使sql表是varchar,传递给sql server的参数也始终是nvarchar。这导致表扫描而不是查找,这是一个巨大的性能问题。

var q = (
from a in tbl
where a.index == "TEST"
select a)

var qa = q.ToArray();

该参数作为nvarchar传递,这导致整个索引在使用前从varchar转换为nvarchar。

如果参数是varchar,则查找速度非常快。

有什么办法可以覆盖或更改此设置?

谢谢
问候
克雷格

最佳答案

嗯这是LINQ-to-SQL的RTM之前版本的一个已知错误,但是从我在线阅读的内容来看,这是RTM中相等比较的一个固定问题(尽管对于Contains()比较来说还是很困难)。

无论如何,这是MSDN论坛上的一个线程,其中包含一些详细的解决方法:
http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/4276ecd2-31ff-4cd0-82ea-7a22ce25308b

我最喜欢的解决方法是:

//define a query
IQueryable<Employee> emps = from emp in dc2.Employees where emp.NationalIDNumber == "abc" select emp;

//get hold of the SQL command translation of the query...
System.Data.Common.DbCommand command = dc2.GetCommand(emps);

//change param type from "string" (nvarchar) to "ansistring" (varchar)
command.Parameters[0].DbType = DbType.AnsiString;
command.Connection = dc2.Connection;

//run
IEnumerable<Employee> emps2 = dc2.Translate<Employee>(command.ExecuteReader());

顺便说一句,我看到的另一种情况是表中的值具有奇数分布(例如表的50%具有相同的值),这意味着,鉴于SQL Server在计划编译时不知道该参数,表扫描是最好的可用的计划。如果您的分配也不正常,则上述解决方法将不起作用,因为扫描不会来自丢失的转换,而是来自参数化本身。在那种情况下,我唯一知道的解决方法是使用OPTIMIZE FOR提示并手动指定SQL。

关于sql - Linq to SQL nvarchar问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com