标签: sql-server-ce

什么是SQL Like运算符的合适替代品以提高性能?

我正在开发一个在Windows Mobile 6上运行的应用程序,它需要能够从项目表格中检索包含给定字符串(由最终用户提供)的项目表中的所有项目.问题是表中大约有170,000个项目.由于我需要在描述中的任何位置返回包含字符串的所有项目,因此我不得不使用LIKE%string%,这样就无法使用索引.数据和表结构最初基于Progress数据库,它在任何单词索引字段上都有一个精彩的包含运算符.我们的移动应用程序不是这种情况,因为它使用的是SQL Server Compact 3.5.

基本上,我的DAL运行查询并检索SqlCeDataReader,然后使用ItemFactory创建仅包含匹配项的List对象.这显然可以让我们将域/业务对象与数据访问层分开.

精细和花花公子,除了在我搜索描述中包含类似"高尔夫"之类的所有项目时检索项目所需的8米和42秒.显然,这不是最终用户可接受的时间范围.

我的第一次尝试是使用SELECT*FROM Item"(在其中一个主索引字段上使用order by子句)从数据库中检索所有项目.此时,我在运行SqlCeDataReader时运行了IndexOf检查如果项目包含所请求的描述文本,则ItemFactory仅向List对象添加项目.这将速度提高到1m 46s.不是太破旧,但仍然太慢.

