ইউনিয়ন ধীর হলেও উভয় প্রশ্ন পৃথক পৃথক are


11

ডুনো এই সম্পর্কে আরও কি করতে হবে। আমার একটি টেবিল রয়েছে যার একটি শুরু এবং একটি স্টপ কলাম রয়েছে এবং আমি এর ফলাফলগুলি শুরু এবং স্টপ উভয়ই ফিরিয়ে দিতে চাই এবং আমি উভয়ের মধ্যে স্পষ্ট পার্থক্য চাই। এখন উভয় প্রশ্নেরই পৃথকভাবে দ্রুত চলে:

SELECT
            UNIX_TIMESTAMP(CONVERT_TZ(start_dev, '+00:00', GetCarrierTimezone(a0.carrier_id))) AS alertStart,
            NULL AS alertStop,
            c0.name AS carrier_name,
            carrier_image,
            l0.Latitude,
            l0.Longitude
        FROM
            carriers AS c0
                INNER JOIN start_stop AS a0 ON a0.carrier_id = c0.id
                    INNER JOIN pcoarg AS l0 ON a0.startLogId = l0.id
        WHERE
                FIND_IN_SET(a0.carrier_id, '89467,1,64578,222625,45013') > 0
            AND
                start_dev > '2013-03-11 11:46:48'
            AND 
                start_dev = (SELECT MIN(start_dev) FROM start_stop AS a1 WHERE a0.carrier_id = a1.carrier_id AND DATE(a1.start_dev) = DATE(a0.start_dev))
        AND IsNotificationInSchedule(22, start_dev) > 0

সুতরাং এটি এক 0.063 লাগে। তবে আমি যদি এটি কোনও ইউনিয়নে সংযুক্ত করি (এটি ইউনিয়ন সমস্ত বা বিপর্যয় বা যেকোন বিষয় নয়) এটি প্রায় 0.400 সেকেন্ড সময় নেয়।

SELECT * FROM
(
    (
        SELECT
            UNIX_TIMESTAMP(CONVERT_TZ(start_dev, '+00:00', GetCarrierTimezone(a0.carrier_id))) AS alertStart,
            NULL AS alertStop,
            c0.name AS carrier_name,
            carrier_image,
            l0.Latitude,
            l0.Longitude
        FROM
            carriers AS c0
                INNER JOIN start_stop AS a0 ON a0.carrier_id = c0.id
                    INNER JOIN pcoarg AS l0 ON a0.startLogId = l0.id
        WHERE
                FIND_IN_SET(a0.carrier_id, '89467,1,64578,222625,45013') > 0
            AND
                start_dev > '2013-03-11 11:46:48'
            AND 
                start_dev = (SELECT MIN(start_dev) FROM start_stop AS a1 WHERE a0.carrier_id = a1.carrier_id AND DATE(a1.start_dev) = DATE(a0.start_dev))
            AND IsNotificationInSchedule(22, start_dev) > 0
    ) UNION ALL (
        SELECT
            NULL AS alertStart,
            UNIX_TIMESTAMP(CONVERT_TZ(stop_dev, '+00:00', GetCarrierTimezone(a0.carrier_id))) AS alertStop,
            c0.name AS carrier_name,
            carrier_image,
            l0.Latitude,
            l0.Longitude
        FROM
            start_stop AS a0
                INNER JOIN carriers AS c0 ON a0.carrier_id = c0.id
                    INNER JOIN pcoarg AS l0 ON a0.stopLogId = l0.id
        WHERE
                FIND_IN_SET(a0.carrier_id, '89467,1,64578,222625,45013') > 0
            AND
                stop_dev > '2013-03-11 11:46:48'
            AND 
                stop_dev = (SELECT MAX(stop_dev) FROM start_stop AS a1 WHERE a0.carrier_id = a1.carrier_id AND DATE(a1.stop_dev) = DATE(a0.stop_dev))
            AND IsNotificationInSchedule(22, start_dev) > 0
    )
) AS startStops
ORDER BY IF(alertStart IS NULL, alertStop, alertStart)

