LINQ to SQL效率比较低的几个地方

LINQ to SQL确实是个好东西。以前大量的SQL语句、存储过程可以转变成code去维护,可以充分保证数据库与对象的一致性。但是通过LINQ生成的SQL语句则存在着一些效率低的地方。以下是我发现的几个地方。

1、where语句中的bool(数据库里为bit)类型

var q=

from t in db.table

where t.c==false

select t;

其生成的SQL语句的where部分是 (NOT (c=1)),使用showplan_text看到的索引使用情况则是 index seek:c<1 or c>1,效率肯定要比index seek:c=0低吧。你还可以将t.c==false改为t.c!=true或者!t.c,结果都是一样的。

2、update/delete[这个不算,Attach可以解决!~~谢谢@不若相忘于江湖!]

有时候希望只通过主键便将记录更新或删除,而不是先通过主键获得对象,然后去更新或删除,通过LINQ to SQL却很难做到,也许做不到。其生成的update语句中的where部分将所有列都传进去,也许有助于保证数据库的数据的一致性,防止取出数据后别人将其修改,但是这样效率确实不高,而且很难加上索引区优化,在表中数据比较大量的情况下,update/delete都会比较慢。也许这种情况不得不通过存储过程去解决。

LINQ to SQL比较方便,省却了一些需要学习T-SQL的烦恼。但对于一个不熟悉T-SQL的人,则会很容易写出效率比较低的代码,尤其是写出比较复杂的代码的时候。

欢迎指点,谢谢!

相关推荐:

为什么Python爬虫在Linux服务器上运行效率高于Windows?

Linux内核epoll机制以O(1)复杂度高效调度海量socket,而Windows默认回退低效select层;Linux服务器精简无GUI、定时器精准、文件系统优化好、PyPI轮子编译更激进,综合性能显著优于Windows。 Linux内核对网络IO的调度更高效 Python爬虫本质是IO密集型...

如何提升Python中字符串频繁拼接的效率_利用join方法替代+号连接

字符串用+拼接在循环中极慢,因每次拼接都创建新字符串并复制全部内容,10000次导致O(n²)时间复杂度;推荐用"".join()或io.StringIO替代。 为什么字符串用+拼接在循环里特别慢 Python中字符串是不可变对象,每次用+拼接都会创建一个新字符串,原字符串内容被完整复制。循环100...

如何使用Python生成器提高大量数据的处理效率_通过yield关键字创建迭代器

yield的本质是暂停并交出控制权,而非返回值;调用生成器函数立即返回生成器对象,函数体不执行,仅在首次next()时运行至第一个yield并挂起,保存全部状态。 yield的本质不是“返回值”,而是“暂停并交出控制权”——调用生成器函数时,它立刻返回一个生成器对象,函数体根本不执行;只有第一次调用...