Оптимизация SQL - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над базой данных, в которой в настоящее время хранится в общей сложности 788 данных, и она постоянно увеличивается со временем.

Мой код выглядит следующим образом:

SELECT DISTINCT R.remarks, R.payerId, R.payername, R.payeraddress, R.collectorName, R.serialno, OOI.phone_no, CR.cr_no, F.application_no, R.series, R.txndate, R.amount, T.toda_name, B.brand_name, M.motor_no, M.chassis_no, 
                         M.plate_no, F.date_issue, M.year_model, M.body_color, OOI.ice_person_name, OOI.ice_person_address, OOI.ice_person_contact_no, M.motor_id, F.franchise_id, LEFT(R.remarks, 4) AS franchise_no, SUBSTRING(R.remarks, 
                         CHARINDEX('|', R.remarks) + 1, LEN(R.remarks)) AS motor_noremarks
FROM            etracs_tayabas.dbo.Receipt AS R INNER JOIN
                         etracs_tayabas.dbo.ReceiptItem AS RI ON RI.parentid = R.objid INNER JOIN
                         etracs_tayabas.dbo.IncomeAccount AS IA ON IA.objid = RI.acctid LEFT OUTER JOIN
                         dbo.vfTA_tblMotor AS M ON M.motor_no = SUBSTRING(R.remarks, CHARINDEX('|', R.remarks) + 1, LEN(R.remarks)) LEFT OUTER JOIN
                         dbo.vfTA_tblOperatorOtherInfo AS OOI ON OOI.operator_id = R.payerId LEFT OUTER JOIN
                         dbo.vfTA_tblCertificateOfRegistration AS CR ON CR.motor_id = M.motor_id LEFT OUTER JOIN
                         dbo.vfTA_tblFranchise AS F ON F.or_id = R.objid LEFT OUTER JOIN
                         dbo.vfTA_tblTODA AS T ON T.toda_id = M.toda_id LEFT OUTER JOIN
                         dbo.vfTA_tblReconciledTaxpayer AS RT ON RT.payer_id = R.payerId LEFT OUTER JOIN
                         dbo.vfTA_tblBrand AS B ON B.brand_id = M.brand_id
WHERE        (IA.objid = 'FTFA00000242') AND (F.franchise_id IS NULL) AND (R.voidId IS NULL) AND (R.remarks IS NOT NULL) AND (RT.rtp_id IS NULL)

Каждый раз, когда я запускаю этот код, мне всегда требуется до 10 минут или больше, чтобы загрузить все значения.Я пытался создать представление SQL для этого же кода, но при его запуске всегда отображается ошибка Execution Timeout.

Я хочу знать:

  1. Что такое лучшая оптимизацияметод для представлений и хранимой процедуры?
  2. Как можно уменьшить время, необходимое для загрузки данных, учитывая, что они имеют 788 данных и увеличиваются с течением времени?
  3. Как предотвратить много выполнениявремя ожидания в SQL или даже в программе?
  4. Некоторые сайты, которые помогают обучать оптимизации SQL.

Я пытаюсь изучить оптимизацию прямо сейчас, потому что заметил, что когда я делаюзапрос обычно занимает много времени для загрузки и иногда выдает ошибку 'Execution Timeout'

В настоящее время я новичок в этом.Заранее спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что использование DISTINCT против такого количества столбцов стоит дорого.Это действительно необходимо для вашего запроса?

Я также удивился следующей части:

LEFT OUTER JOIN dbo.vfTA_tblMotor AS M ON M.motor_no = SUBSTRING(R.remarks, CHARINDEX('|', R.remarks) + 1, LEN(R.remarks))

Это означает, что нет никакого способа использовать INDEX для этих отношений.Как насчет добавления столбца в таблицу etracs_tayabas.dbo.Receipt, где вы сохраняете результат подстроки, и вычисления его, когда запись вставляется / обновляется в таблице.Таким образом, вы можете сделать INDEX для этого отношения и оптимизировать эту часть JOIN.

...