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

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

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

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 запросов.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

Выглядит очень многообещающе, буду пробовать.

Nikita 27.06.2019 06:53

Другие вопросы по теме