0

オラクルに対して実行されているエンティティフレームワークによって生成されたクエリが遅すぎます。約4秒で実行されます。

これは私のクエリの主要部分です

var query = from x in db.BUILDINGs
                    join pro_co in db.PROFILE_COMMUNITY on x.COMMUNITY_ID equals pro_co.COMMUNITY_ID
                    join co in db.COMMUNITies on x.COMMUNITY_ID equals co.COMMUNITY_ID
                    join st in db.STATE_PROFILE on co.STATE_CD equals st.STATE_CD
                    where pro_co.PROFILE_NM == authorizedUser.ProfileName

                    select new
                    {
                        COMMUNITY_ID = x.COMMUNITY_ID,
                        COUNTY_ID = x.COUNTY_ID,
                        REALTOR_GROUP_NM = x.REALTOR_GROUP_NM,
                        BUILDING_NAME_TX = x.BUILDING_NAME_TX,
                        ACTIVE_FL = x.ACTIVE_FL,
                        CONSTR_SQFT_AVAIL_NB = x.CONSTR_SQFT_AVAIL_NB,
                        TRANS_RAIL_FL = x.TRANS_RAIL_FL,
                        LAST_UPDATED_DT = x.LAST_UPDATED_DT,
                        CREATED_DATE = x.CREATED_DATE,
                        BUILDING_ADDRESS_TX = x.BUILDING_ADDRESS_TX,
                        BUILDING_ID = x.BUILDING_ID,
                        COMMUNITY_NM = co.COMMUNITY_NM,
                        IMAGECOUNT = x.BUILDING_IMAGE2.Count(),
                        StateCode = st.STATE_NM,
                        BuildingTypeItems = x.BUILDING_TYPE_ITEM,
                        BuildingZoningItems = x.BUILDING_ZONING_ITEM,
                        BuildingSpecFeatures = x.BUILDING_SPEC_FEATURE_ITEM,
                        buildingHide = x.BUILDING_HIDE,
                        buildinghideSort = x.BUILDING_HIDE.Count(y => y.PROFILE_NM == ProfileName) > 0 ? 1 : 0,
                        BUILDING_CITY_TX = x.BUILDING_CITY_TX,
                        BUILDING_ZIP_TX = x.BUILDING_ZIP_TX,
                        LPF_GENERAL_DS = x.LPF_GENERAL_DS,
                        CONSTR_SQFT_TOTAL_NB = x.CONSTR_SQFT_TOTAL_NB,
                        CONSTR_STORIES_NB = x.CONSTR_STORIES_NB,
                        CONSTR_CEILING_CENTER_NB = x.CONSTR_CEILING_CENTER_NB,
                        CONSTR_CEILING_EAVES_NB = x.CONSTR_CEILING_EAVES_NB,
                        DESCR_EXPANDABLE_FL = x.DESCR_EXPANDABLE_FL,
                        CONSTR_MATERIAL_TYPE_TX = x.CONSTR_MATERIAL_TYPE_TX,
                        SITE_ACRES_SALE_NB = x.SITE_ACRES_SALE_NB,
                        DESCR_PREVIOUS_USE_TX = x.DESCR_PREVIOUS_USE_TX,
                        CONSTR_YEAR_BUILT_TX = x.CONSTR_YEAR_BUILT_TX,
                        DESCR_SUBDIVIDE_FL = x.DESCR_SUBDIVIDE_FL,
                        LOCATION_CITY_LIMITS_FL = x.LOCATION_CITY_LIMITS_FL,
                        TRANS_INTERSTATE_NEAREST_TX = x.TRANS_INTERSTATE_NEAREST_TX,
                        TRANS_INTERSTATE_MILES_NB = x.TRANS_INTERSTATE_MILES_NB,
                        TRANS_HIGHWAY_NAME_TX = x.TRANS_HIGHWAY_NAME_TX,
                        TRANS_HIGHWAY_MILES_NB = x.TRANS_HIGHWAY_MILES_NB,
                        TRANS_AIRPORT_COM_NAME_TX = x.TRANS_AIRPORT_COM_NAME_TX,
                        TRANS_AIRPORT_COM_MILES_NB = x.TRANS_AIRPORT_COM_MILES_NB,
                        UTIL_ELEC_SUPPLIER_TX = x.UTIL_ELEC_SUPPLIER_TX,
                        UTIL_GAS_SUPPLIER_TX = x.UTIL_GAS_SUPPLIER_TX,
                        UTIL_WATER_SUPPLIER_TX = x.UTIL_WATER_SUPPLIER_TX,
                        UTIL_SEWER_SUPPLIER_TX = x.UTIL_SEWER_SUPPLIER_TX,
                        UTIL_PHONE_SVC_PVD_TX = x.UTIL_PHONE_SVC_PVD_TX,
                        CONTACT_ORGANIZATION_TX = x.CONTACT_ORGANIZATION_TX,
                        CONTACT_PHONE_TX = x.CONTACT_PHONE_TX,
                        CONTACT_EMAIL_TX = x.CONTACT_EMAIL_TX,
                        TERMS_SALE_PRICE_TX = x.TERMS_SALE_PRICE_TX,
                        TERMS_LEASE_SQFT_NB = x.TERMS_LEASE_SQFT_NB
                    };

クエリの動的なwhere句とsort句に取り組むコードのセクションがありますが、それらは省略しました。クエリは、どこに何があり、ソートされていても、実行に約4秒かかります。

生成されたSQLをOracleにドロップしましたが、説明プランには、私を修正するための叫び声が何も表示されていませんでした。費用は1554です

これが許可されない場合は、お詫び申し上げますが、この情報を共有するための良い方法を見つけることができないようです。SQL Developerによって生成されたExplainPlanをここにアップロードしました:http ://www.123server.org/files/explainPlanzip-e1d291efcd.html

テーブルレイアウト

Building
--------------------
- BuildingID
- CommunityId
- Lots of other columns

Profile_Community
-----------------------
- CommunityId
- ProfileNM
- lots of other columns

state_profile
---------------------
- StateCD
- ProfileNm
- lots of other columns

Profile
---------------------
- Profile-NM
- a few other columns

列が割り当てられているすべてのテーブルには、それぞれ120〜150列があります。エンティティは、必要な列だけでなく、すべてのテーブルからすべての列をプルするselectステートメントを生成しているようです。

私を悩ませているのは、私の問題かもしれないと思うのは、LINQで50個のアイテムを選択したのに、生成されたSQLが677列を返していることです。非常に多くの列を返すことが、おそらく私の遅さの原因だと思います。

SQLで非常に多くの列が返される理由や、クエリを高速化する方法について何か考えはありますか?

4

2 に答える 2

0

結局、ビューを作成し、ビューに必要な列のみを選択させ、linqで左結合する必要があるものに結合することになりました。

EFが、結合しようとしているすべてのテーブルからすべての列を選択するのはかなり面倒です。しかし、150以上の列を含む一連のテーブルを結合しているため、これに気付いただけだと思います。

于 2012-09-20T19:35:10.993 に答える
0

オブジェクトの作成によってパフォーマンスの一部が影響を受けているのではないかと疑っています。基本的な「select x」だけを使用せずにクエリを実行してみて、SQL クエリに時間がかかっているのか、それともオブジェクトの作成に時間がかかっているのかを確認してください。

また、生成されるクエリが複雑すぎる場合は、一度にすべてをクエリしようとするのではなく、オブジェクトを徐々に充実させる小さなサブクエリに分割してみることができます。

于 2012-09-18T21:42:50.967 に答える