1

こんにちは私はこのクエリを使用してこのselectステートメントを実行しようとしていますが、実行に2時間以上かかります。すべてのインデックスが正しくなるように設定しました。しかし、それでも永遠にかかります。私が見逃しているものや、このクエリを高速化するテーブルを結合するためのより効率的な方法はありますか?

結合されているすべてのアイテムにインデックスを設定しましたが、それらは同じ長さとデータ型です。

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    t.regular_discount     
FROM part p 
        LEFT JOIN tabjbmaw t ON t.accountnum        = '73050'
                            AND p.numeric_line_code = t.numeric_line_code 
                            AND p.sub_code          = t.sub_code    
        JOIN warehouse w ON w.sap_article_id = p.sap_article_id;

+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+
| id | select_type | table     | type | possible_keys                                    | key                   | key_len | ref                              | rows   | Extra       |
+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+
|  1 | SIMPLE      | part      | ALL  | PRIMARY,sap_article,part_sap_article_id_fk       | NULL                  | NULL    | NULL                             | 389309 |             |
|  1 | SIMPLE      | warehouse | ref  | article                                          | article               | 130     | inventory.part.sap_article_id    |      5 | Using where |
|  1 | SIMPLE      | tabjbmaw  | ref  | numeric_line_code_idx,subcode_idx,accountnum_idx | numeric_line_code_idx | 5       | inventory.part.numeric_line_code |     19 |             |
+----+-------------+-----------+------+--------------------------------------------------+-----------------------+---------+----------------------------------+--------+-------------+

ご協力ありがとうございました

+-----------------------------+--------------+------+-----+---------------------+-----------------------------+
| Field                       | Type         | Null | Key | Default             | Extra                       |
+-----------------------------+--------------+------+-----+---------------------+-----------------------------+
| sap_article_id              | varchar(24)  | NO   | PRI |                     |                             |
| sap_brand_id                | varchar(20)  | NO   |     | NULL                |                             |
| uag_partnum                 | varchar(20)  | NO   | MUL | NULL                |                             |
| uag_linecode                | varchar(5)   | NO   | MUL | NULL                |                             |
| cag_partnum                 | varchar(20)  | NO   | MUL | NULL                |                             |
| cag_linecode                | varchar(5)   | NO   |     | NULL                |                             |
| product_category_legacy     | varchar(20)  | NO   |     | NULL                |                             |
| part_description            | varchar(128) | NO   |     | NULL                |                             |
| abc_indicator               | varchar(8)   | NO   |     | NULL                |                             |
| pack_code                   | varchar(8)   | NO   |     | NULL                |                             |
| case_qty                    | int(11)      | NO   |     | NULL                |                             |
| per_car_qty                 | int(11)      | NO   |     | NULL                |                             |
| uom                         | varchar(6)   | NO   |     | NULL                |                             |
| upc_code                    | varchar(128) | NO   |     | NULL                |                             |
| jobber_price                | float(14,4)  | YES  |     | NULL                |                             |
| jobber_core                 | float(14,4)  | YES  |     | NULL                |                             |
| date_last_price_change      | timestamp    | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| weight                      | float(14,4)  | YES  |     | NULL                |                             |
| weight_unit                 | varchar(6)   | NO   |     | NULL                |                             |
| dimension_type              | varchar(6)   | NO   |     | NULL                |                             |
| length                      | float(14,4)  | YES  |     | NULL                |                             |
| width                       | float(14,4)  | YES  |     | NULL                |                             |
| height                      | float(14,4)  | YES  |     | NULL                |                             |
| updated                     | tinyint(1)   | NO   |     | 0                   |                             |
| superseded_sap_article_id   | varchar(24)  | YES  |     | NULL                |                             |
| last_updated                | timestamp    | NO   |     | 0000-00-00 00:00:00 |                             |
| hour_updated                | int(11)      | YES  |     | NULL                |                             |
| discount1                   | float        | YES  |     | NULL                |                             |
| discount2                   | float        | YES  |     | NULL                |                             |
| product_category            | varchar(3)   | YES  |     | NULL                |                             |
| superseded_part_number      | varchar(20)  | YES  |     | NULL                |                             |
| sub_code                    | varchar(3)   | YES  | MUL | NULL                |                             |
| date_effective_price_change | date         | YES  |     | NULL                |                             |
| numeric_line_code           | varchar(3)   | YES  | MUL | NULL                |                             |
| list                        | float        | YES  |     | NULL                |                             |
+-----------------------------+--------------+------+-----+---------------------+-----------------------------+
4

3 に答える 3

1

結合されているすべてのアイテムにインデックスを設定しています

はい。ただし、インデックスの名前から、各インデックスには1つのフィールドしかないことが推測されます。

説明のいくつかの列を見てみましょう。

| table     | possible_keys                                    | key                   
+-----------+--------------------------------------------------+----------------
| part      | PRIMARY,sap_article,part_sap_article_id_fk       | NULL                  
| warehouse | article                                          | article               
| tabjbmaw  | numeric_line_code_idx,subcode_idx,accountnum_idx | numeric_line_code_idx 

これは、numeric_line_code、subcode、およびaccountnumのインデックスを使用できますが、それぞれが1つのフィールドを持つインデックスは3つだけであり、すべてのフィールドを持つインデックスはありません。オプティマイザーに、3つのフィールドすべてに使用できる1つの索引を提供するのではなく、1つのフィールド索引の1つを選択させています。

テーブルtabjbmawに、numeric_line_code、subcode、accountnumの3つのフィールドを持つインデックスを追加します。

于 2013-03-19T19:38:36.423 に答える
0

@Sebasの回答を拡張するには、最初にtabjbmawを選択する必要があります。

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    t.regular_discount     
FROM tabjbmaw t
        LEFT JOIN parts p ON p.numeric_line_code = t.numeric_line_code 
                             AND p.sub_code       = t.sub_code    
        JOIN warehouse w ON w.sap_article_id = p.sap_article_id
WHERE t.accountnum = '73050'
;
于 2013-03-19T19:38:09.233 に答える
0

左結合を副選択としてSELECT部分​​に入れてみることができます。その「かもしれない」は物事を少しスピードアップします。

このような:

SELECT 
    p.sap_article_id, 
    p.numeric_line_code, 
    p.uag_linecode,  
    p.uag_partnum,   
    p.part_description, 
    p.jobber_price, 
    p.jobber_core, 
    p.discount1,  
    p.discount2, 
    p.uom, 
    p.product_category, 
    w.as400_warehouse,   
    w.atp_qty, 
    p.updated,  
    (SELECT t.regular_discount FROM tabjbmaw t WHERE t.accountnum = '73050' AND p.numeric_line_code = t.numeric_line_code AND p.sub_code = t.sub_code LIMIT 1)    
FROM 
    part p 
    JOIN warehouse w ON w.sap_article_id = p.sap_article_id;
于 2013-03-19T19:47:11.583 に答える