Подтвердить что ты не робот

Управление сеткой в ​​SSMS

Я отмечаю в SSMS (SQL Server Management Studio 2016), результаты запроса возвращаются в мигание секунды (выше 10k + строк). Таблица результатов/сетка прокручивается совершенно гладко и имеет чрезвычайно низкий объем памяти (~ 80 МБ) в SSMS. Этот выход в виде сетки/просмотра похож на режим ListView (~ 200 МБ, 2-3 секунды) и DataGrid (~ 600 МБ, 8-10 секунд). Даже если я отключу всю визуализацию или настрою концентраторы или исправлю ее высоту, чтобы оптимизировать скорость, они по-прежнему намного отстают от сетки в SSMS, все еще с медленной прокруткой и графическим интерфейсом.

Что находится за элементом управления сеткой, используемым в SSMS, который делает его таким гладким?

введите описание изображения здесь

4b9b3361

Ответ 1

SSMS grid не С++, это не ListView или DataGrid, он не использует собственные средства управления Windows, это "просто" пользовательский элемент управления .NET с именем GridControl (в пространстве имен Microsoft.SqlServer.Management.UI.Grid), который принадлежит сборка с именем Microsoft.SqlServer.GridControl.dll.

Вы можете найти его в разных местах: в GAC, в %ProgramFiles(x86)%\Common Files\Microsoft Shared\SQL Server Developer Tools, в файлах Visual Studio и т.д.

Это не распространяемый двоичный AFAIK, поэтому вы не должны его отправлять, он не задокументирован, и это не полнофункциональная сетка, как другие. Однако, как вы выяснили, он легкий и может быть быстрым, так же быстро, как ваш базовый доступ к данным.

Если вы хотите поиграть с ним, вот небольшая пробная версия Winforms С# (сетка размером 10000 x 256, которая мгновенно открывается 2,5 миллионами ячеек), которая демонстрирует, как ее использовать:

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.UI.Grid;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private GridControl _control = new GridControl();

        public Form1()
        {
            InitializeComponent();

            for (int i = 0; i < 256; i++)
            {
                _control.AddColumn(new GridColumnInfo { HeaderType = GridColumnHeaderType.Text, IsUserResizable = true });
                _control.SetHeaderInfo(i, "Column " + i, null);
            }

            _control.Dock = DockStyle.Fill;
            _control.GridStorage = new GridStorage();
            Controls.Add(_control);
        }
    }

    // represents a datasource
    public class GridStorage : IGridStorage
    {
        public long EnsureRowsInBuf(long FirstRowIndex, long LastRowIndex)
        {
            return NumRows(); // pagination, dynamic load, virtualization, could happen here
        }

        public void FillControlWithData(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
        {
            // for cell edition
            control.SetCurSelectionAsString(GetCellDataAsString(nRowIndex, nColIndex));
        }

        public string GetCellDataAsString(long nRowIndex, int nColIndex)
        {
            // get cell data
            return nRowIndex + " x " + nColIndex;
        }

        public int IsCellEditable(long nRowIndex, int nColIndex)
        {
            return 1; // 1 means yes, 0 means false
        }

        public long NumRows()
        {
            return 10000;
        }

        public bool SetCellDataFromControl(long nRowIndex, int nColIndex, IGridEmbeddedControl control)
        {
            // when a cell has changed, you're supposed to change your data here
            return true;
        }

        public Bitmap GetCellDataAsBitmap(long nRowIndex, int nColIndex) => throw new NotImplementedException();
        public void GetCellDataForButton(long nRowIndex, int nColIndex, out ButtonCellState state, out Bitmap image, out string buttonLabel) => throw new NotImplementedException();
        public GridCheckBoxState GetCellDataForCheckBox(long nRowIndex, int nColIndex) => throw new NotImplementedException();
    }
}

Вот как это выглядит. Вы можете прокручивать без какого-либо замедления на достойном компьютере.

введите описание изображения здесь