這邊有一個完整的ms SQLserver視圖
構造完成后只有1000行左右的資料,但是查詢全部也需要1000毫秒左右,
資料的增加或修改并不頻繁,但是系統似乎也沒有把它加載成快取?
懷疑3個case出來的欄位導致查詢比較慢,但是似乎又沒有別的辦法。
不知道有無大神指點迷津
ALTER VIEW [dbo].[t_VT_SHOP] AS SELECT SHOP.id, SHOP.shopName,
SHOP.mall, mall.mallName,
SHOP.floorID, FLO.floorName,
SHOP.brandID, brand.brandName,
SHOP.bussinessTypeID, bus.typeName AS bussinessTypeName,
SHOP.shopGroupID, gro.groupName,
SHOP.createTime, SHOP.updateTime, SHOP.valid, SHOP.deleted, SHOP.createrId, SHOP.createrName,SHOP.isShowPortal,
CASE WHEN EXISTS
(SELECT TOP 1 ID
FROM [DBO].[T_SALE_REWARDCOUPON]
WHERE PUBLISHSTATUS = 1 AND VALID = 1 AND DELETED = 0
AND CHARINDEX(CONVERT(NVARCHAR(10), SHOP.ID), ISNULL(SHOPIDS, '')) > 0) THEN 1 ELSE 0 END AS IsCoupon,
CASE WHEN EXISTS
(SELECT TOP 1 ID
FROM [DBO].[t_Sale_Enroll]
WHERE PUBLISHSTATUS = 1 AND VALID = 1 AND DELETED = 0
AND CHARINDEX(CONVERT(NVARCHAR(10), SHOP.ID), ISNULL(SHOPIDS, '')) > 0) THEN 1 ELSE 0 END AS IsEnroll,
CASE WHEN EXISTS
(SELECT TOP 1 ID
FROM [DBO].[t_Sale_Promotion]
WHERE PUBLISHSTATUS = 1 AND VALID = 1 AND DELETED = 0
AND CHARINDEX(CONVERT(NVARCHAR(10),SHOP.ID), ISNULL(SHOPIDS, '')) > 0) THEN 1 ELSE 0 END AS IsPromotion
FROM dbo.t_Shop AS SHOP LEFT OUTER JOIN
(SELECT id,floorname FROM dbo.t_Mall_Floor) AS FLO ON FLO.id = SHOP.floorID LEFT OUTER JOIN
(SELECT id,brandName FROM dbo.t_Info_Brand) AS brand ON brand.id = SHOP.brandID LEFT OUTER JOIN
(SELECT id,typeName FROM dbo.t_Info_BusinessType) AS bus ON bus.id = SHOP.bussinessTypeID LEFT OUTER JOIN
(SELECT id,groupName FROM dbo.t_Shop_ShopGroup) AS gro ON gro.id = SHOP.shopGroupID LEFT OUTER JOIN
(SELECT id,mallName FROM dbo.t_Mall) AS mall ON mall.id = SHOP.mall;
uj5u.com熱心網友回復:
你看一下執行計劃,看看主要消耗在哪一塊,這樣比較好定位慢在哪里uj5u.com熱心網友回復:
第一,視圖不是物體表,不存在快取之類的說法,只有索引視圖,才可以看成一個資料表,有真實的資料集第二,三個case對應的表,表設計有問題,SHOPIDS這種設計,不符合基本的范式要求,不能做索引處理,嚴重影響關聯查詢的效率
uj5u.com熱心網友回復:
3個case對應的表都是類似于活動、推廣這樣的,每個活動都可以有多個shop參與,所以用的shopids這樣的設計。
然后這個視圖又是對shop的整體展示,連接上面3個case的目的就是為了能夠從每個參與了活動的shop頁進入到活動頁。
所以,如果想要達到我所說的這個目的,除了shopids的方案之外,就只有在dbo.t_Shop中添加欄位,新建活動的時候就update一下參加了活動的shop?
如果單純從主樓的SQL陳述句來說,是沒辦法了嗎?
uj5u.com熱心網友回復:
請問這個是怎么看的?
uj5u.com熱心網友回復:
不一定要t_Shop中增加欄位,這是基礎表,不應該記錄具體的業務資料,否則一個shop參加了多個活動,難道每來一個活動,你新加一個欄位,或者用一個欄位,又像SHOPIDS這樣來拼接呢。你可以對活動、推廣都各自增加一張和SHOP的關聯表,表結構類似于主鍵、活動ID,SHOPID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/242618.html
標籤:疑難問題
上一篇:flushall()
