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
}
}
I не вижу, где добавление контрольной суммы даст вам что-нибудь при таком уровне коллизий. Даже одно столкновение - это слишком много, так как это приведет к тому, что вы подключитесь к неправильным данным. Если вы не можете гарантировать, что присоединитесь к правильной записи, бессмысленно, если это повысит производительность, но нарушит целостность данных. Похоже, это финансовые данные, поэтому вам лучше быть действительно уверенным, что ваши запросы не вернут плохие результаты. На самом деле вы можете списать или зачислить не те счета, если возникнут какие-либо конфликты.
Если вы действительно пойдете по этому пути, Марк прав, что вам следует, если вообще возможно, выполнить предварительное вычисление (добавление вычисления, которое должно произойти с каждым запись в многомиллионных таблицах записей вряд ли улучшит производительность, по моему опыту). Возможно, если вы можете выполнить предварительно вычисленный столбец (и вам понадобятся триггеры, чтобы поддерживать его в актуальном состоянии), вам может не потребоваться присоединение ко всем шести другим столбцам, чтобы избежать конфликтов. Тогда, возможно, вы улучшили производительность. Все, что вы можете сделать, это проверить свою теорию. Но убедитесь, что у вас нет никаких коллизий.
Рассматривали ли вы вместо этого использование суррогатного ключа, а затем уникального индекса для шести полей естественного ключа? Затем вы можете присоединиться к суррогатному ключу и, вероятно, это немного улучшит производительность. Невозможно эффективно объединить шесть столбцов (один - varchar) вместо одного суррогатного ключа. Судя по размеру данных, я понимаю, что это может быть сложнее рефакторинга, чем в непроизводственной системе, но на самом деле это может стоить времени простоя, чтобы навсегда исправить постоянные проблемы с производительностью. Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать.
Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать. Только вы можете сказать, насколько сложным будет это изменение и насколько сложно будет изменить все sps или запросы на лучшее соединение. Тем не менее, возможно, есть смысл попробовать.Если ваша контрольная сумма снизит ее до 0,33% от данных, я бы сказал, что она работает нормально ... особенно если вы используете этот столбец в сочетании с другими (индексированными) столбцами .
Конечно, чтобы быть эффективным в качестве индекса, вы, вероятно, захотите вычислить и сохранить это значение при вставке / обновлении данных с некластеризованным индексом.
Конечно, регулярный индекс охвата по рассматриваемым столбцам может быть так же хорошо или лучше ...
Да, это тщательно исследовано и объяснено в этой ветке на форумах 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
.
Если ваши запросы являются выборочными, а кластерный индекс линейной таблицы узкий или отсутствует, тогда некластеризованный индекс по контрольной сумме в таблице строк должен обеспечивать хорошую производительность.
После применения любых критериев к таблице заголовков, она будет использовать контрольную сумму для выполнения поиска по некластеризованному индексу. Вам по-прежнему необходимо включить FK в соединение, но критерии соединения без контрольной суммы будут применяться после поиска по индексу, поиска после закладки. Очень эффективно.
Вы хотите оптимизировать поиск по индексу. Контрольная сумма уже очень избирательна. Добавление FK увеличит размер индекса и соответствующий ввод-вывод и не поможет, если не будет включать достаточно других полей, чтобы полностью избежать поиска по закладкам.
Поскольку некластеризованный индекс будет содержать ключи кластеризации или указатель кучи, вам понадобится либо а) небольшой ключ кластеризации (например, столбец идентификаторов int - 4-байтовый указатель), либо б) отсутствие кластерного индекса вообще (8 байтовый указатель).
Если ваши запросы не являются выборочными или если кластеризованный индекс линейной таблицы огромен (вся таблица за вычетом нескольких столбцов), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу? ). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.
Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.
столбец идентификаторов типа int - 4-байтовый указатель) или б) кластеризованный индекс отсутствует (8-байтовый указатель).Если ваши запросы не являются выборочными, или если кластеризованный индекс таблицы строк огромен (вся таблица минус несколько columns), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу?). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.
Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.
столбец идентификаторов типа int - 4-байтовый указатель) или б) кластеризованный индекс отсутствует (8-байтовый указатель).Если ваши запросы не являются выборочными, или если кластеризованный индекс таблицы строк огромен (вся таблица минус несколько columns), то я не знаю, поможет ли контрольная сумма (возможно, более быстрая навигация по индексу?). В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.
Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.
В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.
В любом случае вы захотите сделать его кластеризованным или покрывающим индексом, и если таблица заголовка не кластеризована сначала по контрольной сумме, будет большая сортировка.Если вы можете позволить себе расходы на хранение и индексацию, то вам подойдут несколько покрывающих индексов - заголовок и детали.
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 намного меньше этого (все объединено), так что у вас не должно возникнуть никаких проблем.