Kolom Tersebar
Kolom jarang adalah kolom biasa yang memiliki penyimpanan yang dioptimalkan untuk nilai null. Kolom jarang mengurangi persyaratan ruang untuk nilai null dengan biaya lebih banyak overhead untuk mengambil nilai non-null. Pertimbangkan untuk menggunakan kolom jarang saat ruang yang disimpan setidaknya 20 persen hingga 40 persen.
SQL Server JDBC Driver 3.0 mendukung kolom jarang saat Anda tersambung ke server yang menjalankan SQL Server 2008 (10.0.x) dan versi yang lebih baru. Anda dapat menggunakan SQLServerDatabaseMetaData.getColumns, SQLServerDatabaseMetaData.getFunctionColumns, atau SQLServerDatabaseMetaData.getProcedureColumns untuk menentukan kolom mana yang jarang dan kolom mana yang merupakan kolom kumpulan kolom.
File kode untuk sampel ini bernama SparseColumns.java, dan dapat ditemukan di lokasi berikut:
\<installation directory>\sqljdbc_<version>\<language>\samples\sparse
Kumpulan kolom adalah kolom komputasi yang mengembalikan semua kolom jarang dalam formulir XML yang tidak ditata. Pertimbangkan untuk menggunakan kumpulan kolom saat jumlah kolom dalam tabel besar atau lebih besar dari 1024 atau beroperasi pada kolom jarang individual rumit. Kumpulan kolom dapat berisi hingga 30.000 kolom.
Contoh
Deskripsi
Sampel ini menunjukkan cara mendeteksi kumpulan kolom. Ini juga menunjukkan cara mengurai output XML kumpulan kolom untuk mendapatkan data dari kolom jarang.
Daftar kode adalah kode sumber Java. Sebelum Anda mengkompilasi aplikasi, ubah string koneksi.
Kode
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class SparseColumns {
public static void main(String args[]) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";
try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement()) {
createColdCallingTable(stmt);
// Determine the column set column
String columnSetColName = null;
String strCmd = "SELECT name FROM sys.columns WHERE object_id=(SELECT OBJECT_ID('ColdCalling')) AND is_column_set = 1";
try (ResultSet rs = stmt.executeQuery(strCmd)) {
if (rs.next()) {
columnSetColName = rs.getString(1);
System.out.println(columnSetColName + " is the column set column!");
}
}
strCmd = "SELECT * FROM ColdCalling";
try (ResultSet rs = stmt.executeQuery(strCmd)) {
// Iterate through the result set
ResultSetMetaData rsmd = rs.getMetaData();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
while (rs.next()) {
// Iterate through the columns
for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
String name = rsmd.getColumnName(i);
String value = rs.getString(i);
// If this is the column set column
if (name.equalsIgnoreCase(columnSetColName)) {
System.out.println(name);
// Instead of printing the raw XML, parse it
if (value != null) {
// Add artificial root node "sparse" to ensure XML is well formed
String xml = "<sparse>" + value + "</sparse>";
is.setCharacterStream(new StringReader(xml));
Document doc = db.parse(is);
// Extract the NodeList from the artificial root node that was added
NodeList list = doc.getChildNodes();
Node root = list.item(0); // This is the <sparse> node
NodeList sparseColumnList = root.getChildNodes(); // These are the xml column nodes
// Iterate through the XML document
for (int n = 0; n < sparseColumnList.getLength(); ++n) {
Node sparseColumnNode = sparseColumnList.item(n);
String columnName = sparseColumnNode.getNodeName();
// The column value is not in the sparseColumNode, it is the value of the
// first child of it
Node sparseColumnValueNode = sparseColumnNode.getFirstChild();
String columnValue = sparseColumnValueNode.getNodeValue();
System.out.println("\t" + columnName + "\t: " + columnValue);
}
}
} else { // Just print the name + value of non-sparse columns
System.out.println(name + "\t: " + value);
}
}
System.out.println();// New line between rows
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void createColdCallingTable(Statement stmt) throws SQLException {
stmt.execute("if exists (select * from sys.objects where name = 'ColdCalling')" + "drop table ColdCalling");
String sql = "CREATE TABLE ColdCalling ( ID int IDENTITY(1,1) PRIMARY KEY, [Date] date, [Time] time, PositiveFirstName nvarchar(50) SPARSE, PositiveLastName nvarchar(50) SPARSE, SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS );";
stmt.execute(sql);
sql = "INSERT ColdCalling ([Date], [Time]) VALUES ('10-13-09','07:05:24') ";
stmt.execute(sql);
sql = "INSERT ColdCalling ([Date], [Time], PositiveFirstName, PositiveLastName) VALUES ('07-20-09','05:00:24', 'AA', 'B') ";
stmt.execute(sql);
sql = "INSERT ColdCalling ([Date], [Time], PositiveFirstName, PositiveLastName) VALUES ('07-20-09','05:15:00', 'CC', 'DD') ";
stmt.execute(sql);
}
}
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk