0

次の SQL クエリを最適化する方法を探しています。私はMS SQL Server 2008を使用しています。外部結合を統合する方法があれば速度が上がると考えています...誰かが何か意見を持っていれば、それは大歓迎です。ありがとう

SELECT employee.employee_id,
   coalesce (room.ship_id, ship.ship_id) AS ship_id,
   SUBSTRING (employee.service_id, 0, 6) AS cost_code,
   employee_station.room_cat AS nws_room_cat
FROM employee
   LEFT OUTER JOIN room
      ON     employee.ship_id = room.ship_id
         AND employee.floor_id = room.floor_id
         AND employee.room_id = room.room_id
   LEFT OUTER JOIN ship
      ON employee.ship_id = ship.ship_id
   LEFT OUTER JOIN employee_station
      ON COALESCE (ship.property_type, '') =
            COALESCE (employee_station.property_type, '')
         AND COALESCE (room.work_center_id, '') = COALESCE (employee_station.work_center_id, '')
         AND COALESCE (employee.pay_plan, '') =
                COALESCE (employee_station.pay_plan, '')
         AND COALESCE (employee.employee_type, '') =
                COALESCE (employee_station.employee_type, '')
         AND COALESCE (SUBSTRING (employee.service_id, 0, 6), '') =
                COALESCE (employee_station.cost_code, '')
   LEFT OUTER JOIN roomtype
      ON room.room_type = roomtype.room_type
   LEFT OUTER JOIN dp
      ON employee.service_id = dp.service_id

注: ここでは、わかりやすくするために、SELECT ステートメントの多くのフィールドを意図的に省略しています。したがって、roomtype と dp テーブルは実際に使用されています...

4

2 に答える 2

1

OUTER JOIN は問題ではありません。問題は、関数内で列をラップすることです。

ON COALESCE (ship.property_type, '') = COALESCE (employee_station.property_type, '')

この種の構造は、オプティマイザが効率的なクエリ プランを作成するのを妨げます。関数の値が実行時までわからないため、インデックスが存在する場合は使用できません。

関数を使用せずにクエリを書き直すと、オプティマイザーはより適切な決定を下すことができます。

于 2012-12-18T20:43:09.663 に答える
0

CHECKSUMS に参加することを試みることができます - 私の経験から、複雑な条件よりもパフォーマンスが向上することがよくあります。

SELECT 
--columns you need
FROM employee
LEFT OUTER JOIN room
ON CHECKSUM(employee.ship_id, employee.floor_id, employee.room_id) 
= CHECKSUM(room.ship_id, room.floor_id, room.room_id)
LEFT OUTER JOIN ship
ON employee.ship_id = ship.ship_id
LEFT OUTER JOIN employee_station
ON CHECKSUM(ship.property_type, room.work_center_id, employee.pay_plan, employee.employee_type, SUBSTRING (employee.service_id, 0, 6)) 
= CHECKSUM(employee_station.property_type, employee_station.work_center_id, employee_station.pay_plan, employee_station.employee_type, employee_station.cost_code)
LEFT OUTER JOIN roomtype
ON room.room_type = roomtype.room_type
LEFT OUTER JOIN dp
ON employee.service_id = dp.service_id
于 2012-12-18T21:17:37.273 に答える