এখানে একক ক্যোয়ারির ব্যাখ্যা দেওয়া হল:

1   PRIMARY c0  ALL PRIMARY             17  Using where
1   PRIMARY a0  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.c0.id   72  Using where
1   PRIMARY l0  ref id ASC  id ASC  4   test_backoffice.a0.startLogId   1   Using where
2   DEPENDENT SUBQUERY  a1  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.a0.carrier_id   72  Using where; Using index

এবং এখানে যোগদানের জন্য ব্যাখ্যা:

1   PRIMARY <derived2>  system                  0   const row not found
2   DERIVED c0  ALL PRIMARY             17  Using where
2   DERIVED a0  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.c0.id   72  Using where
2   DERIVED l0  ref id ASC  id ASC  4   test_backoffice.a0.startLogId   1   Using where
3   DEPENDENT SUBQUERY  a1  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.a0.carrier_id   72  Using where; Using index
4   UNION   c0  ALL PRIMARY             17  Using where
4   UNION   a0  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.c0.id   72  Using where
4   UNION   l0  ref id ASC  id ASC  4   test_backoffice.a0.stopLogId    1   Using where
5   DEPENDENT SUBQUERY  a1  ref PRIMARY,startstop_carriers_stopdev_idx,georefidx,startstop_carriers_startdev_idx    startstop_carriers_stopdev_idx  4   test_backoffice.a0.carrier_id   72  Using where; Using index
    UNION RESULT    <union2,4>  ALL                     

এই এক সাহায্য ব্যাপকভাবে প্রশংসা করা হবে। :)

সম্পাদনা করুন:

আমি বেমানান ফল পাচ্ছি। যদি আমি উদাহরণস্বরূপ রূপান্তর_টিজে অপসারণ করি এবং ইউনিয়নের বাইরে সময় অঞ্চল পাওয়ার চেষ্টা করি তবে আমি খুব দ্রুত ফলাফল পেতে পারি, তবে যদি আমি ফলাফলটির নাম পরিবর্তন করি তবে এটি স্বয়ংক্রিয়ভাবে একই অনূদর্শী ক্যোয়ারিতে নেমে যায়:

SELECT
    *,
    GetCarrierTimezone(carrier_id) timezone
FROM
(

এটি 0.374s লাগে

SELECT
    *,
    GetCarrierTimezone(carrier_id)
FROM
(

এটি যখন 0.078 লাগে (বেশিরভাগ ডিবি থেকে আমার মেশিনে পিছিয়ে থাকে) ..


সবচেয়ে সহজ হ'ল এগুলি আলাদাভাবে চালানো এবং প্রয়োগের ফলাফলগুলিকে একত্রিত করা।
ypercubeᵀᴹ

হাই হাইপারপ্রাইচ, যা আমার মনকে ছাড়িয়েছে :) তবে এটি করা এবং কোডটি বজায় রাখা এতটাই কুশ্রী। তবুও আমি এখনও পিএইচপি মধ্যে ফলাফল বাছাই করতে হবে।
helderjsm

আমি বোঝাতে চাইছি 2 চাওয়া চাওয়া সাজানো দিয়ে ক্যোয়ারী। তারপরে আপনাকে কেবল পিএইচপিগুলিতে মার্জ করতে হবে (কোনও বাছাই নয়)।
ypercubeᵀᴹ

1
বাছাই লিনিয়ার নয়। ক্যোয়ারী 1 এর ফলাফল 2 ক্যোয়ারির 2 ফলাফলের মধ্যে হতে পারে
হোল্ডারজেমম

1
আমি মনে করি না যে @ টিউবকিউবে ফলাফলগুলি ওভারল্যাপ হয় না ধরে নিচ্ছে: পিএইচপি-তে বাস্তবায়নের চেয়ে 'মার্জ' অনেক সস্তা / সহজ। অবশ্যই SQL এর যে সমস্যা ফিক্সিং সম্ভব হলে একেবারেই ভাল সমাধান :) হতে হবে
জ্যাক topanswers.xyz চেষ্টা বলছেন

