我习惯于由EF自动生成的同一数据的两个不同条件,但是执行性能LIKE 'blah%'
(以)开始时,只有一个不同的堆栈执行不到1秒,但是我何时尝试运行LIKE '%blah'
(以)结束,运行非常缓慢-超过40秒。关于EF等导致的超时异常(我知道如何延长超时时间),但是我只需要知道有什么区别,以及如何防止性能因这种微小差异而变慢。
答案 0 :(得分:1)
问题在于第二条语句的可持久性-基本上,该索引最终根本没有帮助,因为该索引不是为常量左侧的通配符搜索而设计的。想象一下,如果我要您给字典中以“ blah”开头的每个单词给我-这将非常容易,因为项目按字母顺序排序!另一方面,如果我要求您让每个包含“ blah”(但不一定以它开头)的单词为我,那么您将被困在每个单词的后面,并对它进行模式匹配。
您可能希望研究full text indexes,因为我认为它们更适合此类任务。
答案 1 :(得分:0)
我从here找到了解决EndsWith性能问题的解决方案。
CREATE INDEX rev_col_idx ON table (reverse(column) text_pattern_ops); -- is not required
SELECT * FROM table WHERE reverse(column) like reverse('%something')