首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么提高 nvarchar(max) 列的join效率

2013-11-15 
如何提高 nvarchar(max) 列的join效率本帖最后由 yangsnow_rain_wind 于 2013-11-12 13:51:22 编辑IF OBJE

如何提高 nvarchar(max) 列的join效率
本帖最后由 yangsnow_rain_wind 于 2013-11-12 13:51:22 编辑


IF OBJECT_ID (N'StormyWeather', N'U') IS NOT NULL
DROP TABLE StormyWeather
GO
CREATE TABLE StormyWeather (
  StormID INT NOT NULL IDENTITY,
  StormHead NVARCHAR(50) NOT NULL,
  StormBody NVARCHAR(MAX) NOT NULL,  
)
GO

INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormy Weather Delays Travel',
  'The stormy weather made travel by motor vehicle difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormier Weather on Monday',
  'The stormier weather on Monday made vehicle travel difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormiest Weather in December',
  'December can be the stormiest month, making automobile travel difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storm Grows Strong',
  'The storm is growing strong.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storms Crossing the Pacific',
  'The storms are lining up across the Pacific Ocean.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storm''s Wind Delays Travel',
  'The storm''s wind made car travel difficult on Tuesday.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storms'' Flooding Delays Travel',
  'The storms'' flooding made auto travel difficult throughout December.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Children Run from Room',
  'The children often storm out of the room when upset.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Boy Runs from Room',
  'The boy storms out of the room when his sister changes the channel.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Girl Ran from Room',
  'The girl stormed out of the room when her brother ate the cookie.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Children Running from Room',
  'The children were storming out of the room when the lights went out.')
GO

create table #1 (
  StormID INT NOT NULL IDENTITY,
  StormHead NVARCHAR(50) NOT NULL,
  StormBody NVARCHAR(MAX) NOT NULL,  
)
go 
INSERT INTO #1 (StormHead, StormBody)
VALUES('Boy Runs from Room',
  'The boy storms out of the room when his sister changes the channel.')
INSERT INTO #1 (StormHead, StormBody)
VALUES('Girl Ran from Room',
  'The girl stormed out of the room when her brother ate the cookie.')
INSERT INTO #1 (StormHead, StormBody)
VALUES('Children Running from Room',
  'The children were storming out of the room when the lights went out.')

我的问题是如何提高如下链接的join顺序
select * from  StormyWeather a join #1 b on a.StormBody = b.StormBody

需要补充的是
1. nvarchar(max)类型上 没办法加索引,
2.使用全文索引的话,好像没法支持 join操作
3.数据量是千万级或更高,单个表的大小目前大约10G,
4.这个查询只是个例子,用的最多的是在存储过程中,往表中插入此表没有的数据,其中判断条件中有这种大的列。


多谢多谢。。。



性能优化
[解决办法]
那么长的类型还要关联,貌似不合理吧?
[解决办法]
引用:
Quote: 引用:

那么长的类型还要关联,貌似不合理吧?


其实这个字段存的是一个文件路径,类似如下
\\FT\SCS\SKY\W6M1\Localization\6419.0107\int\5001\prs-AF\IE90\Photos_QuotaFull-ManageStorage.jpg
\\FT\EP\CMX\W5M4\Localizability\17.0.1541.0607\bvt\5005\en-us\IE90\SM_SLCMainViewNoData.jpg
\\FT\DRX\SkyDriveClient\W6M1\Localization\2013.05.03\INT\3037.0503\mi-nz\Selective_Sync_Error_From_FRE_Unprovisioned.cap
\\FT\WC\Hotmail\W6M2\Localization\17.2.6710.1000\INT\ti-ET\WC_Hotmail_MaxRecipientsScreenCapture.cap