উত্তর:


1

আপনি যে অর্ডারটি পেয়েছেন সে কারণে আমি এটি ঘটতে আশা করব।

ইউনিয়নের প্রথম অংশে এটি ব্যবহার করে দেখুন:

SELECT
            UNIX_TIMESTAMP(CONVERT_TZ(start_dev, '+00:00', GetCarrierTimezone(a0.carrier_id))) AS alertFoo,
            /* NULL AS alertStop, */

এবং এটি দ্বিতীয় অংশে:

SELECT
            /* NULL AS alertStart, */
            UNIX_TIMESTAMP(CONVERT_TZ(stop_dev, '+00:00', GetCarrierTimezone(a0.carrier_id))) AS alertFoo,

এবং তারপর প্রতিস্থাপন ORDER BYসঙ্গে

ORDER BY alertFoo

অন্য কথায়, আদেশ অনুসারে যদি আইএফের প্রয়োজনীয়তা সরিয়ে ফেলুন।


হাই থমাস, সবার আগে আপনার রিপ্লেটির জন্য আপনাকে ধন্যবাদ। আমি আগের পোস্টে বলেছি কিছুদিন আগে এটি ঠিক করা হয়েছিল। জিনিসটি হ'ল আমার সতর্কতা 1 এবং সতর্কতা 2 এর মধ্যে পার্থক্য প্রয়োজন needed কোনও ক্ষেত্রে অর্ডার যোগদানের ফলাফলের ফলে করা হয়, নিজেই যোগদানের পরিবর্তে নয়। ক্যোয়ারির ownিলে .ালা প্রমাণ করার জন্য এতগুলি ফলাফল ছিল না।
হোল্ডারজেম

0

একটি খুব অনুরূপ ক্ষেত্রে, আমি মাইএসকিএল-এর প্রক্রিয়া তালিকা থেকে 'টেম্প টেবিল টেবিলের অনুলিপি' (কপি অনুলিপি? কী জানি না) এর খুব খারাপ আচরণটি লক্ষ্য করেছি। আমি মনে করি যে মাইএসকিএল অনুসন্ধানের জন্য একটি 'সেরা পদ্ধতির' প্রলুব্ধ করেছে, তবে এই ক্ষেত্রে ব্যর্থ হয়েছে, সুতরাং কোডকে 'মার্জ' করতে 2-প্রশ্নের ফলাফল ভাল কাজ করেছে।


হাই রিয়েলটিবো, ইনপুট দেওয়ার জন্য ধন্যবাদ। এটি এখন খানিকটা পুরানো, তবে আমি যে অসঙ্গতিটি মনে করি তার কারণ এটি ছিল যে কেউ কেউ কীভাবে মাইএসকিএল কিছু ফলাফল নিয়েছিল এবং অন্যকে নয়। সূচকগুলি আরও দক্ষ করে তোলার জন্য আলাদা টেবিলে আমার প্রয়োজনীয় মূল্যবোধগুলি ট্র্যাক করে আমি অবশেষে আরও কার্যকর পদ্ধতিতে ক্যোয়ারীটি পুনরায় তৈরি করেছি।
হোল্ডারজেমস

0

ইউনিয়নের স্কোয়াএলটি ধীরগতিতে চলার মূল কারণটি হ'ল কোনও ইউনিয়ন মাইএসকিএলএডকে অভ্যন্তরীণ অস্থায়ী সারণী তৈরি করে। এটি ইউনিয়ন সকলের জন্য কেবল একটি টেবিল এবং একটি ইউনিয়ন ডিসিস্টিন্টের জন্য একটি সূচি (ডুপ্লিকেট অপসারণ) সহ একটি টেবিল তৈরি করে।

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.