我在工作中遇到了非常特殊的性能问题!
在我们使用的系统中,有一个表格,其中包含有关当前工作流程的信息.其中一个字段包含一个电子表格,其中包含有关该过程的元数据(不要问我为什么!!我不能改变它!)
问题是此电子表格存储在SQL Server 2005的IMAGE字段中(在具有SQL 2000兼容性的数据库集中).
这个表目前有22K +行甚至是这样的简单查询:
SELECT TOP 100 *
FROM OFFENDING_TABLE
Run Code Online (Sandbox Code Playgroud)
在查询分析器中检索数据需要30秒.
我正在考虑更新与SQL 2005的兼容性(一旦我被告知应用程序可以处理它).
我想的第二件事是将列的数据类型更改为varbinary(max)但我不知道这样做是否会影响应用程序.
我正在考虑的另一件事是使用sp_tableoption设置large value types out of row到1,因为它是目前0的,但我没有任何信息,如果这样做将提高性能.
有谁知道在这种情况下如何提高性能?
编辑澄清
我的问题是,我无法控制应用程序向SQL Server提出的问题,我对它做了一些反思(该应用程序是一个.NET 1.1网站),并且它使用了违规字段来处理一些我不知道的内部内容这是什么.
我需要提高这个表的整体性能.
好的,我必须导出REG_BINARY值并将它们存储在SQL中,稍后我需要将这些值转换为字符串..
是)我有的:
在c#中我将REG_BINARY读取为Byte []数据类型,如:
RegistryKey rk = Registry.CurrentUser.OpenSubKey ...
byte [] value = rk.GetValue("TheKey")
然后我使用以下方法将它存储到SQL VarBinary字段:
private void SqlStorePstFileInfo(List<PersonalFolderObject> listOfPstObjects, int? userComputerId)
{
using (var sqlConnection = new SqlConnection(GetConnectionString()))
{
sqlConnection.Open();
foreach (PersonalFolderObject pfo in listOfPstObjects)
{
string s = "INSERT INTO [InvPstFile] (UserComputerId, Name, Path, Size, OldRegBinary) VALUES(@UserComputerId, @Name, @Path, @Size, @OldRegBinary)";
using (SqlCommand sqlCmd = new SqlCommand(s, sqlConnection))
{
SqlParameter pUserComputerId = sqlCmd.Parameters.Add("@UserComputerId", SqlDbType.Int);
pUserComputerId.Value = userComputerId;
SqlParameter pName = sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar);
pName.Value = pfo.Name;
SqlParameter pPath = …Run Code Online (Sandbox Code Playgroud) 我有一个数据库(SQL 2008),我存储文件.这些保存为varbinary(max)类型.
现在我需要再次获取.txt文件,这样我就可以遍历文件的内容,就像我以前使用StreamReader一样.
while ((line = file.ReadLine()) != null)
{
string code = line.Substring(line.Length - 12);
}
Run Code Online (Sandbox Code Playgroud)
但是如何将varbinary byte []转换回普通的.txt文件,这样我就可以逐行浏览内容.
我发现了一些内存流或文件流的想法,但无法让它们工作.
提前致谢!
我有一些格式为 ASCII 十六进制的源数据。我需要将其放入 SQL 数据库的 VARBINARY 字段中。我已将问题减少到最低限度以说明我想做的事情。我有一个存储过程:
CREATE PROCEDURE BinaryDemo
@BinaryData varbinary(max)
AS
BEGIN
PRINT @BinaryData;
END
Run Code Online (Sandbox Code Playgroud)
我知道它“有效”,因为我可以这样做:
DECLARE @tmp varbinary(max);
SET @tmp = CONVERT(varbinary, '1234567890abcdef', 2);
EXEC BinaryDemo @BinaryData=@tmp;
Run Code Online (Sandbox Code Playgroud)
我想做的是跳过中间步骤并调用如下过程:
EXEC BinaryDemo @BinaryData=CONVERT(varbinary, '1234567890abcdef', 2);
Run Code Online (Sandbox Code Playgroud)
不幸的是,SQL 抱怨语法:关键字“CONVERT”附近的语法不正确。
我知道 CONVERT 是正确的,因为我可以:
PRINT CONVERT(varbinary, '1234567890abcdef', 2);
Run Code Online (Sandbox Code Playgroud)
我看到的正是我所期望的。由于源数据的性质和数量,第一个示例(声明/设置/执行)确实是一个糟糕的选择。
有没有办法让 varbinary 在 SQL Server 中接受文本数据?
这是我的情况。我有相当大量的 XML,我计划以“压缩”格式存储它们。(这意味着 Varbinary。)
但是,当我进行调试时,我希望能够翻转配置开关并以纯文本形式存储,以便我可以从数据库进行故障排除(即不需要客户端应用程序来解压缩)。
是否可以将普通文本插入到 varbinary(max) 中?
我正在使用以下映射将 Serializable 对象存储到 SQL Server 2008:
<class name="EMSApplication.Data.Domain.Configuration, EMSApplication.Data" table="ems_Configurations" proxy="EMSApplication.Data.Domain.IConfiguration, EMSApplication.Data" lazy="true">
<id name="Id" type="System.Int32">
<column name="Id" not-null="true"/>
<generator class="native"/>
</id>
<property name="Settings" type="Serializable">
<column name="Settings" not-null="true"/>
</property>
</class>
Run Code Online (Sandbox Code Playgroud)
它正在为数据库的列类型生成一个 varbinary(8000)。我怎样才能让它使用 varbinary(max)?
如果我使用:
<property name="Settings" type="Serializable" length="2147483647">
<column name="Settings" not-null="true"/>
</property>
Run Code Online (Sandbox Code Playgroud)
它也被截断为 8000。我使用的是 NHibernate3.2(不流畅)。
有没有function在SQL Server这样做呢?扭转sys.fn_varbintohexstr?
我有一varbinary(max)列将图像存储在 SQL 数据库中。
我正在处理一个 newdb 脚本,其中一个应用程序创建了一个新的 db 实例并填充了一些表。我正在处理的表之一是初始化该图像列。
为此,我使用 select 语句打印了列的内容,并将内容粘贴到 newdb 脚本的 insert 语句中。这最初似乎有效,但图像未正确加载。
所以我比较了DATALENTH()原始数据(5469988)和新数据(21839)的。看来 Microsoft SQL Server management Studio - 2014 切断了数据,为什么我在某个时候从原始数据库复制了它。我需要能够获得该列的全部内容。有任何想法吗?
我正在尝试将 MSSQL 数据库移植到 MariaDB,并且遇到了使用 varbinary(max) 创建表的情况:
`definition` VARBINARY(max) NULL DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)
这实际上会做什么,我可以使用 MariaDB 中的等效类型定义吗?
我正在使用以太坊api.我想将api中的信息存储到mysql表中.
地址数据如下:
0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be
0x1d80982502f3bb75654df13aa32bbd5ac9cab7d6
0xaf13bbdbe1ff53c2df7109a53c217320d2d76ee2
...
Run Code Online (Sandbox Code Playgroud)
我一直在为这些字符使用varchar列.有更好的数据类型吗?我想也许varbinary但我不知道是否有任何好处.缺点是sql代码将更加混乱,因为我将不得不使用HEX()和UNHEX().
varbinary ×10
sql-server ×4
sql ×3
c# ×2
varbinarymax ×2
.net ×1
asp.net ×1
blob ×1
encoding ×1
ethereum ×1
file ×1
function ×1
hex ×1
imagefield ×1
mariadb ×1
mysql ×1
nhibernate ×1
parameters ×1
serializable ×1
ssms ×1
t-sql ×1
text ×1
varchar ×1