\\FT\EP\CMX\W5M4\Localizability\17.0.1546.0612\bvt\5005\kok-IN\IE90\SM_SLCMainView_W6_M2_IR02_NewStrings.jpg
\\FT\SCS\SKY\W6M2\Localization\6711.1002\int\5001\chr-Cher-US\IE100\FileCloud_RearrangeModeMultiSelect.cap
\\FT\EP\CMX\W5M4\Localizability\17.0.1533.0603\bvt\5005\ta-IN\IE90\SM_SLCMainViewNoData.jpg
\\FT\SCS\SKY\W6M2\Localization\6711.1008\int\5001\bn-BD\IE100\DeviceCloud_QuotaFull-SetView.cap
\\FT\SCS\SKY\W6M2\Localization\6611.1008\int\5001\fil-PH\IE100\FileCloud_PanoramaFolderThumbnail.cap
\\FT\DRX\SkyDriveClient\W6M1\Localization\2013.08.16\INT\3145.0816\ml-in\DRX_SkyDrive_TaskDialog_ProcessRunningInElevatedMode.cap

当需要再往此表中添加数据时要判断是否此图片已经存在。
数据库设计可能有些问题,但我现在没办法修改。看有没有好的解决方案。



能不能修改一下,改为比如,nvarchar(1000),因为如果是存储文件路径,应该不需要占用那么多的字节的把

[解决办法]
为什么不针对StormBody
设计个int的键值的
其实你已经有了StormID
只是两个表都设置成了自增 可以考虑将子表的StormID改成非自增 与主表保持一致
用StormID作关联


[解决办法]
引用:
Quote: 引用:

为什么不针对StormBody
设计个int的键值的
其实你已经有了StormID
只是两个表都设置成了自增 可以考虑将子表的StormID改成非自增 与主表保持一致
用StormID作关联

上面我建的两个表只是个例子,实际我们这个系统比较复杂,要操作的表没有主键,每一个instance都有好多不同版本的图,也就是有好多path,所以需要用path做关联。
这种数据库设计肯定不太理想,不过要改变表结构可能影响太大,所以现在的看有没有补救措施,当然加上类似MD5列做标示也是种可行方法。问题看有没有更好的方法,所以来征求各位大牛的意见。。。。
thanks very much.


通过checksum函数,得出一个值:


IF OBJECT_ID (N'StormyWeather', N'U') IS NOT NULL
DROP TABLE StormyWeather
GO

CREATE TABLE StormyWeather (
  StormID INT NOT NULL IDENTITY,
  StormHead NVARCHAR(50) NOT NULL,
  StormBody NVARCHAR(MAX) NOT NULL,  
)
GO

INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormy Weather Delays Travel',
  'The stormy weather made travel by motor vehicle difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormier Weather on Monday',
  'The stormier weather on Monday made vehicle travel difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Stormiest Weather in December',
  'December can be the stormiest month, making automobile travel difficult.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storm Grows Strong',
  'The storm is growing strong.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storms Crossing the Pacific',
  'The storms are lining up across the Pacific Ocean.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storm''s Wind Delays Travel',
  'The storm''s wind made car travel difficult on Tuesday.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Storms'' Flooding Delays Travel',
  'The storms'' flooding made auto travel difficult throughout December.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Children Run from Room',
  'The children often storm out of the room when upset.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Boy Runs from Room',
  'The boy storms out of the room when his sister changes the channel.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Girl Ran from Room',
  'The girl stormed out of the room when her brother ate the cookie.')
INSERT INTO StormyWeather (StormHead, StormBody)
VALUES('Children Running from Room',
  'The children were storming out of the room when the lights went out.')
GO

create table #1 (
  StormID INT NOT NULL IDENTITY,
  StormHead NVARCHAR(50) NOT NULL,
  StormBody NVARCHAR(MAX) NOT NULL,  
)
go 
INSERT INTO #1 (StormHead, StormBody)
VALUES('Boy Runs from Room',
  'The boy storms out of the room when his sister changes the channel.')
INSERT INTO #1 (StormHead, StormBody)
VALUES('Girl Ran from Room',
  'The girl stormed out of the room when her brother ate the cookie.')
INSERT INTO #1 (StormHead, StormBody)
VALUES('Children Running from Room',
  'The children were storming out of the room when the lights went out.')
go


--用checksum计算一个值
select CHECKSUM(StormBody)
from StormyWeather


/*
(无列名)
318284405
-1996609556
-957497181
942488834
-1966874030
1290197037
613467569
706926295
-1408726896
1805667295
136736880
*/


[解决办法]
一定要用千万级的表来做关联?
有没有办法先降数据量,再做关联?

热点排行