Sql хранит prcedure занимает больше времени для выполнения, когда записи увеличивается, есть ли способ оптимизировать его - PullRequest
0 голосов
/ 07 февраля 2012

enter image description here У меня есть 6 000 000 записей, и я хочу извлечь из них 10 записей, поскольку я хочу отобразить только 10 записей в сетке, моя хранимая процедура работает правильно, когда я выбираю записи между 1-10000 EG (500- 510) после этого время выполнения увеличивается, когда номер строки увеличивается, например, если я получаю запись ч / б 1,00,000-1,00,010, для выполнения

требуется больше времени

Может кто-нибудь, пожалуйста, помогите мне, я использовал ROW_NUMBER (), чтобы получить номер строки номера и использовать между ними для получения данных.

Пожалуйста, дайте оптимизированный способ получения записей

Хранимая процедура создает SQL-запрос, как показано ниже

У меня есть 6 000 000 записей, и я хочу извлечь из них 10 записей, поскольку я хочу отображать только 10 записей в сетке, моя хранимая процедура работает правильно, когда я извлекаю записи между 1-10000 EG (500-510) после что время выполнения увеличивается при увеличении номера строки, например, если я получаю запись ч / б 1,00,000-1,00,010, требуется больше времени для выполнения

Может ли кто-нибудь, пожалуйста, помогите мне, я использовал ROW_NUMBER (), чтобы получить номер строки номера и между ними для получения данных.

Пожалуйста, дайте оптимизированный способ получения записей

Хранимая процедура создает запрос sql, как показано ниже

    SELECT FuelClaimId from  

     (  SELECT fc.FuelClaimId,ROW_NUMBER() OVER ( order by fc.FuelClaimId ) AS RowNum  
    from   FuelClaims fc   

      INNER JOIN Vehicles v on fc.VehicleId =v.VehicleId     

        INNER JOIN Drivers d on d.DriverId =v.OfficialID  

        INNER JOIN Departments de on de.DepartmentId =d.DepartmentId   

        INNER JOIN Provinces p on de.ProvinceId =p.ProvinceId  

        INNER JOIN FuelRates f on f.FuelRateId =fc.FuelRateId   

        INNER JOIN FuelClaimStatuses fs on fs.FuelClaimStatusId= fc.statusid

        INNER JOIN LogsheetMonths  l on l.LogsheetMonthId  =f.LogsheetMonthId

        Where fc.IsDeleted = 0) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 
    600000 And 600010

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Попробуйте вместо этого:

SELECT TOP 10 fc.FuelClaimId
FROM FuelClaims fc
    INNER JOIN Vehicles v ON fc.VehicleId = v.VehicleId     
    INNER JOIN Drivers d ON d.DriverId = v.OfficialID  
    INNER JOIN Departments de ON de.DepartmentId = d.DepartmentId   
    INNER JOIN Provinces p ON de.ProvinceId = p.ProvinceId  
    INNER JOIN FuelRates f ON f.FuelRateId = fc.FuelRateId   
    INNER JOIN FuelClaimStatuses fs ON fs.FuelClaimStatusId = fc.statusid
    INNER JOIN LogsheetMonths  l ON l.LogsheetMonthId = f.LogsheetMonthId
WHERE fc.IsDeleted = 0 AND fc.FuelClaimId BETWEEN 600001 AND 600010 
ORDER BY fc.FuelClaimId

Также МЕЖДУ включительно, поэтому между 10 и 20 фактически возвращается 10,11,12,13,14,15,16,17,18,19 и 20, поэтому 11строк не 10. Поскольку значения идентификаторов обычно начинаются с 1, вы действительно хотите BETWEEN 11 AND 20 (следовательно, 600001 в приведенном выше)

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

Хотя это не всегда возвращает 10 записей, исправление для этого:

WHERE fc.IsDeleted = 0 AND fc.FuelClaimId > @LastMaxFuelClaimId

Где @LastMaxFuelClaimId - это предыдущий MAX FuelClaimId, который вы вернули из предыдущего выполнения запроса.

Edit: причина, почему он продолжает работать медленнее, состоит в том, что ему приходится читать все больше и больше таблицы, чтобы прочитать следующий фрагмент, он не пропускает чтение первых 600 000 записей, он читает их все, а затем только возвращаетСледующие 10, следовательно, каждый раз, когда вы запрашиваете, снова и снова считывает все предыдущие записи, вышеописанное не страдает от той же проблемы.

0 голосов
/ 07 февраля 2012

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

Убедитесь, что у вас есть

  • индекс по всем вашим отношениям с внешними ключами
  • индекс покрытия для полей, которые вы извлекаете и выбираете из

Индекс покрытия

CREATE INDEX IX_FUELCLAIMS_FUELCLAIMID_ISDELETED 
  ON dbo.FuelClaims (FuelClaimId, VehicleID, IsDeleted)
...