КОНТРОЛЬНАЯ СУММА () коллизии в SQL Server 2005

Swift 4 с функционально-ориентированным подходом:

class TopAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)?
            .map { [110].copy() } as? [UICollectionViewLayoutAttributes]

        attributes?
            .filter { [110].representedElementCategory == .cell }
            .reduce([:]) {
                [110].merging([ceil($1.center.y): [$1]]) {
                    [110] + $1
                }
            }
            .values.forEach { line in
                let maxHeightY = line.max {
                    [110].frame.size.height < $1.frame.size.height
                }?.frame.origin.y

                line.forEach {
                    [110].frame = [110].frame.offsetBy(
                        dx: 0,
                        dy: (maxHeightY ?? [110].frame.origin.y) - [110].frame.origin.y
                    )
                }
            }

        return attributes
    }
}
9
задан Cade Roux 22 June 2009 в 19:42
поделиться

5 ответов

I не вижу, где добавление контрольной суммы даст вам что-нибудь при таком уровне коллизий. Даже одно столкновение - это слишком много, так как это приведет к тому, что вы подключитесь к неправильным данным. Если вы не можете гарантировать, что присоединитесь к правильной записи, бессмысленно, если это повысит производительность, но нарушит целостность данных. Похоже, это финансовые данные, поэтому вам лучше быть действительно уверенным, что ваши запросы не вернут плохие результаты. На самом деле вы можете списать или зачислить не те счета, если возникнут какие-либо конфликты.

Если вы действительно пойдете по этому пути, Марк прав, что вам следует, если вообще возможно, выполнить предварительное вычисление (добавление вычисления, которое должно произойти с каждым запись в многомиллионных таблицах записей вряд ли улучшит производительность, по моему опыту). Возможно, если вы можете выполнить предварительно вычисленный столбец (и вам понадобятся триггеры, чтобы поддерживать его в актуальном состоянии), вам может не потребоваться присоединение ко всем шести другим столбцам, чтобы избежать конфликтов. Тогда, возможно, вы улучшили производительность. Все, что вы можете сделать, это проверить свою теорию. Но убедитесь, что у вас нет никаких коллизий.

Рассматривали ли вы вместо этого использование суррогатного ключа, а затем уникального индекса для шести полей естественного ключа? Затем вы можете присоединиться к суррогатному ключу и, вероятно, это немного улучшит производительность. Невозможно эффективно объединить шесть столбцов (один - varchar) вместо одного суррогатного ключа. Судя по размеру данных, я понимаю, что это может быть сложнее рефакторинга, чем в непроизводственной системе, но на самом деле это может стоить времени простоя, чтобы навсегда исправить постоянные проблемы с производительностью. Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать.

Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать.

Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать.

7
ответ дан 4 December 2019 в 12:20
поделиться

Если ваша контрольная сумма снизит ее до 0,33% от данных, я бы сказал, что она работает нормально ... особенно если вы используете этот столбец в сочетании с другими (индексированными) столбцами .

Конечно, чтобы быть эффективным в качестве индекса, вы, вероятно, захотите вычислить и сохранить это значение при вставке / обновлении данных с некластеризованным индексом.

Конечно, регулярный индекс охвата по рассматриваемым столбцам может быть так же хорошо или лучше ...

2
ответ дан 4 December 2019 в 12:20
поделиться

Да, это тщательно исследовано и объяснено в этой ветке на форумах Sun : Новое в Java - отсутствие позднего связывания для статических методов

Несколько цитат:

Когда компилятор компилирует этот класс, он решает во время компиляции, какой именно метод вызывается для каждого вызова статического метода (это большая разница для вызовы нестатических методов: в этих случаях решение о точном вызове метода определяется только во время выполнения).

  • Найдите значение PRIMARY KEY в данных индекса.
  • Используйте Clustered Index Seek , чтобы найти строку PRIMARY KEY в таблице

Присоединение на ПЕРВИЧНЫЙ КЛЮЧ будет использовать только шаг 3 .

SQL Server , однако, достаточно умен, чтобы принять это во внимание, и если вы присоединитесь таким образом :

SELECT  *
FROM    main_table mt
JOIN    CUST_ACCT_PRFTBLT cap
ON      cap.HASH_KEY = mt.HASH_KEY
        AND cap.DATA_DT_ID = mt.DATA_DT_ID
        AND …
WHERE   mt.some_col = @filter_value

, он просто не будет использовать индекс на HASH_KEY , вместо этого он будет использовать единственный Clustered Index Seek и фильтр , чтобы убедиться, что значения хэша совпадают (и они всегда будут).

Резюме : просто присоединитесь к ПЕРВИЧНОМУ КЛЮЧУ .

Используя вторичный индекс, вам сначала нужно сделать бесполезный HASH_KEY поиск, а затем все еще необходимо присоединиться к PRIMARY KEY .

1
ответ дан 4 December 2019 в 12:20
поделиться

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

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

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

Поскольку некластеризованный индекс будет содержать ключи кластеризации или указатель кучи, вам понадобится либо а) небольшой ключ кластеризации (например, столбец идентификаторов int - 4-байтовый указатель), либо б) отсутствие кластерного индекса вообще (8 байтовый указатель).

Если ваши запросы не являются выборочными или если кластеризованный индекс линейной таблицы огромен (вся таблица за вычетом нескольких столбцов), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу? ). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.

Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.

столбец идентификаторов типа int - 4-байтовый указатель) или б) кластеризованный индекс отсутствует (8-байтовый указатель).

Если ваши запросы не являются выборочными, или если кластеризованный индекс таблицы строк огромен (вся таблица минус несколько columns), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу?). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.

Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.

столбец идентификаторов типа int - 4-байтовый указатель) или б) кластеризованный индекс отсутствует (8-байтовый указатель).

Если ваши запросы не являются выборочными, или если кластеризованный индекс таблицы строк огромен (вся таблица минус несколько columns), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу?). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.

Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.

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

Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.

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

Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.

1
ответ дан 4 December 2019 в 12:20
поделиться

What I've seen a lot of folks glossing over thus far is that CHECKSUM has a ton of collisions, by Microsoft's own admission. It's even worse than MD5, which has its fair share of meaningful collisions.

If you're looking to get a hash column, consider using HASHBYTES with SHA1 specified. SHA1 имеет гораздо менее значимые конфликты, чем MD5 или CHECKSUM . Следовательно, CHECKSUM никогда не следует использовать для определения уникальности строки, а скорее для быстрой проверки верности двух значений. Следовательно, ваша частота столкновений должна быть 0% с HASHBYTES , если только у вас нет повторяющихся строк (что, будучи ПК, никогда не должно происходить).

Имейте в виду, что HASHBYTES будет обрезать все, что больше 8000 байт, но ваш PK намного меньше этого (все объединено), так что у вас не должно возникнуть никаких проблем.

6
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: