2016-07-29 3 views
0

Этот запрос Выборка данных очень slow..I хотят поститься запрос ..SQL Select Query Получение очень медленно

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

Вот мой запрос SQL Server:

SELECT DISTINCT 
    ISNULL(V.VendorItemId, 0) AS VendorItemId, 
    ISNULL(V.VendorItemNumber, I.Ord_guide) AS VendorItemNumber, 
    ISNULL(V.VendorItemDescription, I.Pkg_desc) AS VendorItemDescription, 
    Id = (SELECT Min(k.Id) 
      FROM dbo.InvoiceImportDataPrice k 
      WHERE K.Ord_guide = I.Ord_guide 
      AND K.Price = I.Price 
      AND k.Pkg_desc = I.Pkg_desc 
      AND k.Store_name = I.Store_name 
      AND k.InvoiceImportHistoryId = 128), 
    I.InvoiceImportHistoryId, I.Price, 
    ISNULL(V.CurrentPrice, 0) AS CurrentPrice, 
    ISNULL(ISNULL(V.CurrentPrice, 0) - ISNULL(I.Price, 0), 0) AS differencePrice, 
    I.Invoice_No, I.Sold_to, I.Store_name, I.Deliv_date, 
    (CASE WHEN ISNULL(I.Qty_ship, '0') = '0' THEN '-0' ELSE I.Qty_ship END) AS Qty_ship, 
    I.Ship_um, 
    (CASE WHEN ISNULL(I.Qty_ord, '0') = '0' THEN '-0' ELSE I.Qty_ord END) AS Qty_ord, 
    I.Item_no, I.Weight, 
    (CASE WHEN ISNULL(I.Amount, '0') = '0' THEN '-0' ELSE I.Amount END) AS Amount, 
    I.Pkg_desc, I.Tax_amount, I.Ord_guide, 
    (SELECT COUNT(*) 
    FROM dbo.InvoiceImportDataPrice IP 
    WHERE IP.Pkg_desc = V.VendorItemDescription 
     AND IP.Item_no = V.VendorItemNumber 
     AND IP.Price = V.CurrentPrice) AS PriceDiscrepancyCount 
FROM 
    dbo.InvoiceImportDataPrice I 
LEFT JOIN 
    dbo.VendorItems V WITH (NOLOCK) ON V.VendorItemNumber = I.Ord_guide 
WHERE 
    (I.InvoiceImportHistoryId = 128 AND VendorItemDescription != '"Sales Tax"') 
    or 
    (I.InvoiceImportHistoryId = 128 AND ISNULL(V.VendorItemDescription, '') = '') 

Моя проблема заключается в 2 подзапросов:

1.

Id = (SELECT Min(k.Id) 
      FROM dbo.InvoiceImportDataPrice k 
      WHERE K.Ord_guide = I.Ord_guide 
      AND K.Price = I.Price 
      AND k.Pkg_desc = I.Pkg_desc 
      AND k.Store_name = I.Store_name 
      AND k.InvoiceImportHistoryId = 128) 

2.

(SELECT COUNT(*) 
    FROM dbo.InvoiceImportDataPrice IP 
    WHERE IP.Pkg_desc = V.VendorItemDescription 
     AND IP.Item_no = V.VendorItemNumber 
     AND IP.Price = V.CurrentPrice) AS PriceDiscrepancyCount 
+0

Манодж Указатель таблиц может помочь вы – Jaihind

+0

Вы пишете такой код? Правильное форматирование упрощает работу. – jarlh

+0

Я не получаю .. –

ответ

0

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

У вас есть subqueries в вашем заявлении SELECT, это чаще всего не очень плохая идея. Это именно то, для чего нужен раздел FROM. Переместите эти утверждения как subqueries в соединениях, а не в оператор SELECT.

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

Вам понадобится что-то подобное (непроверено, поскольку нет данных о выборке);

