Вы используете плохие команды async/await
. И если честно, они вам здесь не нужны.
router.post('/', [
check('username', 'Min 5 chars, Max 20').isLength({ min: 5, max: 20 }),
check('email').custom(value => {
const db = require('../db');
return new Promise((resolve, reject) => {
db.query('SELECT id FROM users WHERE email=?', [value], function (err, results, fields) {
if (err)
reject(err)
if (results.length>0)
reject(new Error('Email Already exists'))
resolve()
})
})
}),
], function(req, res, next) {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
A bookmark lookup is the process of finding the actual data in the SQL table, based on an entry found in a non-clustered index.
When you search for a value in a non-clustered index, and your query needs more fields than are part of the index leaf node (all the index fields, plus any possible INCLUDE columns), then SQL Server needs to go retrieve the actual data page(s) - that's what's called a bookmark lookup.
In some cases, that's really the only way to go - only if your query would require just one more field (not a whole bunch of 'em), it might be a good idea to INCLUDE that field in the non-clustered index. In that case, the leaf-level node of the non-clustered index would contain all fields needed to satisfy your query (a "covering" index), and thus a bookmark lookup wouldn't be necessary anymore.
Marc
Это NESTED LOOP
, который объединяет некластеризованный индекс с самой таблицей в указателе строки.
Происходит для таких запросов:
SELECT col1
FROM table
WHERE col2 BETWEEN 1 AND 10
, если у вас есть индекс на col2
.
Индекс на col2
содержит указатели на индексированные строки.
Итак, для получения значения col1
, движку необходимо отсканировать индекс на col2
для значений ключа от 1
до 10
, и для каждого индексного листа, обратитесь к таблице сам с помощью указателя, содержащегося в листе, чтобы выяснить значение col1
.
В этой статье указывается, что Поиск закладок
является SQL Server 2000 Термин
, который заменяется на NESTED LOOP
'между индексом и таблицей в SQL Server 2005
и выше
Из MSDN относительно поиска закладок:
Оператор поиска закладок использует закладка (идентификатор строки или ключ кластеризации) для найдите соответствующий ряд в таблица или кластерный индекс. Аргумент столбец содержит метку закладки используется для поиска строки в таблице или кластерный индекс. Аргумент столбец также содержит название таблица или кластерный индекс, в котором ряд посмотрел вверх. Если С ПРЕДЫДУЩИМ пункт появляется в столбце Аргумент, обработчик запросов определил что оптимально использовать асинхронный предварительная выборка (чтение вперед) при поиске до закладки в таблице или кластере index.