然后我尝试了另一种显示出承诺的方法......几乎......当应用程序启动时,我尝试创建一个包含数据库中所有项目对象的List(大约需要2分钟来运行查询并填充整个列表,但是至少它只是一次,因为应用程序正在初始化......仍然......呃).一旦列表完成,我可以轻松地在该列表上运行查询,执行以下操作(我希望我的语法正确...我现在不工作,我没有在PC上使用Visual Studio我坐在那里:

List<Item> specificItems = 
    AllItems.FindAll(i => i.Description.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0);
Run Code Online (Sandbox Code Playgroud)

这种方法将其降至21秒.非常好(虽然在宏伟的计划中仍然很慢).但是,问题是如果我从数据库加载所有项目,内存使用量太大了.在初始加载期间,我必须切断最后20,000个项目(所以21s时间框架可能更像是25s),因为抛出了OutOfMemoryException.根据模拟器上的内存管理器,我仍然有大约20 MB的空闲RAM,但我听说一个进程只能有32 MB或RAM相关联(不确定WM 6是否属实,但它出现了所以).

为了确保它不是因为我使用List对象来保存所有项目(我在构造函数中实例化了所需的容量以避免动态调整大小),我也读过它可能会导致额外的内存使用量implicity调用EnsureCapacity,我尝试使用Item []数组(提前调整大小).这仍然存在内存问题,尺寸差异可以忽略不计.

好吧漫无边际.我知道我可能会有一些如何限制datareader从数据库返回的记录(通过对不同类型字段的一些索引搜索),然后可能会在较小的项目子集上使用indexOf来获得最大性能(因此一起跳过Like运算符).这将导致最终用户不仅必须输入描述搜索(可能是项目层次结构信息以限制在其中搜索的项目类型).

有任何想法吗?我是以错误的方式来做这件事的吗?

谢谢你的聆听(对不起这篇文章很长,我有点大声思考).

哦,我应该添加(只是总结)我正在使用的东西:

  • Windows Mobile 6
  • Sql Server Compact Edition 3.5
  • C#3.5

更新:虽然下面提到的Bloom Filter方法看起来很有趣,但我无法满足一个要求(我上面没有真正说明).我无法真正匹配其他词语中包含的词语(例如"俱乐部"不会返回"俱乐部").因此,我被迫完全使用不同的方法(Kent Fredric ......感谢你指出这一点).我已经将Kent的答案标记为正确,因为他的方法是满足最多要求的(Mitch,你的问题与Jaunder建议的Bloom过滤器类似).但是,我采用了不同的方法(现在......),而不是他的方式.

我所做的是将所有项目对象拉入内存,只有项目编号和描述(这使其保持在内存限制之下,但它仍然会导致比我喜欢的更长的初始化...多线程并在后台加载该信息而应用程序正在运行可以照顾我猜).为了执行搜索,我编写了自己的包含例程.该例程使用非托管c#代码编写,该代码使用两个指针和几个循环来运行描述和所需的匹配文本.如果它在描述中的任何位置找到匹配项,则会将项目编号添加到数组中.搜索完所有项目后,新查询将返回到数据库并仅捕获匹配的项目编号(由于整数字段上的索引,该编号非常快).然后,这些项目在List中创建,包含所有信息(不仅仅是项目编号和描述).整个操作大约需要5-10秒(取决于描述),这对于现在来说已经足够了.

我仍然会考虑进一步优化它(可能能够跟踪搜索项的字符数...如果项目描述中剩余的字符少于所需的文本,则循环可以继续直接到下一个项目) .

任何建议仍然欢迎.现在我已将肯特的答案标记为我的问题"最正确".

向Dolch道具,帮助我编写包含例程.

performance memory-management windows-mobile sql-server-ce sql-like

6
推荐指数
2
解决办法
2001
查看次数

sql server compact edition数据编辑器

是否有任何gui /工具允许您编辑ssce db文件中的数据?

像sql server管理工作室,它允许你在sql express +中选择一个表,并使用网格接口编辑 - 添加/更新/删除该表中的数据!

sql-server-ce

6
推荐指数
2
解决办法
5207
查看次数

在SQL Server Management Studio中查看SQL CE数据库的所有ntext列文本

我经常想对SQL Server Management Studio(SSMS)中的大型文本列的值进行"快速检查".在网格结果模式下,SSMS允许您查看的最大字符数为65535.(在文本结果模式中它甚至更少.)有时我需要查看超出该范围的内容.使用SQL Server 2005数据库,我经常使用将其转换为XML的技巧,因为SSMS允许您以这种方式查看更大量的文本:

SELECT CONVERT(xml, MyCol) FROM MyTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

但是现在我使用的是SQL CE,并且没有Xml数据类型.选项下仍有"最大字符重新获取的XML"值; 我想这在连接到其他数据源时很有用.

我知道我可以通过运行一个小的控制台应用程序或其他东西来获得全部价值,但在SSMS中是否有办法查看整个ntext列值?

[编辑]好的,这第一次没有引起太多关注(18次观看?!).这不是一个大问题,但也许我只是沉迷于它.这周必须有一些好方法,不是吗?因此,适度的赏金是活跃的.从最好到最差的顺序,我愿意接受的答案是:

  1. 一种解决方案,与SQL CE中的XML技巧一样简单.也就是说,完成这项工作的单一功能(转换,演员等).
  2. 破解SSMS以使其在结果中显示更多文本的非侵入性方法.
  3. 一个等效的SQL查询(可能是创造性地使用SUBSTRING并生成多个ad-hoc列的东西)来查看结果.

该解决方案应该与SSMS的SQL CE中任意长度的nvarchar和ntext列一起使用.有任何想法吗?

sql-server ssms sql-server-ce

6
推荐指数
1
解决办法
2万
查看次数

我可以在Mono上使用SQL Server Compact Edition CE吗?

有谁知道我是否可以在单声道上使用SQL Server Compact Edition 3.5?

我希望它们是作为托管程序集编写的,并且可以正常工作.任何人都有经验吗?

sql mono sql-server-ce

6
推荐指数
2
解决办法
7364
查看次数

使用Entity Framework时如何设置最大数据库大小?

我在我的WPF应用程序中使用Entity Framework和SQL CE 4.0.如何根据本文设置最大数据库大小,http://blogs.msdn.com/b/sqlservercompact/archive/2007/06/13/the-story-of-max-database-size-connection- string-parameter.aspx,其中指出:

我们并不总是增长到4 GB,分配共享内存以容纳支持4 GB的所有页面条目/引用是不明智的.

目前,我在尝试添加新数据时收到以下错误:

The database file is larger than the configured maximum database size.
Run Code Online (Sandbox Code Playgroud)

但是,DB只达到接近256MB,这与上面链接中的文章一致.

sql-server entity-framework sql-server-ce

6
推荐指数
2
解决办法
3988
查看次数

如何使用F#中的类型提供程序连接到SQL Server Compact Edition 4.0?

我正在尝试从F#连接到SQL Server Compact Edition数据库,并尝试使用类型提供程序.这是在Visual Studio 11 Beta中,所以我意识到可能存在一个问题,但我认为我更有可能还没有这方面的技术诀窍.

但是,我注意到Microsoft.FSharp.Data.TypeProviders中没有特定于CE的类型提供程序,我不确定常规SqlDataConnection是否可以解决问题,因此可能就是问题所在.

但是,当我尝试创建连接时,IDE似乎认识到我至少要尝试访问CE数据库.

所以,我有以下代码:

type SqlConnection = 
  Microsoft.FSharp.Data.TypeProviders
    .SqlDataConnection<ConnectionString = @"Data Source=C:\\Path\\Database.sdf">
let db = SqlConnection.GetDataContext()
Run Code Online (Sandbox Code Playgroud)

所以它非常标准,或多或少直接添加新的LINQ to SQL类型提供程序项菜单.

我在连接字符串上找到的工具提示是"Provider'System.Data.SqlServerCe.3.5'未安装." 看起来似乎表明它没有安装Sql Server CE是一个问题,但我有了库,能够使用常规SqlCEConnection连接到数据库并运行SqlCeCommands等.而且由于它是4.0而不是3.5,我不确定它是否正在寻找错误的提供商.我在VS 11 beta中创建了数据库,因此我认为所有版本都应该匹配等等.

简而言之,我想知道我做错了什么,或者VS11 beta类型提供程序库是否还不支持CE 4.0,或者我还需要做些什么来实现它.

谢谢!

f# sql-server-ce type-providers

6
推荐指数
1
解决办法
1341
查看次数

使用SQL Server Compact与专用SQL Server数据库的缺点

我想知道使用SQL Server Compact数据库(.sdf)和完整的数据库(例如SQL Server Express)之间的主要区别是什么?

是否有任何重大的性能问题,如果是这样,紧凑型数据库在开始注意到这个之前有多大?

在启动项目时,我发现使用紧凑型数据库是一个简单,直接和干净的解决方案,何时应该转换并转移到专用数据库?

c# .net-4.0 sql-server-express sql-server-ce

6
推荐指数
1
解决办法
7304
查看次数

SQL Compact中的Reseed标识列

是否可以重置紧凑数据库中的标识列?我找到了很多关于标准SQL Server的答案,但没有关于是否可以使用SQL CE的明确答案.

在我的场景中,删除和重新创建表格并不理想!

谢谢!

sql sql-server-ce

6
推荐指数
1
解决办法
5935
查看次数

DbContext没有在ASP.Net MVC中使用SQL Server Compact进行初始化

我在Visual Studion 2013 Express for Web中使用ASP.Net MVC模板创建了一个简单的项目.它不使用任何身份验证.然后我安装了EntityFramework(v6.0.1)EntityFramework.SqlServerCompact包.

我的DbContext类非常简单:

public class EditTestContext : DbContext
{
    public EditTestContext() : base("EditTestContext")
    {
    }

    public EditTestContext(string connectionString) : base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(
                       new DropCreateDatabaseIfModelChanges<EditTestContext>());
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Configurations.Add(new EditTestConfig());
    }
}
Run Code Online (Sandbox Code Playgroud)