SELECT DISTINCT 
    ISNULL(V.VendorItemId, 0) AS VendorItemId, 
    ISNULL(V.VendorItemNumber, I.Ord_guide) AS VendorItemNumber, 
    ISNULL(V.VendorItemDescription, I.Pkg_desc) AS VendorItemDescription, 
    Id = Sub1.MinID, 
    I.InvoiceImportHistoryId, 
    I.Price, 
    ISNULL(V.CurrentPrice, 0) AS CurrentPrice, 
    ISNULL(ISNULL(V.CurrentPrice, 0) - ISNULL(I.Price, 0), 0) AS differencePrice, 
    I.Invoice_No, 
    I.Sold_to, 
    I.Store_name, 
    I.Deliv_date, 
    (CASE WHEN ISNULL(I.Qty_ship, '0') = '0' THEN '-0' ELSE I.Qty_ship END) AS Qty_ship, 
    I.Ship_um, 
    (CASE WHEN ISNULL(I.Qty_ord, '0') = '0' THEN '-0' ELSE I.Qty_ord END) AS Qty_ord, 
    I.Item_no 
    , I.Weight, 
    (CASE WHEN ISNULL(I.Amount, '0') = '0' THEN '-0' ELSE I.Amount END) AS Amount 
    ,I.Pkg_desc 
    ,I.Tax_amount 
    ,I.Ord_guide 
    ,Sub2.Cnt AS PriceDiscrepancyCount 
FROM 
    dbo.InvoiceImportDataPrice I 
LEFT JOIN 
    dbo.VendorItems V WITH (NOLOCK) ON V.VendorItemNumber = I.Ord_guide 
LEFT JOIN 
     (
      SELECT Ord_Guide, Price, Pkg_desc, Store_name, Min(k.Id) MinID 
      FROM dbo.InvoiceImportDataPrice k 
      WHERE k.InvoiceImportHistoryId = 128 
      GROUP BY Ord_Guide, Price, Pkg_desc, Store_name 
     ) Sub1 
    ON Sub1.Ord_guide = I.Ord_guide 
    AND Sub1.Price = I.Price 
    AND Sub1.Pkg_desc = I.Pkg_desc 
    AND Sub1.Store_name = I.Store_name 

LEFT JOIN 
     (
     SELECT Pkg_desc, Item_no, Price, COUNT(*) Cnt 
     FROM dbo.InvoiceImportDataPrice IP 
     GROUP BY Pkg_desc, Item_no, Price 
     ) Sub2 
    ON Sub2.Pkg_desc = V.VendorItemDescription 
    AND Sub2.Item_no = V.VendorItemNumber 
    AND Sub2.Price = V.CurrentPrice 
WHERE 
    I.InvoiceImportHistoryId = 128 
    AND 
    (V.VendorItemDescription <> '"Sales Tax"' 
    OR 
    V.VendorItemDescription IS NULL 
    OR 
    V.VendorItemDescription = '') 

Что касается вашего форматирования, то лучше следовать рекомендациям в отношении выравнивания: и т.д. В конце концов есть фактор личных предпочтений, но это должно дать вам представление о том, что вы должны стремиться. Как только вы привыкнете к этому, отладка будет намного проще для вас;

SQL Statement indentation good practice

+0

Сэр это займет почти 1 минуту ... но я хочу сделать меньше 10 секунд? Что мне делать? Есть ли какие-то изменения, необходимые? Вы можете отправить код в ответ? –

+0

Затем вам нужно прочитать, как посмотреть план выполнения запроса и посмотреть, что происходит медленно. Это может быть индексы или что-то подобное, но вам нужно проверить, что Actual Execution Plan –

+0

Я только что изменил предложение WHERE, потому что он не был SARGable, попробуйте, чтобы узнать, увеличивает ли он вашу производительность. –

0

Попробуйте эти два индекса на InvoiceImportDataPrice

некластеризованные, неоднородными, с помощью индексированных полей

Ord_guide 
Price 
Pkg_desc 
Store_name 
Store_name 
InvoiceImportHistoryId 

И

Item_no 
Price 
Pkg_desc 
Смежные вопросы