编辑 - 要明确我将把目标句放在顶部.测试和我的问题是,是否有一种方法可以在不使用临时表的情况下获得与临时表相同的性能.
我觉得这应该是一个简单的问题,但我被困住了.我正在SQL2014中尝试使用FileTables.我知道一些替代方案可以很好地工作,但目标是建立从文件表中提取文本子串的可行性.
该测试具有35,000个文本文件,其中一行文本如下,每个文件具有平均100字节的非unicode文本.
Aaa|Bbb|Ccc|Ddd|Eee|Fff|Ggg
Run Code Online (Sandbox Code Playgroud)
对于每个文件,所需的输出是一行,而分隔的字符串要分成七列.
我找到了一个快速的字符串解析器函数,但与varchar列相比,在文件流上运行会产生显着的性能影响.
此查询需要18秒才能运行.我试图从filestream转换到varchar只执行一次,但我认为调用UDF可能导致它发生在每一行(文件).
Create View vAddresses As
Select file_type, Convert(Varchar(8000),file_stream) TextData /* Into #Temp */ From InputFiles Where file_type = 'adr'
Go
Select --TextData,
dbo.udf_StringSplit(TextData, 1, '|'), dbo.udf_StringSplit(TextData, 2, '|'), dbo.udf_StringSplit(TextData, 3, '|'),
dbo.udf_StringSplit(TextData, 4, '|'), dbo.udf_StringSplit(TextData, 5, '|'), dbo.udf_StringSplit(TextData, 6, '|'),
dbo.udf_StringSplit(TextData, 7, '|')--, TextData
From vAddresses
Run Code Online (Sandbox Code Playgroud)
我已经尝试过它作为一个视图,一个cte和一个子查询.唯一似乎有帮助的是创建临时表.创建临时表需要1秒钟,查询需要一秒钟.因此对于35k行2秒总查询时间与18秒.
Drop Table #Temp
(Select file_type, Convert(Varchar(8000),file_stream) TextData Into #Temp From HumanaInputFiles Where file_type = 'adr')
Select --TextData,
dbo.udf_StringSplit(TextData, 1, '|'), dbo.udf_StringSplit(TextData, 2, '|'), dbo.udf_StringSplit(TextData, 3, …
Run Code Online (Sandbox Code Playgroud) 我对Unix系统文件表感到困惑.
当两个或多个进程打开文件进行读取时,系统文件表是否为每个进程或单个条目创建单独的条目?
如果为打开同一文件的多个进程创建单个条目,它们的文件偏移量是否也相同?
如果process 1
打开file1.txt
以进行读取并process 2
打开相同的文件file1.txt
进行写入,系统文件表是否会创建一个或两个条目?
我正在尝试按照以下方式做一些事情,但无法找到它记录:
这就是我的想法:
+--------------------+
| Queue for Requests |
| For File Packages |
+---------+----------+
|
|
+----------v-----------+
|Worker Role |
|Grabs Files to Package|
+-----------+----------+
|
|
+--------v-------+ +--------------+
|SQL Azure |<----------+|Web Site |
|Using FileTable | |Saves to Azure|
+----------------+ +--------------+
+
|
|
v
+--------------------------+
|RAID 0 Striping -- 500 GB |
|------------+-------------|
| | |
| 250 GB | 250 GB |
| Disk 1 | Disk 2 |
+------------+-------------+
Run Code Online (Sandbox Code Playgroud)
以前,我曾要求如何在FileTable
不使用File I/O API 的情况下在a中创建目录.我现在想要创建一个我刚刚创建的父目录的子目录.如何在插入期间指定我的父母?它似乎parent_path_locator
是一个计算列.
这创造了我的父母......
INSERT INTO FileTable0 (name,is_directory,is_archive) VALUES ('Directory', 1, 0);
Run Code Online (Sandbox Code Playgroud)
如何在FileTable中为此父目录创建子目录?
我想将图像存储在SQL数据库中.图像的大小在50kb到1mb之间.我正在阅读有关FileStream和FileTable但我不知道选择哪个.每行将有2个图像和一些其他字段.
图像永远不会被更新/删除,每天将插入大约3000行.
在这种情况下推荐哪个?
我正在构建一个需要通过文件共享将文件保存到文件表的应用程序.我已经设法让它工作,但我很好奇所需的解决方案.
就我而言,我使用的是部分包含的数据库(具有本地用户),我认为我可以简单地创建一个基于现有ASP.NET标识的新用户,并为其授予一些权限.
我的第一次尝试看起来像这样:
use [clip]
go
create user [IIS APPPool\Test]
GRANT INSERT on object::ImagensEditor TO [IIS APPPOOL\Test]
GRANT SELECT on object::ImagensEditor TO [IIS APPPOOL\Test]
GRANT UPDATE on object::ImagensEditor TO [IIS APPPOOL\Test]
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,我一直得到"着名的"访问被拒绝错误(UnauthorizedAccessException:拒绝访问[路径]).我成功实现工作的唯一方法是为我网站的应用池创建全局SQL Server登录.换句话说,我不得不用这样的东西替换创建用户:
use master
go
CREATE login [IIS APPPOOL\Test] from windows with default_database=[clip]
GO
use [clip]
CREATE user [IIS APPPOOL\clipfrontoffice] for login [IIS APPPOOL\Test]
go
Run Code Online (Sandbox Code Playgroud)
然后一切都开始工作(没有更多的访问被拒绝错误).
现在,我还没有发现任何文档提到我不能使用基于Windows帐户/身份的包含用户来处理这种情况.
那么,我做错了什么?或者在这种情况下,我们真的需要创建全局登录吗?
谢谢
路易斯
我试图通过存储过程在SQL Server FileTable中创建目录,我调用以下代码:
INSERT INTO tblMyFiles (name, is_directory, is_archive)
VALUES ('foldername', 1, 0);
Run Code Online (Sandbox Code Playgroud)
调用此代码后,如果我在SQL Server Management Studio中选择行,但是如果通过Windows资源管理器浏览到文件表目录,我可以看到文件表中的行,我看不到新创建的目录.如果我刷新Windows资源管理器,则该目录仍然不会显示.如果我在资源管理器的文件表目录中创建一个文件,它似乎唤醒了资源管理器,然后出现通过存储过程创建的所有目录.
我在同一个SQL框和另一个数据库上运行它时没有遇到这个问题,我已经比较了所有的属性,它们看起来完全相同,但我必须遗漏一些东西,不知道是什么?任何帮助将非常感激.提前致谢
我正在寻找使用文件表而不是简单地将文件存储为数据库中的二进制数据,或者在数据库中存储包含文件共享的URL的列.我们的应用程序使用实体框架,所以这是我看到的一个小问题,但可以很容易地解决这个问题.另一个是,据我所知,文件必须与文件夹路径中的数据库存储在同一服务器上,例如"MachineName\InstanceName\FileShare"(这可以配置为使文件夹可以存在于另一台服务器上吗? ).
使用FileTables还有其他缺点吗?
成功创建FileTable后,我尝试查看文件共享但我的权限被拒绝.在Management Studio中,右键单击FileTable,然后"Explore FilteTable Directory"给出以下错误消息:
无法打开文件位置.未启用访问权限或您没有权限.
如果我尝试使用\ mycomputer\sqlexpress手动到达共享...,我仍然被拒绝访问.
这是在我的本地计算机上运行的SQL Express.我正在从同一台机器上访问此共享.我错过了什么?
我有一个现有的 ASP.Net Core 2.0 项目,它使用 Entity Framework Core 和 SQL Server 2012 数据库。
需要添加一个表单,允许用户在创建新项目时上传文档,我最初的想法是为此目的使用 SQL Servers FileTable,尽管 Entity Framework Core 似乎不支持。
文章https://damienbod.com/2015/12/05/asp-net-5-mvc-6-file-upload-with-ms-sql-server-filetable/提出了一个关于如何使用 FileTable 的解决方案ASP.Net Core 2.0 使用由 FileTable 创建的文件夹,但它实际上并未将数据库中的 FileTable 表用于元数据或外键约束等。
与其他方法相比,以这种方式部分使用 FileTable 有什么好处,无论它们是什么?有没有其他方法可以充分利用 FileTable 和 Entity Framework?
filetable ×10
sql-server ×6
filestream ×2
asp.net-mvc ×1
azure ×1
explorer ×1
sql ×1
system ×1
t-sql ×1
unix ×1