实际的上下文对象是在Unit of Work类中创建的:

public class EditTestUoW:IEditTestUoW,IDisposable
{
    private DbContext dbContext;

    public EditTestUoW()
    {
        CreateDbContext();
    }

    private void CreateDbContext()
    {
        dbContext = new EditTestContext();//NEW DBCONTEXT OBJECT IS CREATED
        dbContext.Configuration.LazyLoadingEnabled = false;
        dbContext.Configuration.ProxyCreationEnabled = false;
        dbContext.Configuration.ValidateOnSaveEnabled = …
Run Code Online (Sandbox Code Playgroud)

entity-framework sql-server-ce dbcontext asp.net-mvc-4

6
推荐指数
1
解决办法
6696
查看次数

如何使用Visual Studio Tools for Git将跟踪文件移动到未跟踪

开始尝试使用git.无意中将项目中的所有文件添加到了团队资源管理器中的"包含的更改".我在最初的提交中承诺了所有.其中一个文件是SQL CE 4.0(基于文件)数据库.我明显在那里搞砸了.我不想跟踪数据库,也不想最终将数据库恢复到以前的某个点.

我的问题是我不知道如何将SQL CE 4.0 sdf文件从包含的更改移动到未跟踪.我对git没有经验,迄今为止我所知道的是团队资源管理器UI中提供给我的东西.

那么,如何将文件从(已提交和)跟踪移动到未跟踪?在成功操作结束时,我希望将sdf文件放在"未跟踪"的bin中,并希望将其从已经被推送到远程仓库的提交中删除.我只是不确切地知道从哪里开始和做什么

git sql-server-ce team-explorer visual-studio-2013

6
推荐指数
1
解决办法
7312
查看次数