XQuery сұрыптау мәселесі

Қазір мен үлкен қиыншылыққа тап болып отырмын. Мен XQuery-те жаңа, бірақ қазір PHP және XSLT арқылы Xquery-ді қолданамын.

Біздің жобамызда үлкен жоқ. деректер (оның меншік тізімінің торабы) және мен деректерді Barkeley DB (XML DB) деп сақтаймын. Мәселе - мен мүлікті іздеп жүргенде, нәтиже алу үшін көп уақыт кетеді. ORDER BY мәселені жасайды (Сұрау 1) .. оның жұмысын жақсы сұрыптайды (Сұрау 2). Бірақ жобаны сұрыптау үшін қажет және ол өте әлсіз. Сондықтан сұрағымды тексеріп шығыңыз (Query1) мен мүмкіндігінше тезірек шешімді беріңіз. Мынадай сұрау:

Сұрау1:

        let $properties := (
            for $property in collection('bdb/properties.dbxml')/properties/property
                [ ( sale_price >=60000 and sale_price <=500000 ) and ( building_square_footage >=300 and building_square_footage <=3000 ) and ( bedrooms >=2 and bedrooms <=6 ) ]
            order by
                contains($property/mls_agent_id/text(), '505199') descending,
                matches($property/mls_office_id/text(), '^CBRR') ascending,
                $property/sale_price/number() descending
            return $property
        )

       let $properties := subsequence($properties,10,10) return {$properties}

Сұрау 2:

    let $properties := (
       for $property in subsequence (
           collection('bdb/properties.dbxml')/properties/property
               [ ( sale_price >=60000 and sale_price <=500000 ) and ( building_square_footage >=300 and building_square_footage <=3000 ) and ( bedrooms >=2 and bedrooms <=6 ) ]
           , 1, 10)
        )
        descending return $property
    )  return {$properties}
0
Мысалы, кейбір мысал деректерін жарамды xml үзіндісі ретінде жұмыс істей аласыз. сезім
қосылды автор Jens Erat, көзі

2 жауаптар

Мен мұнда пайдаланудың дұрыс емес құралы болып табылады деп ойлаймын. Сіз шынымен үш тізімді - агенттің тізімдерін, агенттерден басқа офистің тізімдерін және басқа тізімдерді аласыз. Бұл 3 сұранысты ғана жасау үшін жақсы жұмыс істей алады, ал оңтайландырушы әрбір ішкі сұраудың түйіндерін тиімдірек таңдауы мүмкін.

    let $properties := (
        for $property in collection('bdb/properties.dbxml')/properties/property
            [ ( sale_price >=60000 and sale_price <=500000 ) and ( building_square_footage >=300 and building_square_footage <=3000 ) and ( bedrooms >=2 and bedrooms <=6 ) and mls_agent_id = '505199']
        order by
            $property/sale_price/number() descending
        return $property,
        for $property in collection('bdb/properties.dbxml')/properties/property
            [ ( sale_price >=60000 and sale_price <=500000 ) and ( building_square_footage >=300 and building_square_footage <=3000 ) and ( bedrooms >=2 and bedrooms <=6 ) and (starts_with(office_id, 'CBRR') and not(mls_agent_id = '505199'))]
        order by
            $property/sale_price/number() descending
        return $property, 
        for $property in collection('bdb/properties.dbxml')/properties/property
            [ ( sale_price >=60000 and sale_price <=500000 ) and ( building_square_footage >=300 and building_square_footage <=3000 ) and ( bedrooms >=2 and bedrooms <=6 ) and not (starts_with(office_id, 'CBRR')]
        order by
            $property/sale_price/number() descending
        return $property
    )

   let $properties := subsequence($properties,10,10) return {$properties}

Басқа да пайдалы нәрселер бар

  • try using starts-with instead of matches - a simple string match is likely to be a faster than a regular expression, and easier to optimize
  • if you break it into multiple selects as I did above, you can avoid the second or third selects if you already have enough items selected.
  • don't select the entire node only to discard most of what you've selected with subsequence. Particularly when sorting, this likely means a lot of memory bandwidth. It's better to select just some unique identifier and then use those identifiers to get the rest of the property info later.

Мысалы, орнына

let $properties:= for $property in collection('properties.dbxml')/properties/property[.....]
    return $property
let $properties := subsequence($properties,10,10)
return {$properties}

орнына жасаңыз

let $property_ids:= for $property in collection('properties.dbxml')/properties/property[.....] 
    return $property/unique_id
return {
    for $id in subsequence($property_ids,10,10) return 
        collection('properties.dbxml')/properties/property[unique_id = $id]
}

Бұл жад ішіндегі тізбектің үлкен түйіндерден гөрі кіші идентификаторлар болатынын білдіреді. Әрине, бұл бірегей идентификаторларды бастау керек дегенді білдіреді, бірақ MLS дерекқорында мұндай нәрселер бар деп ойлаймын.

0
қосылды

Бұл көмектесетін-білмейтінін білмеймін. Бірақ, әлдеқайда кеңейтілген сұрауды оңтайландыруды ұсынатын баламалы xml дерекқорларын қолданып сәтті бола аласыз. Тек қана, Ханнес

0
қосылды