@ MrAlek's Ответ для swift3
optional func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
print(#function)
var i = -1;
for view in views {
i += 1;
if view.annotation is MKUserLocation {
continue;
}
// Check if current annotation is inside visible map rect, else go to next one
let point:MKMapPoint = MKMapPointForCoordinate(view.annotation!.coordinate);
if (!MKMapRectContainsPoint(self.mapView.visibleMapRect, point)) {
continue;
}
let endFrame:CGRect = view.frame;
// Move annotation out of view
view.frame = CGRect(origin: CGPoint(x: view.frame.origin.x,y :view.frame.origin.y-self.view.frame.size.height), size: CGSize(width: view.frame.size.width, height: view.frame.size.height))
// Animate drop
let delay = 0.03 * Double(i)
UIView.animate(withDuration: 0.5, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations:{() in
view.frame = endFrame
// Animate squash
}, completion:{(Bool) in
UIView.animate(withDuration: 0.05, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations:{() in
view.transform = CGAffineTransform(scaleX: 1.0, y: 0.6)
}, completion: {(Bool) in
UIView.animate(withDuration: 0.3, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations:{() in
view.transform = CGAffineTransform.identity
}, completion: nil)
})
})
}
}
С точки зрения производительности эти запросы идентичны.
UNION ALL
не повлияет на производительность, поскольку Oracle
оценивает UNION
обрабатывает запрос только тогда, когда это необходимо, он не кеширует результаты сначала.
Синтаксис SELECT
более гибкий в том смысле, что вы можете более легко управлять запросом SELECT
, если вы хотите что-то изменить.
Например, этот запрос:
insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
можно переписать как
INSERT
INTO pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
SELECT 7999 + level, 0, 'Multi ' || 7999 + level, 1
FROM dual
CONNECT BY
level <= 2
Заменив 2
на соответствующий номер, вы можете получить любое количество строк, которое хотите.
] В случае INSERT ALL
вам придется продублировать описание целевой таблицы, которое будет менее читаемым, если вам нужно, скажем, 40
строк.
Я подозреваю, что решение 1 - это своего рода хитрость, которая работает и, вероятно, менее эффективна, чем разработанная альтернатива Insert ALL.
Insert all действительно предназначена для вы должны вставить много строк в более чем одну таблицу в результате выбора, например:
Insert ALL
into
t1 (c1, c2) values (q1, q2)
t2 (x1, x2) values (q1, q3)
select q1, q2, q3 from t3
Если вы хотите загрузить тысячи строк , а их еще нет в базе данных , я не думаю это лучший способ сделать это - если ваши данные находятся в файле, вы хотите просмотреть внешние таблицы или загрузчик SQL, чтобы эффективно вставить строки для вас.
Оператор, использующий UNION ALL
, теоретически имеет небольшой недостаток производительности, поскольку он должен объединить результаты всех операторов, прежде чем может произойти вставка.
INSERT ALL
не имеет этого недостатка, так как конечный результат уже может быть обработан построчно.
Но на практике оптимизатор внутри Oracle должен сделать разницу незначительной, и это зависит от ваших предпочтений. какой способ вы выберете.
По моему мнению, вариант INSERT ALL
лучше читается человеком из двух, в то время как вариант UNION ALL
занимает меньше места, когда такой вариант вставка создается автоматически.