Сжатие строк в SQL Server

Мне нужно вернуть ~ 70 000 строк из 4 столбцов INT в определенном порядке и может использовать только очень мелкое кэширование, поскольку данные, связанные с этим, крайне нестабильны и должны быть обновлены. Одним из свойств данных является то, что он часто очень повторяется, когда он в порядке.

Я начал рассматривать различные методы сокращения количества строк, чтобы уменьшить пропускную способность сети и время / ресурсы обработки на стороне клиента, но не удалось найти какой-либо метод в T-SQL, где я могу «сжимать» повторяющиеся строки вниз в одну строку и столбец «count». например

prop1 prop2 prop3 prop4 -------------------------------- 0 0 1 53 0 0 2 55 1 1 1 8 1 1 1 8 1 1 1 8 1 1 1 8 0 0 2 55 0 0 2 55 0 0 1 53 

В:

 prop1 prop2 prop3 prop4 count ----------------------------------------- 0 0 1 53 1 0 0 2 55 1 1 1 1 8 4 0 0 2 55 2 0 0 1 53 1 

Я бы оценил, что если бы это было возможно, во многих случаях то, что было бы результатом 70 000 строк, было бы до нескольких тысяч.

Я лаяю неправильное дерево здесь (есть ли неявное сжатие как часть протокола SQL Server)?

Есть ли способ сделать это (SQL Server 2005)?

Есть ли причина, по которой я не должен этого делать?

Благодарю.

    Это будет работать, хотя это больно смотреть на:

     ;WITH Ordering AS ( SELECT Prop1, Prop2, Prop3, Prop4, ROW_NUMBER() OVER (ORDER BY Y, X) RN FROM Props ) SELECT CurrentRow.Prop1, CurrentRow.Prop2, CurrentRow.Prop3, CurrentRow.Prop4, CurrentRow.RN - ISNULL((SELECT TOP 1 RN FROM Ordering O3 WHERE RN < CurrentRow.RN AND (CurrentRow.Prop1 <> O3.Prop1 OR CurrentRow.Prop2 <> O3.Prop2 OR CurrentRow.Prop3 <> O3.Prop3 OR CurrentRow.Prop4 <> O3.Prop4) ORDER BY RN DESC), 0) Repetitions FROM Ordering CurrentRow LEFT JOIN Ordering O2 ON CurrentRow.RN + 1 = O2.RN WHERE O2.RN IS NULL OR (CurrentRow.Prop1 <> O2.Prop1 OR CurrentRow.Prop2 <> O2.Prop2 OR CurrentRow.Prop3 <> O2.Prop3 OR CurrentRow.Prop4 <> O2.Prop4) ORDER BY CurrentRow.RN 

    Суть заключается в следующем:

    1. Перечислите каждую строку, используя ROW_NUMBER OVER, чтобы получить правильный порядок.
    2. Найдите максимальные значения за цикл, присоединившись только тогда, когда следующая строка имеет разные поля или когда следующая строка не существует.
    3. Вычислите количество повторений, взяв номер текущей строки (предположительно макс для этого цикла) и вычитая из нее максимальный номер строки предыдущего цикла, если он существует.

    Вы можете использовать функцию count ! Это потребует от вас использования предложения group by , где вы count как разбить или group себя. Gropu by используется для любой агрегатной функции в SQL.

     select prop1, prop2, prop3, prop4, count(*) as count from tbl group by prop1, prop2, prop3, prop4, y, x order by y, x 

    Обновление: ОП, упомянутые выше, упорядочены по y и x , а не по части набора результатов. В этом случае вы все равно можете использовать y и x как часть group by .

    Имейте в виду, что порядок ничего не значит, если у него нет упорядочивающих столбцов, поэтому в этом случае мы должны учитывать это с y и x в group by .

    70 000 строк из четырех целых столбцов на самом деле не беспокоят пропускную способность в современной локальной сети, если у вас не так много рабочих станций, выполняющих этот запрос одновременно; и в WAN с более ограниченной пропускной способностью вы можете использовать DISTINCT для устранения повторяющихся строк, подход, который был бы экономным с вашей пропускной способностью, но потребляющий некоторый серверный CPU. Опять же, однако, если у вас нет действительно перегруженного сервера, который всегда работает на пиковых нагрузках или вблизи них, это дополнительное потребление будет простым провалом. 70 000 строк почти ничего.

    Interesting Posts

    Различия в стандартном сетевом пакете: SqlConnection и SQL Server по умолчанию

    Какой порт работает на моем экземпляре SQL2008?

    Indexed View vs Indexes on Table

    Какова наилучшая практика для вставки записи, если она еще не существует?

    Как использовать MERGE, а затем разделить одну запись источника на более целевые записи?

    Что может привести к тому, что разрешения SQL Server будут меняться от одного выполнения хранимой процедуры до следующей?

    Производительность: несколько условных предложений WHERE или динамический запрос?

    Что представляет собой «высокий процессор» для SQL Server

    Должен ли я заставить MS SQL потреблять x объем памяти?

    Как заполнить два отдельных повторителя с отдельным именем столбца и значением, соответствующим столбцу

    SQL Server – используйте столбцы из основного запроса в подзапросе

    Почему столбец длины в SQL Server несколько запутан?

    Вопрос оптимизации запросов SQL Server

    Рефакторинг для вставки SQL-запросов

    Использование merge..output для получения сопоставления между source.id и target.id

    Давайте будем гением компьютера.