Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance RavenDb性能问题?_Performance_Ravendb - Fatal编程技术网

Performance RavenDb性能问题?

Performance RavenDb性能问题?,performance,ravendb,Performance,Ravendb,我正在运行一个测试,比较使用RavenDB作为DB后端与使用MSSQL的实体框架 我有我的测试应用程序设置来检查RavenDB在启动时是否有任何文档,如果没有,它会通过Entity Framework查询SQL数据库以获取所有对象(大约31000项),然后将它们插入RavenDB。这部分工作正常 然后我运行测试。我向EF查询一组记录并将其转换为JSON,然后对Raven重复相同的操作(获得完全相同的记录集)。我预计Raven会更快,因为它是为读取而优化的,EF必须在两个表上连接以获取数据。但事实

我正在运行一个测试,比较使用RavenDB作为DB后端与使用MSSQL的实体框架

我有我的测试应用程序设置来检查RavenDB在启动时是否有任何文档,如果没有,它会通过Entity Framework查询SQL数据库以获取所有对象(大约31000项),然后将它们插入RavenDB。这部分工作正常

然后我运行测试。我向EF查询一组记录并将其转换为JSON,然后对Raven重复相同的操作(获得完全相同的记录集)。我预计Raven会更快,因为它是为读取而优化的,EF必须在两个表上连接以获取数据。但事实并非如此

以下是测试的输出:

Entity Framework with MS SQL    RavenDB Percent Difference Raven to EF
796.8954 ms (862 records)   1703.1686 ms (862 records)  213.725490196078
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
296.8826 ms (862 records)   765.6446 ms (862 records)   257.894736842105
312.508 ms (862 records)    765.6446 ms (862 records)   245
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
359.3842 ms (862 records)   765.6446 ms (862 records)   213.04347826087
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   812.5208 ms (862 records)   288.888888888889
265.6318 ms (862 records)   781.27 ms (862 records) 294.117647058824
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   828.1462 ms (862 records)   294.444444444444
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
328.1334 ms (862 records)   750.0192 ms (862 records)   228.571428571429
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
312.508 ms (862 records)    781.27 ms (862 records) 250
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
312.508 ms (862 records)    781.27 ms (862 records) 250
281.2572 ms (862 records)   734.3938 ms (862 records)   261.111111111111
protected void Page_Load(object sender, EventArgs e)
        {

            int totalTests = 25;


            DataTable dt = new DataTable();
            dt.Columns.Add("Entity Framework with MS SQL");
            dt.Columns.Add("RavenDB");
            dt.Columns.Add("Percent Difference Raven to EF");

            for (int i = 1; i <= totalTests; i++)
            {

                string efMilliseconds = string.Empty;
                string ravenMilliseconds = string.Empty;

                double efMS = 0;
                double ravenMS = 0;

                // EF
                using (tamcEntitiesForRavenTest myObjectContext = new tamcEntitiesForRavenTest())
                {
                    DateTime startTime = DateTime.Now;
                    List<Treatment> efTreatments = myObjectContext.Treatments.Include("Segments").Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).ToList();
                    string json = JsonConvert.SerializeObject(efTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    efMS = TotalTime.TotalMilliseconds;
                    efMilliseconds = string.Format("{0} ms ({1} records)", efMS.ToString(), efTreatments.Count);
                }

                // Raven
                using (var session = DataDocumentStore.Instance.OpenSession())
                {
                    DateTime startTime = DateTime.Now;
                    List<RavenTreatment> ravenTreatments = session.Query<RavenTreatment>().Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).Take(1000).ToList();
                    string json = JsonConvert.SerializeObject(ravenTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    ravenMS = TotalTime.TotalMilliseconds;
                    ravenMilliseconds = string.Format("{0} ms ({1} records)", ravenMS.ToString(), ravenTreatments.Count);
                }

                DataRow dr = dt.NewRow();
                dr[0] = efMilliseconds;
                dr[1] = ravenMilliseconds;
                double percentDifference = (ravenMS * 100) / efMS;
                dr[2] = percentDifference;

                dt.Rows.Add(dr);
            }

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
以下是用于运行测试的代码:

Entity Framework with MS SQL    RavenDB Percent Difference Raven to EF
796.8954 ms (862 records)   1703.1686 ms (862 records)  213.725490196078
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
296.8826 ms (862 records)   765.6446 ms (862 records)   257.894736842105
312.508 ms (862 records)    765.6446 ms (862 records)   245
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
359.3842 ms (862 records)   765.6446 ms (862 records)   213.04347826087
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   796.8954 ms (862 records)   283.333333333333
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   812.5208 ms (862 records)   288.888888888889
265.6318 ms (862 records)   781.27 ms (862 records) 294.117647058824
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
281.2572 ms (862 records)   828.1462 ms (862 records)   294.444444444444
281.2572 ms (862 records)   781.27 ms (862 records) 277.777777777778
328.1334 ms (862 records)   750.0192 ms (862 records)   228.571428571429
296.8826 ms (862 records)   750.0192 ms (862 records)   252.631578947368
312.508 ms (862 records)    781.27 ms (862 records) 250
296.8826 ms (862 records)   796.8954 ms (862 records)   268.421052631579
281.2572 ms (862 records)   765.6446 ms (862 records)   272.222222222222
312.508 ms (862 records)    781.27 ms (862 records) 250
281.2572 ms (862 records)   734.3938 ms (862 records)   261.111111111111
protected void Page_Load(object sender, EventArgs e)
        {

            int totalTests = 25;


            DataTable dt = new DataTable();
            dt.Columns.Add("Entity Framework with MS SQL");
            dt.Columns.Add("RavenDB");
            dt.Columns.Add("Percent Difference Raven to EF");

            for (int i = 1; i <= totalTests; i++)
            {

                string efMilliseconds = string.Empty;
                string ravenMilliseconds = string.Empty;

                double efMS = 0;
                double ravenMS = 0;

                // EF
                using (tamcEntitiesForRavenTest myObjectContext = new tamcEntitiesForRavenTest())
                {
                    DateTime startTime = DateTime.Now;
                    List<Treatment> efTreatments = myObjectContext.Treatments.Include("Segments").Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).ToList();
                    string json = JsonConvert.SerializeObject(efTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    efMS = TotalTime.TotalMilliseconds;
                    efMilliseconds = string.Format("{0} ms ({1} records)", efMS.ToString(), efTreatments.Count);
                }

                // Raven
                using (var session = DataDocumentStore.Instance.OpenSession())
                {
                    DateTime startTime = DateTime.Now;
                    List<RavenTreatment> ravenTreatments = session.Query<RavenTreatment>().Where(x => x.Jurisdiction == "00145").OrderBy(x => x.Treatment_Date).Take(1000).ToList();
                    string json = JsonConvert.SerializeObject(ravenTreatments);
                    TimeSpan TotalTime = DateTime.Now - startTime;
                    ravenMS = TotalTime.TotalMilliseconds;
                    ravenMilliseconds = string.Format("{0} ms ({1} records)", ravenMS.ToString(), ravenTreatments.Count);
                }

                DataRow dr = dt.NewRow();
                dr[0] = efMilliseconds;
                dr[1] = ravenMilliseconds;
                double percentDifference = (ravenMS * 100) / efMS;
                dr[2] = percentDifference;

                dt.Rows.Add(dr);
            }

            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
受保护的无效页面加载(对象发送方,事件参数e)
{
整数测试=25;
DataTable dt=新的DataTable();
添加(“带有MS SQL的实体框架”);
dt.列添加(“RavenDB”);
dt.列。添加(“Raven到EF的百分比差异”);
对于(int i=1;i x.辖区==“00145”).OrderBy(x=>x.Treatment_Date).ToList();
字符串json=JsonConvert.SerializeObject(EFT);
TimeSpan TotalTime=DateTime.Now-startTime;
efMS=TotalTime.Total毫秒;
efMS=string.Format(“{0}ms({1}记录)”,efMS.ToString(),efTreatments.Count);
}
//乌鸦
使用(var session=DataDocumentStore.Instance.OpenSession())
{
DateTime startTime=DateTime.Now;
List ravenTreatments=session.Query().Where(x=>x.judiction==“00145”).OrderBy(x=>x.Treatment\u Date).Take(1000).ToList();
字符串json=JsonConvert.SerializeObject(ravenTreatments);
TimeSpan TotalTime=DateTime.Now-startTime;
ravenMS=TotalTime.total毫秒;
ravenMilliseconds=string.Format(“{0}ms({1}记录)”,ravenMS.ToString(),ravenTreatments.Count);
}
DataRow dr=dt.NewRow();
dr[0]=ef毫秒;
dr[1]=ravenmillishes;
双百分比差异=(ravenMS*100)/efMS;
dr[2]=百分比差异;
dt.Rows.Add(dr);
}
GridView1.DataSource=dt;
GridView1.DataBind();
}
我让RavenDB实例与SQL server在同一台机器上运行


