Выберите случайные 8 строк данных в SQL Server, нуждаются в оптимизации - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно выбрать 8 случайных строк из разных таблиц с условиями. Я думаю, что я пишу хорошо, но мой код работает очень медленно. Может быть, как-то я могу написать это проще или применить к нему какую-то оптимизацию?

Это работает, но занимает 8 минут и идк, затем остановите его ... Может быть, код не слишком хорош, idk.

Мой код

SELECT TOP 8  
    a.vardas, m.miestoPavadinimas, ab.numeris, ab.sutartiesPradzia, 
    ab.sutartiesPabaiga, 
    Op.operatoriausPavadinimas,
    p.planoPavadinimas, Uzip.uzsakymoData as InternetPozymisNusakantis, 
    Uzp.uzsakymoData as PapildPozymisNusankantis
FROM 
    Asmuo AS a
INNER JOIN 
    Abonentas AS ab ON ab.asmensID = a.asmensID
INNER JOIN 
    Miestas AS m ON m.miestoID = a.miestoID
INNER JOIN 
    Planas AS p ON p.planoID = ab.planoID
INNER JOIN 
    Operatorius AS Op ON Op.operatoriausID = p.operatoriausID
INNER JOIN 
    InternetoPlanas AS itp ON itp.operatoriausID = Op.operatoriausID
LEFT JOIN 
    UzsakytasInternetoPlanas AS Uzip ON itp.internetoPlanoID = Uzip.internetoPlanoID 
LEFT JOIN 
    UzsakytaPapildomaPaslauga AS Uzp ON Uzp.abonentoID = Uzp.abonentoID 
WHERE 
    ((Uzip.uzsakymoData IS NOT NULL AND Uzip.atsisakymoData IS NULL) 
     OR
     (Uzp.uzsakymoData IS NOT NULL AND Uzp.atsisakymoData IS NULL))
ORDER BY 
    NEWID()

Я не могу найти решение.

1 Ответ

0 голосов
/ 07 октября 2019

Ваш подход с использованием SELECT TOP x ... ORDER BY NEWID() в основном назначит случайное число каждой отдельной записи в результирующем запросе после объединения всех таблиц и т. Д., А затем отсортирует запрос по этому номеру, возвращая только первое x строки. Для запроса, который возвращает многие 100 000 записей, этот подход обязательно будет медленным.

Если ваша основная таблица Asmuo содержит большинство записей, а другие таблицы являются просто справочными таблицами, выможно попытаться использовать предложение TABLESAMPLE на вашей основной таблице, например:

SELECT TOP 8
    ...
FROM
    Asmuo TABLESAMPLE (100 ROWS) AS a
INNER JOIN 
    ...

Нет ORDER BY NEWID() необходимо. Причина, по которой мы выбираем 100 строк в TABLESAMPLE, заключается в том, что количество фактически выбранных записей может варьироваться. Дополнительная информация здесь .

Если это все еще не позволяет выполнить запрос достаточно быстро, убедитесь, что объединяемые таблицы правильно проиндексированы.

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