Проблемы с хранимой процедурой Sql - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть хранимая процедура, она предназначена для получения данных на 10 таблицах между двумя датами.Возвращается намного больше 1000 строк.Когда я вызываю эту процедуру на веб-сайте, иногда возникает ошибка «сайт не отвечает».Как я должен оптимизировать эту проблему.

BEGIN
SELECT * FROM banka_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM banka_caritahsilat WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM kasa_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM kasa_caritahsilat WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM cek_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM cek_caritahsilat WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM pos_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM pos_caritahsilat WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM senet_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
SELECT * FROM senet_caritahsilat WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;
END

Ответы [ 4 ]

2 голосов
/ 02 апреля 2019

Ладно, мне кажется, у меня есть несколько основных возможностей:

Возможность № 1: Отсутствующие индексы

Представьте, что в вашей таблице нет индексов в этом поле даты. Поэтому, если вы хотите найти записи, соответствующие вашему запросу ... движок SQL должен просмотреть всю таблицу, чтобы найти то, что он ищет! Идея, стоящая за индексом, заключается в том, что он может быстро найти двоичные записи, соответствующие

Возможность № 2: индексы не используются

Этот диагноз немного сложнее. Вы должны будете использовать любые инструменты анализа запросов, которые MySql дает вам (я не настолько знаком с этим), чтобы понять это. Но, по сути, если у вас есть запрос, в котором движок подсчитывает, что индекс будет возвращать слишком много строк, чтобы оно того стоило, он все равно будет использовать основную таблицу. Например, представьте, что делаете LastName! = "Thomas". Зачем ему использовать индекс, чтобы выяснить, будут ли возвращены 99% строк, а затем попытаться сопоставить его с основной таблицей? Нет - для начала он просто использовал бы основную таблицу.

Возможность № 3: слишком много данных

Возможно, проблема в том, что он просто возвращает много данных. У вас там есть SELECT * - он будет возвращать каждый столбец в таблице. Мало того, что это может быть плохой дизайн (что, если столбец добавляется / вставляется?), Но это означает, что он должен передавать данные, которые могут даже не использоваться.

РЕДАКТИРОВАТЬ: Возможность № 4: Нужен комбинированный индекс

Я впервые неправильно прочитал часть выражения и предположил, что значения p_dt_bas и p_dt_bts являются переменными из внешнего интерфейса, а не дополнительными столбцами в таблице. В этом случае есть другая возможность: он не может использовать какие-либо существующие индексы, потому что они не включают всю информацию. В конце концов, если у вас есть запрос ColA = ColB и отдельные индексы для каждого столбца ... он не может использовать индексы. В конце концов, индекс - это всего лишь своего рода мини-таблица: {индексированные столбцы, указатель на главную таблицу}. Таким образом, использование индекса {ColA, указатель} не помогает найти значения, где ColA = ColB. Вам необходимо иметь ColB в том же индексе . Аналогично, для запроса A

0 голосов
/ 02 апреля 2019
EXPLAIN EXTENDED SELECT * FROM banka_cariodeme WHERE (vade_tarihi >= p_dt_bas) AND (vade_tarihi <= p_dt_bts) ORDER BY vade_tarihi DESC;

Было бы хорошим началом и дало бы некоторую информацию о базе данных и индексах ...

0 голосов
/ 02 апреля 2019

Убедитесь, что у вас есть индекс для p_dt_bas и p_dt_bts.Вы также можете использовать оператор BETWEEN в предложении where вместо двух сравнений.

BEGIN
    SELECT * FROM banka_cariodeme 
        WHERE vade_tarihi between p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM banka_caritahsilat 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM kasa_cariodeme 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM kasa_caritahsilat 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM cek_cariodeme 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM cek_caritahsilat 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM pos_cariodeme 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM pos_caritahsilat 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM senet_cariodeme 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
    SELECT * FROM senet_caritahsilat 
        WHERE vade_tarihi BETWEEN p_dt_bas AND p_dt_bts 
        ORDER BY  vade_tarihi DESC;
END
0 голосов
/ 02 апреля 2019

Добавление индекса в столбцы vade_tarihi, как сказал Питер выше, поможет.Добавление индексов в столбцы p_dt_bas и p_dt_bts также будет полезным.

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

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

Если эти параметры не работают, попробуйте разрешить БД использовать больше оперативной памяти для кэширования, если вы можете.

...