这是预期的绩效结果吗?或者是我做错了什么。

阿曼达,你需要明白,不是RavenDB本身比sql server更快。MSSQL已经推出多年了,您可以确信它是极其微观优化的,并在批量选择场景(如上面所示)中为您提供尽可能最好的结果。这不是RavenDB有机会击败MSSQL这样的产品的地方

然而,虽然不是数据库本身造成了差异,但在大多数情况下,是应用程序及其数据访问策略将为您带来raven所著名的闪电般的性能


整个过程是关于文档数据库如何允许您构造数据(聚合根、非规范化引用、预计算索引等)。这并不是RavenDB特有的,因为您也可以使用MongoDB和CouchDB来完成这些事情,所以这些数据库之间最本质的区别可能是,raven为您提供了非常好、简单的.NET体验,并且具有现成的多文档事务。还有许多其他的优点,但这些优点通常会让您在不同的数据库之间做出选择。

您是否可以选择Where()、OrderBy()和Take()IQueryable?你是让过滤发生在Raven上,还是你要取回所有的行并在内存中进行过滤?我的印象是Raven会应用我的where和order by并接管服务器。运行时,我会看到是否为where和order by子句创建临时索引,所以在我看来它正在服务器上运行。哦,如果您知道将使用这些索引,请显式地创建这些索引。这样,您就不会因为创建它们而影响性能。(删除了性能上的一个变量)@amanda RavenDB是一个“文档数据库”,我认为它非常适合这样做。如果我使用RavenDB的目的不仅仅是使用文档,那么我的猜测是,尝试设计数据库以获得最佳性能,就像使用SQL一样。尽管如此,我不会将DB用于它不打算用于的用途,无论它使用起来多么令人兴奋!