Как ускорить запрос одного и того же стола много раз при разных условиях? - PullRequest
0 голосов
/ 27 июня 2019

EF6, ядро ​​asp mvc и сервер SQL используются в фоновом режиме.

Мне нужно выполнить много запросов к одной и той же таблице с разными условиями, например,

SELECT COUNT(*) FROM Table1 WHERE a = true
SELECT COUNT(*) FROM Table1 WHERE b = true
SELECT COUNT(*) FROM Table1 WHERE a = true || b = true
SELECT a FROM Table1 WHERE b = true

Итак, 4 запроса к Table1 с разными условиями. Я думаю, что в результате я должен прочитать все Table1 четыре раза. В псевдокоде это может выглядеть следующим образом.

var res1 = new list();
foreach(var rec in Table1) { // read Table1 first time
  if(rec.a == true) {
    res1.push(rec);
  }
}

var res2 = new list();
foreach(var rec in Table1) { // read Table1 second time
  if(rec.b == true) {
    res2.push(rec);
  }
}

var res3 = new list();
foreach(var rec in Table1) { // read Table1 third time
  if(rec.a == true || rec.b == true) {
    res3.push(rec);
  }
}

var res4 = new list();
foreach(var rec in Table1) { // read Table1 fourth time
  if(rec.b == true) {
    res4.push(rec);
  }
}

Я хочу знать, как прочитать Table1 только один раз и получить четыре разных результата, например:

var res1 = new List();
var res2 = new List();
var res3 = new List();
var res4 = new list();
foreach(rec in Table1) { // read Table1 first time
    if(a == true) {
        res1.push(rec);
    }
    if(b == true) {
        res2.push(rec);
    }
    if(a == true || b == true) {
        res3.push(rec);
    }
    if(b == true) {
        res4.push(rec);
    }
}  

Также проблема в том, что эти запросы являются динамическими SQL, я имею в виду, что a = true, b = true, a = true || b = true хранятся в базе данных. И запросы выполняются таким образом:

string query = "SELECT Count(*) FROM Table1 WHERE" + condition;
var count = ExecuteSql(query);

Приведенный выше пример упрощен, но на самом деле весь запрос разбивается и сохраняется в базе данных.

PS. На самом деле я хочу ускорить страницу, которая делает 30-40 запросов к серверу, и каждый запрос - это запрос к одной и той же таблице. Я думаю, смогу ли я заменить их одним запросом вместо 40 запросов.

1 Ответ

3 голосов
/ 27 июня 2019

Вы можете использовать условное агрегирование только с одним запросом:

SELECT
    COUNT(CASE WHEN a = true THEN 1 END) AS cnt_a,
    COUNT(CASE WHEN b = true THEN 1 END) AS cnt_b,
    COUNT(CASE WHEN a = true OR b = true THEN 1 END) AS cnt_a_b
FROM Table1;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...