簡體   English   中英

如何使此SQL查詢更有效?

[英]How can I make this SQL query more efficient?

我有一個查詢試圖從多個表中提取數據,但是當我運行它時,它要花很長時間(很長一段時間我什至不能等待足夠長的時間)。 我知道它效率極低,因此想獲得一些有關如何更好地編寫它的意見。 這里是:

SELECT 
        P.patient_name, 
        LOH.patient_id, 
        LOH.requesting_location, 
        LOH.sample_date,
        LOH.lab_doing_work,
        L.location_name, 
        LOD.test_code, 
        LOD.test_rdx,
        LSR.tube_type 
FROM 
        mis_db.dbo.lab_order_header AS LOH, 
        mis_db.dbo.patient AS P, 
        mis_db.dbo.lab_order_detail AS LOD, 
        mis_db.dbo.lab_sample_rule AS LSR,
        mis_db.dbo.location AS L
WHERE 
        LOH.requesting_location = '000839' AND
        LOH.lab_order_id = LOD.lab_order_id AND
        LOH.sample_date IN ('05/28/2015', '05/29/2015') 
        --LOH.patient_id = LOD.patient_id 
        --LOD.sample_date = LOH.sample_date 
ORDER BY 
        P.patient_name DESC 

試試這個(或類似的東西)

SELECT P.patient_name, 
    lo.patient_id, lo.requesting_location, 
    lo.sample_date, lo.lab_doing_work,
    l.location_name, d.test_code, d.test_rdx,
    d.tube_type 
FROM mis_db.dbo.lab_order_header lo 
    join mis_db.dbo.patient p on p.patient_id = lo.Patient_id
    join mis_db.dbo.lab_order_detail d on d.lab_order_id = lo.lab_order_id
    join mis_db.dbo.lab_sample_rule r on r.rule_id = lo.ruleId   -- ???? 
    join mis_db.dbo.location  l on l.locationid = lo.requesting_location  
WHERE lo.requesting_location = '000839' AND
     lo.sample_date IN ('05/28/2015', '05/29/2015') 
ORDER BY p.patient_name DESC 

我最終完成了以下工作,並能夠獲得想要的結果:

SELECT       LOH.patient_id,
               patient_name,
                         [mis_db_rpt].[common].[string_date_format](LOD.sample_date) AS
               [Draw Date],
               test_description,
               LOD.test_code,
               LOH.lab_doing_work,
               tube_type,
               L.short_name
FROM                   [mis_db].[dbo].[lab_order_header] 
               LOH
      INNER JOIN
                         [mis_db].[dbo].[lab_order_detail] 
               LOD 
      ON     LOH.lab_order_id = LOD.lab_order_id
      INNER JOIN
                         [mis_db].[dbo].[patient] 
               P 
      ON     P.patient_id = LOD.patient_id         
      INNER JOIN
                         [mis_db].[dbo].[sample_tube]
               ST
      ON     LOD.sample_id = ST.sample_id
      INNER JOIN
                         [mis_db].[dbo].[location] AS
               L
      ON     LOH.lab_doing_work = L.location_id
      INNER JOIN
                         [mis_db].[dbo].[lab_test] AS
               LT
      ON     LOD.test_code = LT.test_code         
WHERE       LOH.requesting_location = '000839' AND
LOD.sample_date IN ('05/28/2015', '05/29/2015') 
ORDER BY  LOD.sample_date,
                         patient_name,
                         LOD.patient_id,
                         test_description

我會嘗試

  1. 單擊以在SSMS中運行估計的執行計划,然后查看它是否建議缺少任何索引。 我認為lo.requesting_location和sample_date上的非聚集索引可能有助於過濾器
  2. 另外,在desc索引中,p。Patient_name可能有助於執行該命令。
  3. 嘗試將IN日期過濾器更改為“在'05 / 28/2015'和'05 / 29/2015之間”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM