【问题标题】:Server side paging & sorting and filtering Performance服务器端分页&排序过滤性能
【发布时间】:2018-10-21 17:56:08
【问题描述】:

我在数据库中只有一张包含 200 万条记录的表,我希望用户能够浏览数据并能够对数据进行排序和过滤。 用户也应该能够在页面之间导航

这是我的 MVC 控制器

 public class AssetController : Controller
    {

        private ApplicationDbContext _dbContext;

        public ApplicationDbContext DbContext
        {
            get
            {
                return _dbContext ?? HttpContext.GetOwinContext().Get<ApplicationDbContext>();
            }
            private set
            {
                _dbContext = value;
            }

        }

        public AssetController()
        {

        }

        public AssetController(ApplicationDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        // GET: Asset
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Get([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestModel)
        {
            IEnumerable<Asset> query = DbContext.Assets;
            var totalCount = query.Count();

            #region Filtering
            // Apply filters for searching
            if (requestModel.Search.Value != string.Empty)
            {
                var value = requestModel.Search.Value.Trim();
                query = query.Where(p => p.Barcode.Contains(value) ||
                                         p.Manufacturer.Contains(value) ||
                                         p.ModelNumber.Contains(value) ||
                                         p.Building.Contains(value)
                                   );
            }

            var filteredCount = query.Count();

            #endregion Filtering

            #region Sorting
            // Sorting
            var sortedColumns = requestModel.Columns.GetSortedColumns();
            var orderByString = String.Empty;

            foreach (var column in sortedColumns)
            {
                orderByString += orderByString != String.Empty ? "," : "";
                orderByString += (column.Data) + (column.SortDirection == Column.OrderDirection.Ascendant ? " asc" : " desc");
            }

            query = query.OrderBy(orderByString == string.Empty ? "BarCode asc" : orderByString);

            #endregion Sorting

            // Paging
            query = query.Skip(requestModel.Start).Take(requestModel.Length);


            var data = query.Select(asset => new
            {
                AssetID = asset.AssetID,
                BarCode = asset.Barcode,
                Manufacturer = asset.Manufacturer,
                ModelNumber = asset.ModelNumber,
                Building = asset.Building,
                RoomNo = asset.RoomNo,
                Quantity = asset.Quantity
            }).ToList();

            return Json(new DataTablesResponse(requestModel.Draw, data, filteredCount, totalCount), JsonRequestBehavior.AllowGet);
        }

    }

下面是index.cshtml

<div class="row">
    <div class="col-md-12">
        <div class="panel panel-primary list-panel" id="list-panel">
            <div class="panel-heading list-panel-heading">
                <h1 class="panel-title list-panel-title">Properties</h1>
            </div>
            <div class="panel-body">
                <table id="datatable" class="table table-striped table-bordered" style="width:100%;">
                    <thead>
                        <tr>
                            <th>BarCode</th>
                            <th>Manufacturer</th>
                            <th>Building</th>
                            <th>Quantity</th>
                        </tr>
                    </thead>
                </table>
            </div>
        </div>
    </div>
</div>

@section Scripts
{
    <script type="text/javascript">
        $(document).ready(function () {
            var datatableInstance = $('#datatable').DataTable({
                serverSide: true,
                processing: true,
                "ajax": {
                    "url": "@Url.Action("Get","Asset")"
                },
                lengthMenu: [[10, 25, 50, 100], [10, 25, 50, 100]],
                columns: [
                    { 'data': 'BarCode' },
                    { 'data': 'Manufacturer' },
                    {
                        'data': 'Building',
                        'searchable': true,

                    },
                    {
                        'data': 'Quantity',
                        'searchable': true,
                        'render': function (Quantity) {
                            return "$ " + Quantity;
                        }
                    },
                ],

            });

        });  
    </script>

}

我使用了 JQuery 数据表,如果我的行数很少 - 少于 100000,代码可以正常工作,但如果我有大量行,它会变得非常糟糕

下一行耗时太长

var filteredCount = query.Count();

如何提高性能

【问题讨论】:

  • 你试过query.query().Count()?stackoverflow.com/questions/22186674/…
  • query() 方法未找到
  • 您正在构建一个包含 4 个不能使用索引的 LIKE '%...&amp;% 子句的查询。你期待什么样的表现?
  • 我需要制作过滤器 - 你能帮忙吗?
  • 我有同样的计数性能问题。我正在分页,所以只检索前十行,但表很大,所以计数正在扼杀性能。这里有任何更新或建议吗??

标签: c# jquery asp.net-mvc entity-framework datatables


【解决方案1】:

在我看来,改为执行“var totalCount = query.Count();”尝试做一个对表进行计数的sql语句,可能你会得到更好的性能。

var totalCount = _context.SqlQuery("Select count(0) from yourTable").FirstOrDefault();

我还没有测试过 Count() 的性能,但是 Distinc() 的差异是显着的。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多