c#RavenDB嵌入式优化

时间:2013-04-01 22:48:21

标签: c# .net database optimization ravendb

我有一个数据库(RavenDB),它需要能够每10秒处理300次查询(全文搜索)。为了提高性能,我拆分了数据库,因此我有多个documentStores 我的代码:

            var watch = Stopwatch.StartNew();
        int taskcnt = 0;
        int sum = 0;


        for (int i = 0; i < 11; i++)
        {
            Parallel.For(0, 7, new Action<int>((x) =>
            {
                for(int docomentStore = 0;docomentStore < 5; docomentStore++)
                {
                    var stopWatch = Stopwatch.StartNew();
                    Task<IList<eBayItem>> task = new Task<IList<eBayItem>>(Database.ExecuteQuery, new Filter()
                    {
                        Store = "test" + docomentStore,
                        MaxPrice = 600,
                        MinPrice = 200,
                        BIN = true,
                        Keywords = new List<string>() { "Canon", "MP", "Black" },
                        ExcludedKeywords = new List<string>() { "G1", "T3" }
                    });
                    task.ContinueWith((list) => {
                        stopWatch.Stop();
                        sum += stopWatch.Elapsed.Milliseconds;
                        taskcnt++;
                        if (taskcnt == 300)
                        {
                            watch.Stop();
                            Console.WriteLine("Average time: " + (sum / (float)300).ToString());
                            Console.WriteLine("Total time: " + watch.Elapsed.ToString() + "ms");

                        }

                    });
                    task.Start();
                }

            }));
            Thread.Sleep(1000);

        }
  • 平均查询时间:514,13毫秒
  • 总时间:00:01:29.9108016

我查询ravenDB的代码:

        public static IList<eBayItem> ExecuteQuery(object Filter)
    {
        IList<eBayItem> items;
        Filter filter = (Filter)Filter;

        if (int.Parse(filter.Store.ToCharArray().Last().ToString()) > 4)
        {
            Console.WriteLine(filter.Store); return null;
        }
        using (var session = Shards[filter.Store].OpenSession())
        {
            var query = session.Query<eBayItem, eBayItemIndexer>().Where(y => y.Price <= filter.MaxPrice && y.Price >= filter.MinPrice);

            query = filter.Keywords.ToArray()
            .Aggregate(query, (q, term) =>
                q.Search(xx => xx.Title, term, options: SearchOptions.And));
            if (filter.ExcludedKeywords.Count > 0)
            {
                query = filter.ExcludedKeywords.ToArray().Aggregate(query, (q, exterm) =>
                q.Search(it => it.Title, exterm, options: SearchOptions.Not));
            }
            items = query.ToList<eBayItem>();
        }
        return items;
    }

RavenDB的初始化:

        static Dictionary<string, EmbeddableDocumentStore> Shards = new Dictionary<string, EmbeddableDocumentStore>();
    public static void Connect()
    {
        Shards.Add("test0", new EmbeddableDocumentStore() { DataDirectory = "test.db" });
        Shards.Add("test1", new EmbeddableDocumentStore() { DataDirectory = "test1.db" });
        Shards.Add("test2", new EmbeddableDocumentStore() { DataDirectory = "test2.db" });
        Shards.Add("test3", new EmbeddableDocumentStore() { DataDirectory = "test3.db" });
        Shards.Add("test4", new EmbeddableDocumentStore() { DataDirectory = "test4.db" });
        foreach (string  key in Shards.Keys)
        {
            EmbeddableDocumentStore store = Shards[key];
            store.Initialize();
            IndexCreation.CreateIndexes(typeof(eBayItemIndexer).Assembly, store);
        }
    }

如何优化代码以使我的总时间更短?将数据库划分为5个不同的数据库是否合适?

编辑:该程序只有1个documentStore而不是5.(由Ayende Rahien提取) 这也是查询本身:

Price_Range:[* TO Dx600] AND Price_Range:[Dx200 TO NULL] AND Title:(Canon) AND Title:(MP) AND Title:(Black) -Title:(G1) -Title:(T3)

2 个答案:

答案 0 :(得分:2)

不,这不好。 使用单个嵌入式RavenDB。如果你需要分片,这涉及多台机器。

通常,RavenDB查询每个都是几毫秒。你需要显示你的查询的样子(你可以在它们上面调用ToString()来查看)。

以这种方式拥有RavenDB的分片意味着它们都在争夺CPU和IO

答案 1 :(得分:0)

我知道这是一个老帖子,但这是我得到的最佳搜索结果。

我有同样的问题,我的查询花了500毫秒。现在,通过应用以下搜索实践需要100毫秒:http://ravendb.net/docs/article-page/2.5/csharp/client-api/querying/static-indexes/searching